1

長い調査の後、私は次の問題の原因がわからないと判断しました! ステートメントが満たされた場合に列の値を増やすストアド プロシージャを作成したいのですが、プロシージャを匿名ブロックとして実行できますが、ストアド プロシージャとして実行することはできません。

ストアド プロシージャのコードは次のとおりです。

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;

行 3 で「次のいずれかを予期しているときに記号 "SALARY" が発生しました:....」というエラーが表示され、5 行目で単語 Cursor の文字 "s" で同じエラーが表示されます。ただし、この時点では「;」と表示されます 「給料」ではなく。コンパイラのログには「権限が不十分です」と表示されますが、これについての合理的な説明が見つかりません。次のような匿名ブロックとしてコードを実行しようとしました。

 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;

そしてうまくいきます!!!いくつかのストアドプロシージャを正常に作成したので、ストアドプロシージャを作成する権限があると確信しています!
私は何か間違ったことをしていますか?問題の原因がわかりません。何か提案があれば、本当に感謝します:)

編集:何らかの理由で私の手順が間違ったスキーマを取得したため、その問題が発生しました! プロシージャを削除して再度作成しただけで修正されました!!!! とにかく時間をありがとう!

4

1 に答える 1

6

次のようにすると、これははるかに効率的になります。

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

カーソルもループもありません。また、はるかに簡単になります。

于 2012-04-07T14:13:42.933 に答える