Announcement

Collapse
No announcement yet.

Generatoren dynamisch ansprechen

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

  • Generatoren dynamisch ansprechen

    Hallo,

    ich wollte fragen ob jemand eine Möglichkeit kennt Generatoren in Procedures dynamisch über den Namen als VarChar Parameter anzusprechen!?

  • #2
    Wie meinst du das? du willst deren Namen als Parameter setzen? das geht nicht.

    Comment


    • #3
      Das optimum wäre in einer schleife die generatoren z.b durchzugehen
      Code:
      SELECT RDB$GENERATOR_NAME
        FROM RDB$GENERATORS A WHERE RDB$GENERATOR_NAME like 'GEN_%'
      und sich über die Namen die aktuellen Werte zu holen

      Comment


      • #4
        CREATE PROCEDURE GENVALS
        RETURNS (
        NM VARCHAR(200),
        val bigint
        )
        AS
        declare variable SQL VARCHAR(200);
        BEGIN
        FOR
        select RDB$GENERATOR_NAME nm from rdb$generators
        where rdb$generators.rdb$system_flag=0
        INTO :NM
        DO
        BEGIN
        SQL='SELECT GEN_ID('||:NM||',0) from rdb$database';
        execute statement :sql into :val;
        SUSPEND;
        END
        END

        Holger

        im codecamp auf www.firebird-conference.com gibt es noch mehr tricks :-)

        Comment


        • #5
          sieht gut aus, vielen Dank

          Comment


          • #6
            Habe das ganze jetzt mal jetzt entsprechend eingebaut aber wenn ich das
            SQLMAX aufrufe bekomme ich die meldung unexpected end of command !?
            Code:
            BEGIN
            FOR
            select RDB$GENERATOR_NAME nm from rdb$generators
            where rdb$generators.rdb$system_flag=0
            INTO :NM
            DO
            BEGIN
              pat = '';
              len = 0;
              NM =  trim(NM);
              WHILE (NOT :NM LIKE pat) DO BEGIN
                pat = pat || '_';
                len = len + 1;
                 END
            len = (len-7)  ;
            TABLENAME = substring(:NM from 5 for len  );
            TABLENAME = trim(TABLENAME);
            
            SQLMAX = 'SELECT max(id) as idcount from "'||:TABLENAME||'";';
            for execute statement :SQLMAX  into :IDCOUNT
            DO BEGIN
            SUSPEND;
            END
            
            
            SQLSET='SET GENERATOR '||:NM||' to '||:IDCOUNT;
            execute statement :SQLSET;
            SUSPEND;
            END
            
            END

            Comment


            • #7
              ich vermute mal das in deiner längenermittlung was nicht passt, kann man ggf mit dem ibexpert procedure debugger recht einfach finden. folgende prozedur lief bei mir problemlos (auch wenn die tabellennamen dabei eben immer genau 6 zeichen hatten, aber mit einer udf kann man auch schnell andere stringlänge ermitteln)

              CREATE PROCEDURE GENVALS2
              RETURNS (
              NM VARCHAR(200),
              sqlmax varchar(1000),
              sqlset varchar(1000))
              AS
              declare variable tablename varchar(100);
              declare variable len integer;
              declare variable idcount integer;
              BEGIN
              FOR
              select RDB$GENERATOR_NAME nm from rdb$generators
              where rdb$generators.rdb$system_flag=0
              INTO :NM
              DO
              BEGIN
              len=6; --length(:nm)-7;
              TABLENAME = substring(:NM from 5 for len );
              SQLMAX = 'SELECT max(id) as idcount from "'||:TABLENAME||'";';
              execute statement :SQLMAX into :IDCOUNT;
              SQLSET='SET GENERATOR '||:NM||' to '||:IDCOUNT;
              execute statement :SQLSET;
              SUSPEND;
              END

              END

              Comment


              • #8
                es läuft zwar durch nur die Variable idcount bekommt keinen Wert zugewiesen. Setze ich das ganze in for --- begin ... end kommt folgender Fehler:
                Invalid token.
                Dynamic SQL Error.
                SQL error code = -104.
                Unexpected end of command - line 2, column 148.

                Es scheint als würde der String anders behandelt werden als man sich das so gedacht hätte. Mittlerweile vermute ich sogar das es gar nicht möglich ist string Variablen mit execute auszuführen.

                Comment


                • #9
                  Zeig mal den Code inkl. deinen Änderungen

                  Comment


                  • #10
                    Code:
                    BEGIN
                    FOR
                    select RDB$GENERATOR_NAME nm from rdb$generators
                    where rdb$generators.rdb$system_flag=0
                    INTO :NM
                    DO
                    BEGIN
                    NM =  trim(NM);
                    
                    
                    SQLMAX = 'SELECT max(id) as idcount from CUSTOMERS;';
                    for execute statement :SQLMAX  into :IDCOUNT
                    DO BEGIN
                      IDCOUNT = IDCOUNT +1;
                    END
                    
                    
                    SQLSET='SET GENERATOR '||:NM||' to '||:IDCOUNT;
                    execute statement :SQLSET;
                    SUSPEND;
                    END
                    
                    END

                    Comment


                    • #11
                      Code:
                      BEGIN
                        FOR select RDB$GENERATOR_NAME nm from rdb$generators where rdb$generators.rdb$system_flag=0 INTO :NM
                        DO BEGIN
                          NM =  trim(:NM);
                      
                          SELECT max(id) as idcount from CUSTOMERS; into :IDCOUNT;
                      
                          IDCOUNT = :IDCOUNT +1;
                      
                          SQLSET='SET GENERATOR '||:NM||' to '||:IDCOUNT;
                          execute statement :SQLSET;
                          SUSPEND;
                        END
                      
                      END

                      Comment


                      • #12
                        ok aber wie bekomme ich jetzt den Tabellennamen da dynamisch rein ? Sonst muss ich ja für jeden Generator ein Select Statement dort fest anlegen !?

                        Comment

                        Working...
                        X