2014-09-12 3 views
0

필자는 oracle PL/SQL을 처음 사용하고 변수 바인딩을위한 코드를 작성했습니다. 바인딩 변수가 작동하는 방식과 USING 절의 목적이 무엇인지 개념이 명확하지 않습니다.오라클에서 변수 바인딩하기

나는 바인딩 변수를 이해하기 위해 코드 조각을 작성했지만 실패했다.

CREATE OR REPLACE FUNCTION updNVAl(col IN VARCHAR2,val IN VARCHAR2) 
RETURN INTEGER 
IS 
BEGIN 
    EXECUTE IMMEDIATE 
    'UPDATE emp SET '||col||' =:the_value' USING col,val; 
    return SQL%ROWCOUNT; 
    END; 

    DECLARE 
    val INTEGER; 
    BEGIN 
    val:= updNVAl('ename','deepak'); 
    DBMS_OUTPUT.PUT_LINE(val); 
    END; 

오류 : ORA-01006 : 바인드 변수는 ORA-06512 존재하지 않습니다 "SCOTT.UPDNVAL"줄에서 5 ORA-06512 : 줄에서 4

도움이 필요합니다.

답변

3
EXECUTE IMMEDIATE 
    'UPDATE emp SET '||col||' =:the_value' USING val; 

당신은 그래서 그냥 당신의 USING 절에 충분하다 바인딩 만 :the_value 바인드 변수로 정의한다.

col 실제로는 바인드 변수가 아닌 문자열로 구성됩니다. 또한 db 객체 (테이블, 컬럼 ..)는 바인드 요소로 사용할 수 없습니다.

1
SQL> CREATE OR REPLACE FUNCTION updNVAl(ename IN VARCHAR2,val IN VARCHAR2) 
    2 RETURN INTEGER 
    3 IS 
    4 BEGIN 
    5  EXECUTE IMMEDIATE 
    6  'UPDATE emp SET '||ename||' =:the_value' USING val; 
    7  RETURN SQL%ROWCOUNT; 
    8 END; 
    9/

Function created. 

SQL> set serveroutput on; 
SQL> DECLARE 
    2  val INTEGER; 
    3 BEGIN 
    4  val:= updNVAl('ename','deepak'); 
    5  DBMS_OUTPUT.PUT_LINE(VAL); 
    6 END; 
    7/
14 

PL/SQL procedure successfully completed. 

SQL> select ename from emp; 

ENAME 
---------- 
deepak 
deepak 
deepak 
deepak 
deepak 
deepak 
deepak 
deepak 
deepak 
deepak 
deepak 

ENAME 
---------- 
deepak 
deepak 
deepak 

14 rows selected. 

SQL> 
+0

내 말과 다른 의미가 있습니까? –

+0

나는 내 코 앞에서 당신의 대답을 알지 못했습니다. 죄송합니다 –