Alex_winf01 Geschrieben 17. September 2010 Teilen Geschrieben 17. September 2010 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: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dbwizard Geschrieben 17. September 2010 Teilen Geschrieben 17. September 2010 (bearbeitet) 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 2010 von dbwizard Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Alex_winf01 Geschrieben 20. September 2010 Autor Teilen Geschrieben 20. September 2010 @ 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dbwizard Geschrieben 20. September 2010 Teilen Geschrieben 20. September 2010 @ 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Alex_winf01 Geschrieben 20. September 2010 Autor Teilen Geschrieben 20. September 2010 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dbwizard Geschrieben 20. September 2010 Teilen Geschrieben 20. September 2010 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Alex_winf01 Geschrieben 20. September 2010 Autor Teilen Geschrieben 20. September 2010 @ dbwizard danke schon mal für deine Antwort. Bei Deinem Beispiel bekomme ich aber eine Fehlermeldung, dass das Symbol "Exception" gefunden wurde.:confused: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dbwizard Geschrieben 20. September 2010 Teilen Geschrieben 20. September 2010 @ 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Alex_winf01 Geschrieben 20. September 2010 Autor Teilen Geschrieben 20. September 2010 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; Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dbwizard Geschrieben 20. September 2010 Teilen Geschrieben 20. September 2010 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 :-( Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Alex_winf01 Geschrieben 20. September 2010 Autor Teilen Geschrieben 20. September 2010 @ 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 20. September 2010 Teilen Geschrieben 20. September 2010 (bearbeitet) 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 2010 von dr.dimitri Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Alex_winf01 Geschrieben 20. September 2010 Autor Teilen Geschrieben 20. September 2010 @ 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dbwizard Geschrieben 20. September 2010 Teilen Geschrieben 20. September 2010 @ 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Alex_winf01 Geschrieben 21. September 2010 Autor Teilen Geschrieben 21. September 2010 @ 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 21. September 2010 Teilen Geschrieben 21. September 2010 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Alex_winf01 Geschrieben 21. September 2010 Autor Teilen Geschrieben 21. September 2010 @ dr.dimitri hab eine Lösung gefunden. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.