7

プロシージャまたは関数内でOracleのバインド変数を使用できますか?

プロシージャ内でバインド変数を更新しようとしています。いずれにせよそうすることができますか?

if (condition) then
    :v_bind:=10;
end if;

プロシージャまたは関数内で上記のことを行うことはできますか..?


variable v_bind number; 
create procedure abc as v_one 
BEGIN 
  select count(a) into v_one from ab; 
  if(v_one<>0) then 
     :v_bind:=10; 
  end if; 

私はこれを行うことができますか?それは私に悪い変数を示していますv_bind

4

3 に答える 3

11

ストアド プロシージャはサーバー側のオブジェクトであり、バインド変数はクライアント側にしか存在しないため、バインド変数を含むプロシージャを作成することはできません。

SQL*Plus を使用していて、いくつかのバインド変数を作成したとします。SQL*Plus を終了すると、作成したバインド変数は存在しなくなります。ただし、ストアド プロシージャはデータベースに永続化する必要があるため、クライアントで作成されてから破棄されたものへの参照を持つことはできません。

バインド変数を参照するプロシージャを作成できないことを示す例を次に示します。

SQL> 変数 i 番号
SQL> exec :i := 0;    

PL/SQL プロシージャが正常に完了しました。

SQL> 印刷:i

         私
----------
         0

SQL> プロシージャ test_proc を作成または置換
  2として
  3 開始
  4 : 私 := 9;
  5終了;
  6 /

警告: プロシージャはコンパイル エラーで作成されました。

SQL> エラー手順 test_proc を表示します。
PROCEDURE TEST_PROC のエラー:

LINE/COLエラー
-------- ---------------------------------------------- -----------------------
4/3 PLS-00049: バインド変数 'I' が正しくありません

OUTただし、プロシージャのパラメータとしてバインド変数を渡すことはできます。その後、プロシージャはパラメータに値を割り当てることができ、OUTこの値はバインド変数に格納されます。

次の手順があるとします。

CREATE OR REPLACE PROCEDURE do_stuff (
  p_output    OUT INTEGER
)
AS
BEGIN
  p_output := 6;
END;

これを使用して、次のようにバインド変数を設定できます。

SQL> 変数 i 番号
SQL> exec :i := 0;

PL/SQL プロシージャが正常に完了しました。

SQL> 印刷:i

         私
----------
         0

SQL> exec do_stuff(:i);

PL/SQL プロシージャが正常に完了しました。

SQL> 印刷:i

         私
----------
         6
于 2011-03-06T12:30:30.290 に答える
1

いいえ、あなたが求めていることはできません。plsql のバインド変数は透過的に処理されます。次のように「すぐに実行」を使用してplsqlの外部でコードを実行する場合を除き、バインド変数を明示的にコーディングしないでください。

declare
   v_bind number := 1;
begin
   execute immediate 'select * from table where x = :v_bind';
end;`

次のコードでもバインド変数を使用していますが、plsql によって透過的に処理されます。

declare 
  v_bind number := 1
  y number;
begin
  select count(*) into y from table where x = v_bind;
end;
于 2011-03-09T17:02:09.270 に答える
-1

セッション内の sqlplus 変数を関数/プロシージャにバインドすることはできません。「バインド変数が正しくありません」というエラーが表示されます。実際には、Oracle セッションから任意のプロシージャにバインド変数を渡すことができます。

例を見てみましょう

    variable v1 NUMBER;

    begin
       select salary into :v1 from employees where employee_id = 100;
       dbms_output.put_line(:v1);
   end;
   /

上記の例をプロシージャ/関数で囲んで実行すると、エラーが表示されます。

   create or replace procedure proc is
   begin
      select salary into :v1 from employees where employee_id = 100;
      dbms_output.put_line(:v1);
   end;
   /

エラー -

PROCEDURE proc compiled
Warning: execution completed with warning
3/20           PLS-00049: bad bind variable 'V1'
4/22           PLS-00049: bad bind variable 'V1'

したがって、プロシージャ/関数でセッションレベルのバインド変数を使用することはできません。以下の例では、t2 はバインド変数です。

create or replace procedure proc is
    t2 NUMBER;
    begin
       select salary into t2 from employees where employee_id = 100;
       dbms_output.put_line(t2);
    end;
    /

このプロシージャは、次のように sqlplus から呼び出すことができます。

exec proc;
于 2014-04-26T10:57:48.083 に答える