[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Dec 2003
    Beiträge
    8

    CREATE FUNCTION mit select im Bauch ?

    Hallo zusammen:

    Ich möchte ein SQL schreiben, das mir eine Liste ausgibt mit je einer Zeile für einen Artikel, hinter dem alle Lieferanten in dieser Zeile stehen.


    Die Voraussetzungen schaffen:
    CREATE SCHEMA CARSTEN IN ASP 1

    CREATE TABLE CARSTEN/TABLE1 (ARTNR CHAR (5 ) NOT NULL WITH DEFAULT, LIEFNR CHAR (5 ) NOT NULL WITH DEFAULT)

    INSERT INTO CARSTEN/TABLE1 (ARTNR, LIEFNR) VALUES('A', '1')
    INSERT INTO CARSTEN/TABLE1 (ARTNR, LIEFNR) VALUES('A', '2')
    INSERT INTO CARSTEN/TABLE1 (ARTNR, LIEFNR) VALUES('A', '3')
    INSERT INTO CARSTEN/TABLE1 (ARTNR, LIEFNR) VALUES('B', '1')
    INSERT INTO CARSTEN/TABLE1 (ARTNR, LIEFNR) VALUES('B', '2')
    INSERT INTO CARSTEN/TABLE1 (ARTNR, LIEFNR) VALUES('C', '1')

    Ein Select liefert nun folgende Daten:

    select * from carsten/table1
    ARTNR LIEFNR
    ----- ------
    000001 A 1
    000002 A 2
    000003 A 3
    000004 B 1
    000005 B 2
    000006 C 1


    Dazu habe ich mir überlegt eine Funktion zu schreiben, an die ich die Artikel Nr. übergebe, die dann einen select macht und die Lieferanten einliest cancatiniert und zurückgibt. Das aufrufende Select sollte so aussehen: select artnr, lieferenten(artnr) from carsten/table1 order by artnr

    Geht das überhaupt: In eine CREATE FUNKTION ein SELECT einzubauen?

    Das Ergebnis sollte dann so aussehen:
    A 1 2 3
    B 1 2
    C 1



    Viele Grüße Carsten

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Insoweit kein Problem.
    Definiere eine Variable, die nur lang genug ist, z.B. varchar(256) und mach in einer Schleife dann einen

    set myvar = trim(myvar) concat ' ' conact mylinr;

    Beachte bei der Größe nur die maximale Anzahl möglicher Lieferanten.
    gib myvar dann als Return-Wert zurück.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #3
    Registriert seit
    Dec 2003
    Beiträge
    8
    Hallo,

    Danke für Ihre Antwort.

    Ich habe mir jetzt mal das IBM Buch "SQL Programming" zu Gemüte geführt.

    Dort drin gibt kein einziges Beispiel was einen SELECT in einer Funktion absetzt. In Proceduren dagegen funktioniert das wohl mit Cursor und Fetch.

    Ich habe mir folgendes vorgestellt, weis aber nicht ob ich da völlig auf dem Holzweg bin:

    PHP-Code:
    create function schulz/lieferant                       
    inval char () )                                    
    RETURNS CHAR(500 )                                     
    LANGUAGE SQL                                           
    BEGIN                                                  
    DECLARE ERGEBNIS NUMERIC(205);                       
    DECLARE 
    myvar char(10);                                
    select liefnr from schulz/table1 where artnr inval;  
    set myvar trim(myvarconcat ' ' concat liefnr;      
    RETURN 
    myvar;                                          
    END 

    Erstellen lässt sie die Funktion jedenfalls nicht, denn es kommt der Fehler: Variable LIEFNR nicht definiert oder nicht verwendbar.

    Aber ich vermute fast, das das so überhaupt nicht geht, wie ich mir das vorstelle.

    Viele Grüße

    Carsten

  4. #4
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Hallo Carsten,

    Der Aufbau des Routine-Body ist für Stored Procedures und User Defined Functions identisch. Der einzige Unterschied ist, dass bei Funktionen der Rückgabe-Wert mit RETURN ausgegeben werden muss. Wenn Du also bei Stored Procedures Cursor, Schleifen und Fetches brauchst, benötigst Du die ebenso bei User Defined Functions

    Das folgende Beispiel sollte Dein gewünschtes Ergebnis ermitteln und ausgeben:
    PHP-Code:
    CREATE FUNCTION MySchema/MyFkt (
        
    PARARTNR CHAR(5) ) 
        
    RETURNS VARCHAR(1024)
        
    LANGUAGE SQL 
        SPECIFIC MySchema
    /MyFkt
        NOT DETERMINISTIC 
        READS SQL DATA 
        CALLED ON NULL INPUT
        NO EXTERNAL ACTION 
        DISALLOW PARALLEL 
        FENCED 
    Begin
       
    Declare ReturnVal  Varchar(1024) Default ' ';

       FOR 
    CsrC1 AS C1 CURSOR 
           
    FOR SELECT LiefNr 
                  FROM table1
                  Where ArtNr 
    ParArtNr 
               
    DO Set ReturnVal ReturnVal concat ' ' concat CsrC1.LiefNr
       
    END FOR; 

       Return 
    LTrim(ReturnVal);
    End
    Übrigens die FOR-Schleife kombiniert Cursor-Definition, Schleife und Fetch.

    Ansonsten würde ich Dir die beiden folgenden Redbooks empfehlen:
    Stored Procedures, Triggers and User Defined Functions on DB2 Universal Database for iSeries
    Modernizing IBM eServer iSeries Application Data Access - A Roadmap Cornerstone


    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  5. #5
    Registriert seit
    Dec 2003
    Beiträge
    8
    Hallo zusammen,

    super vielen Dank.
    Habe die Function erzeugt und angepasst.
    Das funktioniert.

    Vielen Dank auch für die Buchtipps. Sowas ist immer wertvoll.

    Grüße

    Carsten

Similar Threads

  1. User defined function
    By KM in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 04-08-06, 10:34
  2. SQL UDF Function ausführung mit Fehler
    By jakarto in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 24-07-06, 13:41
  3. problem mit eigener sql function
    By Stefan_Sk in forum NEWSboard Programmierung
    Antworten: 8
    Letzter Beitrag: 26-05-06, 16:37
  4. CREATE SQL FUNCTION
    By Xanas in forum NEWSboard Programmierung
    Antworten: 1
    Letzter Beitrag: 23-02-06, 10:29
  5. UDF / Create Function
    By Schorsch in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 21-10-05, 08:40

Berechtigungen

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