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> 执行 :i := 0;    

PL/SQL 过程成功完成。

SQL>打印:我

         我
----------
         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> 执行 :i := 0;

PL/SQL 过程成功完成。

SQL>打印:我

         我
----------
         0

SQL> exec do_stuff(:i);

PL/SQL 过程成功完成。

SQL>打印:我

         我
----------
         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 回答