Anmelden

View Full Version : procedur in sql verwenden



Robi
03-03-11, 11:34
Hi,
ich habe mit

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

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

andreaspr@aon.at
03-03-11, 11:45
Hi Robi,

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


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

Robi
03-03-11, 12:03
Prima, das funktioniert, danke

Noch ne Frage,
wenn ich das etwas allgemeingültiger halten will, kann ich den Dateienamen als Parm weggeben ?
etwa so :

CREATE FUNCTION MYLIB.FUNC1 (Datei)
RETURNS INT
LANGUAGE SQL
RETURN (Select Count(*) From :datei);

SO geht es nicht, kann man das überhaubt ?
Danke
Robi

Robi
03-03-11, 12:13
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

B.Hauser
03-03-11, 12:24
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

Create Sequence MySchema/MySeq As Decimal(9, 0);

2. Insert Statement:

Insert Into MyFile
Select F1, F2, F3, ...., Next Value for MySeq from ...

3. Sequence löschen

Drop sequence MySchema/MySeq

Oder noch einfacher mit der Funktion Row_Number:


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

Birgitta

Robi
03-03-11, 12:36
@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