【问题标题】:Problem with Execute immedite立即执行的问题
【发布时间】:2010-10-21 11:47:45
【问题描述】:

我正在尝试使用 Execute Immediate 在下面运行此代码,但它不起作用且值正确。

请建议正确的代码。

declare
v_count number:=1;
v_conc_name varchar2(400);
v_val VARCHAR2(20):='vineet';
BEGIN 
v_conc_name:='INT_AP_PAY_CONV';
EXECUTE IMMEDIATE 'UPDATE xxx_cnc_prg_details
               SET
               PARAMETER'||v_count||'='
               ||v_val||' where CONCURRENT_PROGRAM_SHORT_NAME= '||v_conc_name;

end;  

【问题讨论】:

  • 你得到什么错误信息?

标签: oracle plsql plsqldeveloper


【解决方案1】:

使用绑定变量要容易得多(也是更好的做法):

declare
v_count number:=1;
v_conc_name varchar2(400);
v_val VARCHAR2(20):='vineet';
BEGIN 
v_conc_name:='INT_AP_PAY_CONV';
EXECUTE IMMEDIATE 'UPDATE xxx_cnc_prg_details
               SET
               PARAMETER'||v_count||'=:bv_val
               where CONCURRENT_PROGRAM_SHORT_NAME=:bv_conc_name'
  USING v_val, v_conc_name;

end;  

使用字符串变量来保存 SQL 也是一种方便的做法。然后就可以使用 DBMS_OUTPUT.PUT_LINE 查看验证了:

declare
v_count number:=1;
v_conc_name varchar2(400);
v_val VARCHAR2(20):='vineet';
v_sql LONG;
BEGIN 
v_conc_name:='INT_AP_PAY_CONV';
v_sql := 'UPDATE xxx_cnc_prg_details
               SET
               PARAMETER'||v_count||'=:bv_val
               where CONCURRENT_PROGRAM_SHORT_NAME=:bv_conc_name';
EXECUTE IMMEDIATE v_sql USING v_val, v_conc_name;

end; 

【讨论】:

    【解决方案2】:

    您似乎错过了报价:

    应该是:

     ||' where CONCURRENT_PROGRAM_SHORT_NAME= '''||v_conc_name || '''';
    

    因为 v_conc_name 是 varchar2

    【讨论】:

    • @OmerGertel,我相信PARAMETER后面缺少的空格是正确的,即代码正在生成列名PARAMETER1。
    【解决方案3】:

    我会这样做:

    DECLARE
      c           CONSTANT CHAR := '''';
      v_conc_name VARCHAR2(400) := 'INT_AP_PAY_CONV';
      v_val       VARCHAR2(20)  := 'vineet';
      v_count     NUMBER        := 1;
    BEGIN
      EXECUTE IMMEDIATE 'UPDATE xxx_cnc_prg_details
                         SET
                         PARAMETER'||v_count||' = '||c||v_val||c||'
                         where CONCURRENT_PROGRAM_SHORT_NAME = '||c||v_conc_name||c;
    
    END; 
    

    【讨论】:

    • 如果动态部分很长(在这种情况下不是这样),我更喜欢串联,因为使用绑定变量维护代码有点困难。而且我正在做很多表单代码,我需要更频繁地连接引号字符。
    猜你喜欢
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-04
    • 2012-12-05
    相关资源
    最近更新 更多