PDA

View Full Version : Probleme mit Stored Procedures und Parametern



Rico
23-10-07, 16:26
Hallo zusammen,

für alle SP-erprobten kommt hier jetzt eine Anfängerfrage, aber ich beiße mir jetzt schon einige Zeit die Zähne daran aus. Ich möchte eine SP erstellen und den Parameter VARHKN übergeben.
Wenn ich das mache, laufe ich auf einen Fehler (MCH3601), der mir überhaupt nichts sagt. Wenn ich den Parameter in der Deklaration weglasse und statt dessen einen festen Wert dort eintrage, dann funktioniert es:


CREATE PROCEDURE fatmp/test_cross (IN VARHKN CHAR(8))
LANGUAGE SQL
MODIFIES SQL DATA
BEGIN
drop table fatmp/trefferx;
create table fatmp/trefferx
(
AID integer not null with default,
HKNIN CHAR( 8) not null with default,
HKN CHAR(10) not null with default,
HKD integer not null with default,
LFR CHAR( 3) not null with default,
anz integer not null with default
);
insert into fatmp/trefferx
(aid, hknin, hkn, hkd, lfr, anz)
select
aid, VARHKN , hkn, hkd, lfr, 0
from
eswadb/adrinf
where
hkn = VARHKN ;
END


Kann mir irgendjemand helfen? Ich wäre wirklich für jede Hilfe dankbar!!!

Gruß
Rico

B.Hauser
23-10-07, 17:11
Hallo,

wie rufst Du die Procedure auf?

MCH3601 heißt "Zeiger für angegebene Position nicht gesetzt", was darauf hindeutet, dass der Parameter gar nicht erst übergeben wurde.

Ansonsten komme ich etwas ins Schleudern mit VARHKN. Ist das nicht nur ein Parameterfeld sondern auch noch ein Feld in der Datei adrinf?
Wenn ja, sollte das Datei-Feld im Insert Statement qualifiziert werden. (Datei.Feld)
Oder Du benennst den Parameter anders und lädst das Feld gegebenenfalls um.

Birgitta

Rico
24-10-07, 10:27
Hallo,

vielen Dank schon mal für die erste Rückmeldung. Zu Deinen Fragen, also dieses VARHKN ist nur eine Variable. Das gibt es nicht als Feld in der Datei. Ich möchte also beim Insert für die Felder ( aid, hkn, hkd, lfr) die Werte aus der adrinf nehmen und an der Position wo das VARHKN steht, soll halt der übergebene Parameter eingesetzt werden. Ich weiß von CL und dem Querymanager, dass ich die Variablen dort mit "&" vor dem Namen angeben muss um darauf dann z.B. im SQL (QM) zuzugreifen. Das geht hier aber nicht und soll auch nicht, wenn ich das bisher in meinen Nachforschungen richtig verstanden habe.

Und zu Deiner zweiten Frage, ich rufe die Prozedur wie folgt auf:

CALL PGM(FATMP/TEST_CROSS) PARM('7GTX0510')

Meines Erachtens richtig, oder nicht? :confused:

Ich habe hier absolut keine Ahnung mehr...

Grüße,
Rico

Fuerchau
24-10-07, 11:04
Das ist falsch, da eine SQL-Prozedur nur mittels SQL aufgerufen werden kann.

Du benötigst als ein SQL-Statement:

CALL fatmp/test_cross('7GTX0510')

Rico
24-10-07, 12:22
Hallo,

vielen Dank für die Info. In der SQL-Umgebung aufgerufen funktioniert es. ;)

Jetzt habe ich aber trotzdem noch eine Frage, denn wenn ich die SQL-Prozedur ohne Parameter deklariere und statt dessen einen festen Wert dort unten im SQL eintrage, dann funktioniert der Aufruf so, wie ich ihn oben beschrieben habe (natürlich ohne den Parameter) auf der Befehlszeile ohne zu murren. Nur deshalb bin ich ja auch auf die Idee gekommen, das (auch mit dem Parameter) auf diesem Weg weiterzumachen. Vielleicht kannst Du mir das ja nochmal erklären? Oder ist das nur ein Zufall und eigentlich von IBM gar nicht gewollt? :confused:

Gruß,
Rico

Fuerchau
24-10-07, 12:29
Nein das ist kein Zufall.
SQL-Prozeduren mit Parametern wird mindestens ein NULL-Flag-Feld mit übergeben.
Siehe auch hierzu die Doku für das erstellen externer SQL-Prozeduren.