Zum Inhalt springen

Fehlermeldung bei Erstellung einer Prozedur


Alex_winf01

Empfohlene Beiträge

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:

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von dbwizard
Link zu diesem Kommentar
Auf anderen Seiten teilen

@ 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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 :-(

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von dr.dimitri
Link zu diesem Kommentar
Auf anderen Seiten teilen

@ 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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

@ 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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...