2017-12-27 71 views
0

假设我有一个包含用户输入参数的过程。带条件参数的sql游标

Create procedure Match_Record(v_match_ID) 

Cursor match is 
Select * 
From table A 
Where not exists(select ‘bbb’ from table B 
           Where a. v_match_ID = b. v_match_ID); 

它不会编译,因为v_match_ID不是一个有效的标识符。

那么是立即执行唯一的选择吗?

+2

您是否试图在这里传递列名或文字?如果'V_MATCH_ID'是列名,那么是的,你需要使用立即执行(或DBMS_SQL)。 – Ben

+0

@Ben是的,我试图传递一个列名。 – dozel

+0

我不知道有什么问题可以作为复本来关闭它,因为有很多事情你可能会做,但这里有一些相关的:https://stackoverflow.com/q/12956627/458741,https:// stackoverflow.com/q/15786953/458741,https://stackoverflow.com/q/25182858/458741 – Ben

回答

1

“我想传递一个列名”

在这种情况下,是的,你需要使用动态SQL。可能你需要打开一个游标变量,而不是execute immediate

Create procedure Match_Record(v_match_ID) 
    ... 
    rc sys_refcursor; 
begin 
    open rc for 
     'Select * 
     From table A 
     Where not exists(select blah from table B 
          Where a.'||v_match_ID||' = b.'|| v_match_ID||')';