2012-04-07 13 views
1

Nach einer looong Forschung habe ich entschieden, ich habe keine Ahnung, was das folgende Problem verursacht! Ich möchte eine gespeicherte Prozedur erstellen, die den Wert einer Spalte erhöht, wenn das eine Anweisung erfüllt. Ich kann die Prozedur als anonymen Block ausführen, aber ich kann es nicht als gespeicherte Prozedur ausführen!Oracle Stored Procedure "Das Symbol gefunden ..." Fehler

Hier ist der Code der gespeicherten Prozedur:

1 create or replace 
2 Procedure RaiseSalary 
3 Is 
4 Salary number; 
5 Cursor RaiseCursor 
6 Is 
7 Select Salary_A From Person Where Salary_A<400 for update of Salary_A; 
8 Begin 
9 Open RaiseCursor; 
10 Loop 
11 Fetch RaiseCursor Into Salary; 
12 Exit When RaiseCursor%Notfound; 
13 Update Person Set Salary_A=(Salary + 200) Where Current Of RaiseCursor; 
14 End Loop; 
15 Close RaiseCursor; 
16 Commit; 
17 End; 

ich einen Fehler in Zeile bekommen 3, die GEHALT „das Symbol Encountered‚sagt‘, wenn eines der folgenden erwartet: ....“ und ich bin den gleichen Fehler in Zeile 5 im "s" Buchstaben des Wortes Cursor bekommen, aber zu dieser Zeit sagt es ";" anstelle von "Gehalt". Das Compiler-Protokoll zeigt "unzureichende Berechtigungen", aber ich kann keine vernünftige Erklärung dafür finden. Ich habe versucht, den Code als anonymer Block wie folgt auszuführen:

Declare 
Salary number; 
Cursor RaiseCursor 
Is 
    Select Salary_A From Person Where Salary_A<400 for update of Salary_A; 
    Begin 
    Open RaiseCursor; 
    Loop 
    Fetch RaiseCursorInto Salary ; 
    Exit When RaiseCursor%Notfound; 
    Update Person Set Salary_A =(Salary + 200) Where Current Of RaiseCursor; 
    End Loop; 
    Close RaiseCursor; 
    Commit; 
    End; 
    . 
    run; 

Und funktioniert super !!! Ich bin sicher, dass ich die Privilegien haben gespeicherte Prozeduren zu schreiben, weil ich einige erfolgreich erstellt haben!
Mache ich etwas so falsch? Ich kann nicht herausfinden, was das Problem verursacht, wenn Sie irgendwelche Vorschläge haben, würde ich das wirklich schätzen :)

EDIT: Aus irgendeinem Grund mein Verfahren falsch geraten Schema das ist, warum ich dieses Problem hatte! Ich habe nur das Verfahren fallen lassen und es neu erstellt und es repariert !!!! Danke für deine Zeit trotzdem!

+0

Aus den Zeilennummern sieht es so aus, als würden Sie Ihre Prozedur in SQL * Plus kompilieren. Können Sie danach 'show error' eingeben und die gesamte Ausgabe veröffentlichen. Wenn das Problem Berechtigungen sind, sollte es einen Hinweis geben, was Sie vermissen. – Ben

+0

Zuerst einmal vielen Dank für Ihre Zeit! Jetzt benutze ich SQL * Plus nicht. Ich habe die Zeilennummern manuell geschrieben, damit ich leicht auf sie zeigen konnte. Ich benutze Sql Entwickler btw. – VGe0rge

+0

Bitte fügen Sie die vollständigen Fehlermeldungen hinzu. –

Antwort

6

Lassen Sie mich darauf hinweisen, gerade diese erheblich effizienter wären, wenn man es so tut:

UPDATE Person Set Salary_A=(Salary_A + 200) 
Where Salary_A<400 

kein Cursor, kein Looping. Es wäre auch viel einfacher.

+0

Danke ich werde das versuchen :) – VGe0rge

+0

Funktioniert gut :) Und es hat mir ungefähr 10 Zeilen Code gerettet :) – VGe0rge