oracle - 使用带有多个相同绑定(bind)参数的 EXECUTE IMMEDIATE

标签 oracle plsql

当我创建以下过程

create or replace procedure check_exec_imm(
tab IN VARCHAR2,
col IN VARCHAR2,
col_name IN VARCHAR2

)

IS

 cv  SYS_REFCURSOR;
 col_value  VARCHAR2(32767);
 lv_query VARCHAR2(32767); 

 BEGIN
   lv_query := 'SELECT ' ||col||
           ' FROM ' ||tab||
           ' WHERE (:1 = ''EUR'' OR :1 = ''USD'') and rownum <=1';


    EXECUTE IMMEDIATE lv_query INTO col_value USING  col_name ;


DBMS_OUTPUT.PUT_LINE('COLUMN VALUE : ' || col_value);

END;

执行该过程时,我收到以下错误
ORA-01008: not all variables bound
ORA-06512: at "GRM_IV.CHECK_EXEC_IMM", line 18
ORA-06512: at line 2

当我如下再次给出绑定(bind)参数 col_name 时,该过程运行良好。
EXECUTE IMMEDIATE lv_query INTO col_value USING  col_name, col_name ;

为什么 oracle 在此过程中表现不同。既然,它是同一个绑定(bind)变量,一个绑定(bind)参数应该就足够了吧..!!?请解释我在哪里弄错了我的逻辑。

最佳答案

@ethan 和 @ManiSankar 在我的场景中我也遇到了同样的问题。我使用某种蛮力技术解决了这个问题。我所做的是
在这之前
立即执行 lv_query INTO col_value USING col_name ;
我在代码中添加了替换条件,方法是将参数替换为所需的值,然后在没有“使用”子句的情况下调用“立即执行”

lv_query := replace(lv_query, ':1',col_name);
EXECUTE IMMEDIATE lv_query INTO col_value;
我不知道这是最佳选择,但可以满足我的期望..
请问这个推荐不推荐。。。

关于oracle - 使用带有多个相同绑定(bind)参数的 EXECUTE IMMEDIATE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21899011/

相关文章:

oracle - "union"或 "variant record"的规范表达式?

python - 将列表传递给 PL/SQL 过程

c# - 尝试插入 schema.table.ID 时出现 ORA-01400

oracle - 输入重复序列号时增加数量字段

oracle - 当变量为 null 时则为 null 的情况

oracle - 使用 Oracle PL/SQL For 循环遍历逗号分隔的字符串

sql - PL/SQL插入一个表减去另一个表但同时插入另一列

Oracle:通过联合等组合两个group by查询(使用聚合函数count())以获得合并结果

sql - 在 Oracle10g 中有条件地选择多个列

java - JPA Eclipselink 数据库更改通知不会使缓存条目无效