Veröffentlicht 17. September 201014 j Hallo, ich probier gerade an einer Prozedur rum: create or replace procedure f_verk (i_f_id IN number, i_verkauft IN number) begin declare cursor c_paint(i_paint_id IN farbe.f_id%type) is select f_am_lager from farbe where f_id=i_paint_id; l_qty farbe.f_am_lager%type; error_code number := SQLCODE; error_mes varchar2(200) := SQLERM; no_stock exception; -------------------------- begin if c_paint%isopen then close c_paint; end if; open c_paint(i_f_id); if l_qty < i_verkauft then raise no_stock; end if; update farbe set f_am_lager = f_am_lager - i_verkauft where f_id = i_f_id; --------------------------------- exception when no_stock then raise_application_error(-20001, 'Nicht genug am Lager'); when others then dbms_output.put_line(to_char(sqlcode||sqlerrm(sql_code)); end; end; Erst bekomm ich die Meldung, dass die Prozedur mit Kompilierungsfehlern erstellt wurde. Folgende Fehler werden mir angezeigt: Line # = 2 Column # = 4 Error Text = PLS-00103: Fand das Symbol "BEGIN" als eines der folgenden erwartet wurde: ; is with authid as cluster order using external deterministic parallel_enable pipelined Das Symbol "is" ersetzte "BEGIN", um fortzufahren. Line # = 26 Column # = 59 Error Text = PLS-00103: Fand das Symbol ";" als eines der folgenden erwartet wurde: . ( ) , * % & | = - + < / > at in is mod remainder not range rem => .. <an exponent (**)> <> or != or ~= >= <= <> and or like LIKE2_ LIKE4_ LIKEC_ as between from using || multiset member SUBMULTISET_ Das Symbol ")" ersetzte ";", um fortzufahren. Was mache ich da falsch?:confused:
17. September 201014 j Hallo, ich probier gerade an einer Prozedur rum: Erst bekomm ich die Meldung, dass die Prozedur mit Kompilierungsfehlern erstellt wurde. Folgende Fehler werden mir angezeigt: Was mache ich da falsch?:confused: - Das Declare kannst du dir sparen Deine Struktur ist noch unvollständig : create or replace procedure f_verk (i_f_id IN number, i_verkauft IN number) --> IS cursor c_paint(i_paint_id IN farbe.f_id%type) is select f_am_lager from farbe where f_id=i_paint_id; l_qty farbe.f_am_lager%type; begin error_code number := SQLCODE; error_mes varchar2(200) := SQLERM; .... .... END; Gruss Bearbeitet 17. September 201014 j von dbwizard
20. September 201014 j Autor @ dbwizard danke schon mal für Deine Hilfe. Nun habe ich bei folgender Prozedur Probleme: CREATE OR REPLACE PROCEDURE STAMMDATEN_bearbeiten (ID VARCHAR2) IS BEGIN cursor c_stammdaten_bearbeiten(ID IN STAMMDATEN.ID%type) is CREATE OR REPLACE VIEW Stammdaten_bearbeiten AS -- Mein SQL-Befehl END; END; Nun bekomme ich beim kompilieren folgende Fehlermeldung: Line # = 3 Column # = 11 Error Text = PLS-00103: Fand das Symbol "C_STAMMDATEN_BEARBEITEN" als eines der folgenden erwartet wurde: := . ( @ % ; Das Symbol ":=" ersetzte "C_STAMMDATEN_BEARBEITEN", um fortzufahren. Line # = 3 Column # = 67 Error Text = PLS-00103: Fand das Symbol "IS" als eines der folgenden erwartet wurde: ) , and or using Line # = 3 Column # = 44 Error Text = PLS-00103: Fand das Symbol "STAMMDATEN" als eines der folgenden erwartet wurde: ( Das Symbol "(" ersetzte "STAMMDATEN", um fortzufahren. Ich vermute, dass ich dieselben Fehler mache, oder? Könntes Du mir da noch mal helfen? Vielen Dank.
20. September 201014 j @ dbwizard danke schon mal für Deine Hilfe. Nun habe ich bei folgender Prozedur Probleme: Ich vermute, dass ich dieselben Fehler mache, oder? Könntes Du mir da noch mal helfen? Vielen Dank. Na ja, Beschreibe doch mal, was eigentlich deine Absicht ist, der Cursor ist so nicht gültig. Gruss
20. September 201014 j Autor Also, ich habe da eine Abfrage, der ich einen Wert übergeben muss - so was wie in der Art: select * from blabla where id=<übergabeparameter> Meine Idee: Eine Funktion bauen, der ich den Parameter übergebe und dann den SQL-Befehl ausführen lasse. Dabei soll eine View erzeugt, die den Select-Befehl beinhaltet. Kannst Du mir vielleicht ein Beispiel dafür geben?
20. September 201014 j Also, ich habe da eine Abfrage, der ich einen Wert übergeben muss - so was wie in der Art: select * from blabla where id=<übergabeparameter> Meine Idee: Eine Funktion bauen, der ich den Parameter übergebe und dann den SQL-Befehl ausführen lasse. Dabei soll eine View erzeugt, die den Select-Befehl beinhaltet. Kannst Du mir vielleicht ein Beispiel dafür geben? Einen Paramter in einer Prozedur übergeben und anschliessend in einem SQL verwenden kannst du folgendermassen : PROCEDURE my_procedure ( i_n_MyParameter IN NUMBER) IS BEGIN SELECT * FROM My_Table WHERE ID = i_n_MyParameter ; END; EXCEPTION WHEN NO_DATA_FOUND THEN RETURN; END; - Alternativ kanst du auch dynamisches SQL verwenden, wenn du erst zur Laufzeit weisst, wie der SQL aussieht Gruss
20. September 201014 j Autor @ dbwizard danke schon mal für deine Antwort. Bei Deinem Beispiel bekomme ich aber eine Fehlermeldung, dass das Symbol "Exception" gefunden wurde.:confused:
20. September 201014 j @ dbwizard danke schon mal für deine Antwort. Bei Deinem Beispiel bekomme ich aber eine Fehlermeldung, dass das Symbol "Exception" gefunden wurde.:confused: Poste doch bitte mal dein Prozedur. Da fehlt Irgendwo ein ; oder ähnliches
20. September 201014 j Autor Also ich habe eigentlich nur den Tabellennamen und den Spaltennamen angepasst. CREATE PROCEDURE test ( i_n_MyParameter IN varchar2) IS BEGIN SELECT * FROM stammdaten WHERE KHPN = i_n_MyParameter; END; EXCEPTION WHEN NO_DATA_FOUND THEN RETURN; end;
20. September 201014 j Also ich habe eigentlich nur den Tabellennamen und den Spaltennamen angepasst. CREATE PROCEDURE test ( i_n_MyParameter IN varchar2) IS BEGIN SELECT * FROM stammdaten WHERE KHPN = i_n_MyParameter; EXCEPTION WHEN NO_DATA_FOUND THEN RETURN; end; END; Es war ein END; zuviel im Code....Ich sollte weniger am Wochenende arbeiten :-(
20. September 201014 j Autor @ dbwizard sorry, dass ich nerven muss: Aber jetzt bekomme ich folgende Fehlermeldung: PLS-00428: In diesem Select-Anweisung wird eine Into-Klausel erwartet. Kannst Du mir noch mal helfen? Danke schon mal.
20. September 201014 j Der Ansatz ist ein bissl verquer. Wieso legst Du die View nicht einmalig an und schränkst dann nur über die WHERE Abfrage ein? Fertig. Falls das ganze komplett in PL/SQL laufen soll, wäre auch noch die Möglichkeit das Ergebnis als REF CURSOR zurückzugeben. Im aufrufenden Programm bekommt man das als ResultSet, RecordSet oder wie immer man es in der jeweiligen Sprache auch nennt zurück. Das ganze würde dann wie folgt aussehen: CREATE OR REPLACE FUNCTION STAMMDATEN_bearbeiten (p_id VARCHAR2) RETURN SYS_REFCURSOR IS l_retVal SYS_REFCURSOR; BEGIN OPEN l_retVal FOR 'SELECT * FROM tabelle WHERE id=:1' USING p_id; RETURN l_retVal; END;Damit lieferst Du die Ergebnismenge bzw. besser gesagt einen Zeiger darauf, an den Aurufer zurück. Wie das dann konkret im Programm aussieht ist je nach Sprache etwas anders, aber dafür gibt es dann die Doku. Dim PS: Wieso heißt es stammdaten_bearbeiten wenn das Ergebnis einer Abfrage zurückgegeben wird? Bearbeitet 20. September 201014 j von dr.dimitri
20. September 201014 j Autor @ dr.dimitri danke für Deinen Ansatz. Der funktioniert. @ dbwizard kannst Du mir die Fehlermeldung erklären? Dein Code CREATE PROCEDURE test ( i_n_MyParameter IN varchar2) IS BEGIN SELECT * FROM stammdaten WHERE KHPN = i_n_MyParameter; EXCEPTION WHEN NO_DATA_FOUND THEN RETURN; end; führt nämlich zu diesem Fehler.
20. September 201014 j @ dr.dimitri danke für Deinen Ansatz. Der funktioniert. @ dbwizard kannst Du mir die Fehlermeldung erklären? Dein Code CREATE PROCEDURE test ( i_n_MyParameter IN varchar2) IS BEGIN SELECT * FROM stammdaten WHERE KHPN = i_n_MyParameter; EXCEPTION WHEN NO_DATA_FOUND THEN RETURN; end; führt nämlich zu diesem Fehler. Dies war nur als Beispiel gedacht. Das Resultat des SQL muss "irgendwohin", entweder in einen Cursor (wie Dim es geschribenen hat) oder als Select my_Feld INTO myVariable where...., dies liest einen Wert in ein vorgängig definiert Variable ein.
21. September 201014 j Autor @ dbwizard funktioniert jetzt. Mein Kollege möchte aber das Ergebnis gerne in einer View haben. Kann ich da jetzt einfach drum herum eine Art "CREATE VIEW..." erzeugen? Bei meinem ersten Versuch hat das nicht funktioniert.
21. September 201014 j Und was passiert, wenn während eine Abfrage läuft eine weitere Session diese Abfrage startet und die View neuanlegen möchte? Mutiuserfähig ist das auf jeden Fall nicht - davon mal davon abgesehen, dass man es einfach nicht so macht. Warum wird nicht einfach ein normales Select verwendet? Dim
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.