[NEWSboard IBMi Forum]

Thema: SQL UDF

Hybrid View

  1. #1
    Registriert seit
    Jan 2001
    Beiträge
    850

    SQL UDF

    Hallo zusammen,

    ich möchte aus einer Tabelle die letzte höchste Nummer
    ermitteln. Dazu soll eine SQL Function dienen.

    Hier die Function:
    PHP-Code:
    CREATE FUNCTION MK/NNR (         
     
    AEMAIL   CHAR(70) ,             
     
    AYEAR    CHAR() )             
     
    RETURNS  dec (10)           
     
    LANGUAGE SQL                    
                                     
     NOT DETERMINISTIC               
     READS SQL DATA                  
     CALLED ON NULL INPUT            
     SET OPTION  ALWBLK 
    = *ALLREAD 
     
    ALWCPYDTA = *OPTIMIZE ,         
     
    COMMIT = *NONE ,                
     
    CLOSQLCSR = *ENDMOD ,           
     
    DFTRDBCOL = *NONE ,             
     
    DLYPRP = *NO ,                  
     
    DYNDFTCOL = *NO ,               
    DYNUSRPRF = *USER ,                                
    RDBCNNMTH = *RUW ,                                 
    SRTSEQ = *HEX                                      
    BEGIN                                              
    DECLARE aReturn DEC 100);                      
                                                       
       CASE                                            
         
    WHEN (                                        
                ( 
    SELECT COUNT ( * ) FROM APPCLHP      
                  whERE H_CARDEML 
    AEMAIL             
                  
    AND   H_CARDYY  AYEAR ) > )      
                  
    THEN                                 
                  SET ARETURN 
    =                        
                      
    SELECT  max(H_CARDNR)  +1        
                      From    appclhp                  
                      WHERE   H_CARDYY  
    AYEAR        
                      
    and     H_CARDEML AEMAIL    ;  
         
    WHEN (                                      
                ( 
    SELECT COUNT ( * ) FROM APPCLHP    
                  whERE H_CARDEML 
    AEMAIL           
                  
    AND   H_CARDYY  AYEAR ) = )    
                  
    THEN                               
                  SET ARETURN 
    1;                   
                                                     
       
    END CASE ;                                    
     RETURN 
    ARETURN ;                                
     
    END  
    Die Keyfelder sind
    PHP-Code:
    H_CARDEML
    H_CARDYY 
    und werden als Parameter übergeben.

    Leider schaffe ich es von der Syntax nicht
    das ich die SQL Function erstellen kann.

    Hat jemand eine Idee ?

  2. #2
    Registriert seit
    Jan 2001
    Beiträge
    340
    a) irgendwelche Fehlermeldungen?

    b) warum nicht sowas wie:
    PHP-Code:
    SET ARETURN =                        
                      
    SELECT  coalesce(max(H_CARDNR), 0)  +1        
                      From    appclhp                  
                      WHERE   H_CARDYY  
    AYEAR        
                      
    and     H_CARDEML AEMAIL 

  3. #3
    Registriert seit
    Mar 2002
    Beiträge
    5.365
    ... der Wert ist dann ein Schätzwert, der bis zumnächsten Insert gilt (commit=none) und mit ausreichendem Commit level sperrt das Teil die ganze Table. Besser ist da schon eine Key Table oder auto Increment Felder...

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  4. #4
    Registriert seit
    Jan 2001
    Beiträge
    850
    Hallo,

    habe deinen Vorschlag mal umgesetzt:
    PHP-Code:
    CREATE FUNCTION MK/NNR (         
     
    AEMAIL   CHAR(70) ,             
     
    AYEAR    CHAR() )             
     
    RETURNS  dec (10)           
     
    LANGUAGE SQL                    
                                     
     NOT DETERMINISTIC               
     READS SQL DATA                  
     CALLED ON NULL INPUT            
     SET OPTION  ALWBLK 
    = *ALLREAD 
     
    ALWCPYDTA = *OPTIMIZE ,         
     
    COMMIT = *NONE ,                
     
    CLOSQLCSR = *ENDMOD ,           
     
    DFTRDBCOL = *NONE ,             
     
    DLYPRP = *NO ,                  
     
    DYNDFTCOL = *NO ,               
    DYNUSRPRF = *USER ,                                        
    RDBCNNMTH = *RUW ,                                         
    SRTSEQ = *HEX                                              
    BEGIN                                                      
    DECLARE aReturn DEC 100);                              
       
    SET ARETURN =                                           
                         
    SELECT  coalesce(max(H_CARDNR), 0)  +1
                         From    appclhp                       
                         WHERE   H_CARDYY  
    AYEAR             
                         
    and     H_CARDEML AEMAIL ;          
     RETURN 
    ARETURN ;                                          
     
    END  
    Bei dem RUNSQLSTM kommt der Fehler
    PHP-Code:
    SQL0104  30      23  Position 31 Token COALESCE ungültigGültige Token: ;. 

  5. #5
    Registriert seit
    Jan 2001
    Beiträge
    850
    Hi zusammen,

    so klappt es dann auch mit der Syntax:
    PHP-Code:
    BEGIN                                                       
           
    RETURN (                                             
                         
    SELECT  coalesce(max(H_CARDNR), 0)  +
                         From    appclhp                        
                         WHERE   H_CARDYY  
    AYEAR              
                         
    and     H_CARDEML AEMAIL ) ;         
     
    END  

    Vielen Dank für die Informationen

  6. #6
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    SET ARETURN = (SELECT coalesce(max(H_CARDNR), 0) +1
    From appclhp
    WHERE H_CARDYY = AYEAR
    and H_CARDEML = AEMAIL);

    Du musst das SELECT in Klammern setzen, dann funktioniert es bei SET auch.

    lg Andreas

Similar Threads

  1. Antworten: 11
    Letzter Beitrag: 18-07-16, 09:49
  2. UDF nicht verwendbar
    By Peder in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 06-12-06, 08:15
  3. SQL UDF Function ausführung mit Fehler
    By jakarto in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 24-07-06, 13:41
  4. SQL UDF Prob mit leeren Feldern
    By HACHIMAN in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 22-05-06, 09:48
  5. SQL 400 UDF
    By SReusch in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 13-01-06, 07:13

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •