2011-03-06 27 views
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

+0

としてSQLPLUSからこのプロシージャを呼び出すことができます。あなたが達成しようとしていることがはっきりしているかどうかは分かりません。 – cagcowboy

+0

変数v_bind番号。 v_oneとしてプロシージャabcを作成する。BEGIN abからv_oneにcount(a)を選択する。 if(v_one <> 0)then:v_bind:= 10;終了する。私はこれを行うことができます...それは私に悪い変数v_bind ..... – jasmeet

答えて

11

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

SQL * Plusを使用していて、バインド変数をいくつか作成したとします。 SQL * Plusを終了すると、作成したバインド変数はもう存在しません。ただし、ストアドプロシージャはデータベース内に保持されなければならず、したがって、クライアント上で作成され、破棄されたものへの参照を持つことはできません。あなたは、しかし、手続きのためのOUTパラメータとしてバインド変数を渡すことができ

 
SQL> variable i number 
SQL> exec :i := 0;  

PL/SQL procedure successfully completed. 

SQL> print :i 

     I 
---------- 
     0 

SQL> create or replace procedure test_proc 
    2 as 
    3 begin 
    4 :i := 9; 
    5 end; 
    6/

Warning: Procedure created with compilation errors. 

SQL> show errors procedure test_proc; 
Errors for PROCEDURE TEST_PROC: 

LINE/COL ERROR 
-------- ----------------------------------------------------------------- 
4/3  PLS-00049: bad bind variable 'I' 

は、ここでは、バインド変数を参照するプロシージャを作成することができないことを示す例です。このプロシージャは、OUTパラメータに値を代入することができ、この値はバインド変数に格納されます。

たちは、次の手順を持っていると仮定します。

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

次のように私たちは、バインド変数を設定するためにこれを使用することができます。

 
SQL> variable i number 
SQL> exec :i := 0; 

PL/SQL procedure successfully completed. 

SQL> print :i 

     I 
---------- 
     0 

SQL> exec do_stuff(:i); 

PL/SQL procedure successfully completed. 

SQL> print :i 

     I 
---------- 
     6 
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; 
-1

セッション内のsqlplus変数を関数/プロシージャにバインドすることはできません。それはあなたに "Bad bind variable"のエラーを与えます。実際には、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; 
    /

であるあなたは、あなたのコードや任意のエラー(複数可)を投稿でき

exec proc; 
+0

を示していますこれは、最初の答えに何も追加していません。 –

関連する問題