[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Jun 2001
    Beiträge
    2.044

    procedur in sql verwenden

    Hi,
    ich habe mit
    Code:
    CREATE PROCEDURE MyLib/ADD_1 (                       
     OUT no1 decimal(9)) LANGUAGE SQL MODIFIES SQL         
    DATA BEGIN set no1 = (select count(*) from MyFile); end
    eine Procedur erstellt

    Hintergrund: Ich will mit SQL in die leere Datei MyFile Sätze hineinschreiben und habe als LFD-Zähler die anzahl Sätze in der Datei.

    Der Aufruf über
    insert into MyFile select f1, f2 ..., ADD_1(), Fx from ...

    gibt mir ein
    Code:
     Nachrichten-ID . . . . :   SQL0204       Bewertung  . . . . . . :   30        
     Nachrichtenart . . . . :   Diagnose                                           
     Sendedatum . . . . . . :   03.03.11      Sendezeit  . . . . . . :   12:24:39  
                                                                                   
     Nachricht . . . :   ADD_1 der Art *N in *LIBL nicht gefunden.                 
     Ursache  . . . . :  ADD_1 der Art *N in *LIBL wurde nicht gefunden. Ist der   
       Teildateiname *ALL, ist die Tabelle nicht partitioniert. Handelt es sich um 
       eine Anweisung ALTER TABLE und ist die Art *N, wurde eine                   
       Integritätsbedingung oder Partitionierung nicht gefunden. Ist dies keine    
       Anweisung ALTER TABLE und ist die Art *N, wurde eine Funktion, eine         
       Prozedur, ein Auslöser oder ein Sequenzobjekt nicht gefunden.               
         Wurde eine Funktion nicht gefunden, ist ADD_1 das Serviceprogramm, das die
       Funktion enthält. Die Funktion wird nur gefunden, wenn der externe Name und 
       der Verwendungsname exakt übereinstimmen. Im Jobprotokoll nach einer        
       Nachricht suchen, die weitere Einzelheiten über den gesuchten Funktionsnamen
       und den nicht übereinstimmenden Namen enthält.
    Da ich noch nie wirklich etwas mit Proceduren / funktionen gemacht habe, stehe ich etwas auf dem Schlauch.

    Was ist der Fehler ?
    (Liblist stimmt natürlich, die Procedur müßte gefunden werden)

    Robi
    Das Notwendige steht über dem technisch machbaren.
    (klingt komisch, funktioniert aber!)

  2. #2
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Hi Robi,

    SQL Proceduren kannst du nur mit einer CALL Anweisung aufrufen. Das was du brauchst ist eine SQL Function:

    Code:
    CREATE FUNCTION MYLIB.FUNC1 () 
    	RETURNS INT
    	LANGUAGE SQL 
            RETURN (Select Count(*) From ...);
    Diese kannst du dann wie in deinem Beispiel auch innerhalb anderer Anweisungen verwenden.

    lg
    Last edited by andreaspr@aon.at; 03-03-11 at 11:49. Grund: Beim RETURN haben die Klammern gefehlt

  3. #3
    Registriert seit
    Jun 2001
    Beiträge
    2.044
    Prima, das funktioniert, danke

    Noch ne Frage,
    wenn ich das etwas allgemeingültiger halten will, kann ich den Dateienamen als Parm weggeben ?
    etwa so :
    Code:
    CREATE FUNCTION MYLIB.FUNC1 (Datei) 
    	RETURNS INT
    	LANGUAGE SQL 
            RETURN (Select Count(*) From :datei);
    SO geht es nicht, kann man das überhaubt ?
    Danke
    Robi
    Das Notwendige steht über dem technisch machbaren.
    (klingt komisch, funktioniert aber!)

  4. #4
    Registriert seit
    Jun 2001
    Beiträge
    2.044
    Sch... ade, zu früh gefreut

    Anscheinend bringt die Funktion immer den selben Wert zurück.
    lt Joblog hab ich endlos doppelte Sätze versucht zu schreiben

    Nur einer mit der lfdnr = 0 ist geschrieben worden.

    noch ne idee ?

    Robi
    Das Notwendige steht über dem technisch machbaren.
    (klingt komisch, funktioniert aber!)

  5. #5
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Code:
    Insert into MyFile select f1, f2 ..., ADD_1(), Fx from .
    Die Frage ist, warum Du dafür überhaupt eine Funktion brauchst.
    Wenn's nur um einen laufenden Zähler geht, geht das mit einer Sequence genauso.

    1. Sequence erstellen
    Code:
    Create Sequence MySchema/MySeq As Decimal(9, 0);
    2. Insert Statement:
    Code:
    Insert Into MyFile 
    Select F1, F2, F3, ...., Next Value for MySeq from ...
    3. Sequence löschen
    Code:
    Drop sequence MySchema/MySeq
    Oder noch einfacher mit der Funktion Row_Number:

    Code:
    Insert into MyFile
    Select Row_Number() Over() as lfd, Fld1, Fld2, Fld3 .... From ...
    Birgitta
    Birgitta Hauser

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

  6. #6
    Registriert seit
    Jun 2001
    Beiträge
    2.044
    @Birgitta
    Das kannte ich nur 'vom hören sagen'
    Ich hab im Hinterkopf das es erst ab V6R1 geht

    Ich habs nun mit der sequence gemacht (V5R4) und es geht
    !!

    Danke
    Robi
    Das Notwendige steht über dem technisch machbaren.
    (klingt komisch, funktioniert aber!)

Similar Threads

  1. RPGLE - SQL
    By christian_lettner in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 16-11-06, 10:15
  2. SQL - Cursor vernichten ?!?
    By FNeurieser in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 11-10-06, 14:53
  3. SQL und OBJLCK
    By malzusrex in forum IBM i Hauptforum
    Antworten: 8
    Letzter Beitrag: 19-09-06, 11:04
  4. SQL - Fehler
    By Kaufmann in forum IBM i Hauptforum
    Antworten: 11
    Letzter Beitrag: 28-06-06, 14:11
  5. SQL .. for update of (RPG embedded SQL)
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 01-06-06, 09:43

Berechtigungen

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