Announcement

Collapse
No announcement yet.

Fragen zu SQL-Script

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Fragen zu SQL-Script

    Hallo,

    Ich finde keine Lösung zu folgenden Problemstellungen:

    a) Es existieren mehr als 60 Tabellen (Interbase 5.6).<br>
    Ich möchte eine einzige Stored Procedure machen, welche die Anzahl der Datensätze in der aufgerufenen Tabelle zurückgibt.

    CREATE PROCEDURE GetAnzRecs( TableName CHAR(32))<br>
    RETURNS (Anzahl INTEGER)<br>
    AS<br>
    BEGIN<br>
    SELECT COUNT(FirstAnlage)<br>
    FROM TabVO /* Tabelle muss fix angegeben werden */<br>
    INTO :Anzahl;<br>
    SUSPEND;<br>
    END ^

    Ich finde keine Möglichkeit den Tabellennamen der Stored Procedure als Parameter zu übergeben, so dass die Datensätze einer beliebigen Tabelle ausgelesen werden können.

    Eine Angabe ... FROM :TableName ... ist nicht möglich.<br>
    Das Token : ist nach FROM anscheinend nicht zulässig.

    Ich stelle mir vor, weil der Tabellenname fix in die Datenbank hineinkompiliert wird ?

    b) Ich möchte diese und ähnliche Proceduren nicht als SQL-Script, sondern mittels einer TQuery und ExecSQL in Delphi-Pascal in der Datenbank anlegen.

    Die Datenbank meldet jedoch einen Fehler bei SET TERM ^; wobei das Token TERM nicht erkannt wird.

    Ohne die Angabe von SET TERM ist jedoch keine Anlage möglich, da im Text mehrere Zeilenbegrenzer ; vorkommen.

    Gruss<br>Helmut

  • #2
    Hallo Helmut,

    zu Punkt a) ist definitiv nicht möglich

    zu Punkt b) mit der TQuery-Komponente können keine Scripte ausgeführt werden. Wenn Du mit der Query eine Procedure erstellen möchtest, so ist das nur sehr eingeschränkt möglich. Es steht nicht der vollständige Sprachumfang der DDL (Data Definition Language) zur Verfügung (TQuery ist nur für DML (Data Manipulation Language) vorgesehen).

    Tschüß

    Torsten

    PS: Andreas Kosch hat vor kurzen etwas von einer Freeware-Komponente SQLScript (oder so ähnlich) erwähnt. Bei den IBO-Komponenten gibt es für DDL und Scripte spezielle Komponenten.

    Comment


    • #3
      Gefundene Lösung zu Punkt a)

      Die Anzahl der Datensätze werden mit einer Liveabfrage mittels TQUERY und TDATASOURCE erledigt.

      <pre>

      Function GetAnzRecs( TabName:String ) : Integer; // Holt Anzahl Datensätze in Datei
      const FeldName = 'AnzRecs';
      begin
      with DMA_ALLG.QUERY2 do
      begin
      Close;
      SQL.Clear;
      // Abfrage eines Feldes in Datenbank, hier "FirstAnlage"
      SQL.Add('SELECT COUNT(FirstAnlage) AS '+FeldName+' ');
      SQL.Add('FROM '+TabName );
      Open;
      end;

      //------ Ergebnis der Abfrage auswerten -------

      // wurde von QUERY2 gefüllt
      with DMA_ALLG.DATASOURCE2.DataSet do
      begin
      FIRST; // Positioniere auf 1.Datensatz

      Result := FieldByName( FeldName ).AsInteger;
      end;
      end;

      </pre&gt

      Comment

      Working...
      X