我们可以在程序或函数中的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 :(得分:11)
您无法在其中创建包含绑定变量的过程,因为存储过程是服务器端对象,并且绑定变量仅存在于客户端。
假设我正在使用SQL * Plus,并且我已经创建了一些绑定变量。一旦我退出SQL * Plus,我创建的任何绑定变量都不再存在。但是,存储过程必须持久存储在数据库中,因此它们不能引用任何已创建然后在客户端上销毁的内容。
这是一个示例,显示您无法创建引用绑定变量的过程:
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
参数传递。然后,该过程可以为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 :(得分:1)
不,你不能做你想要的。 plsql中的绑定变量是透明处理的。您没有显式编写绑定变量代码,除非您打算使用'execute immediate'来运行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;
答案 2 :(得分:-1)
您无法将会话中的sqlplus变量绑定到函数/过程。它会给你错误的#34; Bad bind变量&#34;。实际上,您只需将绑定变量从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;