2011-03-06 8 views
7

¿Podemos usar una variable de enlace en el oráculo dentro de un procedimiento o función?uso de la variable de enlace

Estoy tratando de actualizar una variable de vinculación dentro de mi procedimiento. ¿Puedo hacerlo en cualquier caso?

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

¿Puedo hacer lo anterior dentro de un procedimiento o función ..?


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; 

Voy a poder hacer esto? Me muestra la variable incorrecta v_bind

+0

Se puede publicar su código y cualquier error (s). No estoy seguro de que esté claro lo que intentas lograr. – cagcowboy

+0

variable número v_bind; crear el procedimiento abc como v_one BEGIN seleccionar recuento (a) en v_one desde ab; if (v_one <> 0) then: v_bind: = 10; terminara si; podré hacer esto ... me está mostrando la variable mala v_bind ..... – jasmeet

Respuesta

11

No se puede crear un procedimiento con una variable de vinculación porque los procedimientos almacenados son objetos del lado del servidor y las variables de vinculación solo existen en el lado del cliente.

Supongamos que estoy usando SQL * Plus, y que he creado algunas variables de vinculación. Una vez que salgo de SQL * Plus, las variables de vinculación que he creado ya no existen. Sin embargo, los procedimientos almacenados deben permanecer en la base de datos y, por lo tanto, no pueden tener ninguna referencia a nada que haya sido creado y luego destruido en el cliente.

He aquí un ejemplo que muestra que no se puede crear un procedimiento que hace referencia a una variable de vinculación:

 
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' 

Puede sin embargo, pasar, una variable se unen como un parámetro OUT para un procedimiento. El procedimiento puede asignar un valor al parámetro OUT, y este valor se almacenará en la variable de vinculación.

Supongamos que tenemos el siguiente procedimiento:

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

podemos utilizar esto para establecer una variable de vinculación de la siguiente manera:

 
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

No, no se puede hacer lo que están pidiendo. Las variables de enlace en plsql se manejan de forma transparente. Usted no explícitamente variables de enlace de código a menos que se va a utilizar 'ejecución inmediata' para ejecutar el código fuera de plsql así:

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

El siguiente código utiliza variables se unen también, pero se maneja de forma transparente por plsql :

declare 
    v_bind number := 1 
    y number; 
begin 
    select count(*) into y from table where x = v_bind; 
end; 
-1

No puede vincular una variable sqlplus en una sesión a una función/procedimiento. Te dará el error de "variable de enlace incorrecto". En realidad, puede pasar la variable de enlace de su sesión de Oracle a cualquier procedimiento.

Veamos un ejemplo

variable v1 NUMBER; 

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

Y si ejecuta el ejemplo anterior encerrando en el procedimiento/función que le mostrará el error.

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

Error -

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

lo tanto, no es posible utilizar las variables de nivel de sesión se unen en los procedimientos/funciones.En abajo ejemplo T2 es una variable de vinculación

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; 
    /

Puede llamar a este procedimiento desde el sqlplus como

exec proc; 
+0

Esto no agrega nada que no esté ya en la primera respuesta. –

Cuestiones relacionadas