Results 1 to 7 of 7

Thread: Interbase: Tabelnaam als variabele in een select statement gebruiken

  1. #1
    PietZa.Create PietZa's Avatar
    Join Date
    Jan 2003
    Location
    Nieuwegein
    Posts
    395

    Interbase: Tabelnaam als variabele in een select statement gebruiken

    De situatie is als volgt.
    Ik ben met Interbase een stored procedure aan het maken waarin ik op een gegeven moment een variabele genaamd TABLENAME heb. Deze variabele is een varchar(255).
    Wat ik nu wil is een SELECT statement uitvoeren op de tabel die staat in de variabele TABLENAME.

    Kortom simpel uitgelegd is wat ik wil iets wat hierop lijkt:
    Code:
    CREATE PROCEDURE "MijnProcedure"
    AS
    DECLARE VARIABELE TableName VARCHAR(255);
    BEGIN
      TableName = 'MijnTabel';
      SELECT * FROM :TableName
    END
    
    Waarbij dus uiteindelijk een select word gedaan op MijnTabel.

    Weet iemand of dit mogelijk is bij Interbase?

  2. #2
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    In alle databaseservers, die ik ken, kan je alleen parameters gebuiken als waarden voor je velden. Dit zorgt dat je met een enkele query heel veel dingen kan regelen. Daar valt tabelnamen en veldnamen niet onder.
    Wat ik wel weet is dat je een paramout kan meegeven voor input van je query op de server. De server zal het dan zien als een variable. Waarschijnlijk vertaald de querymanager de paramout dan naar de tabel, waar jij je gegevens van wilt hebben.
    Ik heb (helaas) geen voorbeeld voor je.

    Maar misschien is dit iets voor je
    Delphi is great. Lazarus is more powerfull

  3. #3
    Zoiets lukt niet als telkens je QUERY een ander execution plan heeft. Wat is juist het doel van deze vraag? Misschien is er een andere oplossing.
    De verbazing begint waar de kennis ophoudt

  4. #4
    PietZa.Create PietZa's Avatar
    Join Date
    Jan 2003
    Location
    Nieuwegein
    Posts
    395
    Ik wil een stored procedure maken die onder andere aan de hand van een tabelnaam die ik de stored procedure meegeef, de hoogste Primary Key van die tabel kan ophalen.

    Ik heb ooit iets dergelijks met SQL Server voor elkaar gekregen door informatie uit de systeem tabellen te halen, maar bij Interbase krijg ik het niet voor elkaar. Helaas heb ik de SQL Server variant niet bij de hand.

  5. #5
    Waarom wil je die weten?

    De hoogste Primary Key opvragen ruikt naar het zelf handmatig genereren van een nieuwe Primary Key. Dit kun je op een veilige manier regelen middels een Generator in Interbase welke gewoon het volgende nummertje geeft wat je als Primary Key gaat gebruiken bij een Insert (middels Trigger).
    De beste manier om te leren is door fouten te maken.
    80 procent van alle leugens die jij en ik vertellen blijft onopgemerkt

  6. #6
    PietZa.Create PietZa's Avatar
    Join Date
    Jan 2003
    Location
    Nieuwegein
    Posts
    395
    De trigger kan ik niet gebruiken, omdat ik de key direct bij berekenen van de key in mijn programma nodig heb. Bij een trigger krijg ik de berekende key niet terug, dus daarom gebruik ik een stored procedure.

    Nu zou ik dan alsnog een generator kunnen gebruiken, maar wat als de generator waarde momenteel lager staat dan de hoogste key? Ook kun je binnen een stored procedure de generator waarde niet corrigeren.

    Ik heb een simpele oplossing bedacht waarbij ik een KeyTabel heb met twee velden: TableName en MaxKeyID. Hierin word steeds per tabel onthouden wat de laatst uitgegeven key is. In mijn stored procedure vraag ik dan van zowel mijn eigen KeyTabel als van de tabel zelf de laatste ID op. De hoogste van die twee plus 1 wordt de nieuwe key en wordt direct weggeschreven in mijn eigen key tabel.

    Het enige wat dus nu nog niet lukt is om de variabele TABLENAME te gebruiken om ook daadwerkelijk een select op die exacte tabel te doen.

  7. #7
    In plaats van het aanmaken van de primary key in een trigger kun je in de (delphi) code ook gewoon de volgende waarde van de generator aanvragen:

    Code:
      with TIBSQL.Create(nil) do
      try
        Database := FDatabase;
        Transaction := Trs;
        SQL.Clear;
        SQL.Add('SELECT GEN_ID(' + FGeneratorName + ', 1) FROM rdb$database');
        ExecQuery;
        if Eof then
          raise Exception.Create('ErrorRetrievingNewPrimaryKey')
        else
          FPrimaryKey := FieldByName('GEN_ID').AsInteger;
      finally
        if Open then Close;
        Free;
      end;

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Tags for this Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •