【问题标题】:ORA-14551: cannot perform a DML operation inside a query error while using Execute immediateORA-14551: 使用立即执行时无法在查询错误内执行 DML 操作
【发布时间】:2016-11-08 01:51:14
【问题描述】:
CREATE OR REPLACE FUNCTION XXCHR_UPDATE      (
                                                                P_SALESREP_ID          IN   NUMBER,
                                                                p_COLUMN_NAME           IN     VARCHAR2,
                                                                P_COLUMN_VALUE            IN   varchar2
                                                           )
   RETURN VARCHAR2

IS

   lv_dyn_sql                        VARCHAR2(2000):= NULL;

BEGIN


        lv_dyn_sql := 'UPDATE thirty_days
                SET attribute86 ='||p_COLUMN_NAME||',attribute87 ='||P_COLUMN_VALUE
                || 'WHERE SALESREP_ID = :1';     

    EXECUTE IMMEDIATE lv_dyn_sql using P_SALESREP_ID;

    return(1);



EXCEPTION
      WHEN OTHERS
      THEN
         dbms_output.put_line('Returning Error : '||SQLERRM);
         --lv_return_val:= 0;
     RETURN SQLERRM;

END XXCHR_UPDATE;

当我执行这个函数时,它的返回错误

ORA-14551

请在这里推荐

【问题讨论】:

  • 你用这个函数做什么。 select XXCHR_UPDATE (a,b,c) from dual; ?
  • 也许您需要在 dyn sql 中添加引号?因为输出sql字符串的时候可以看到什么attribute87=attr,但是需要attribute87='attr'
  • 已经问过:stackoverflow.com/questions/8729236/… 顺便说一句,您似乎在p_column_valuewhere 子句之间缺少一个空格。

标签: oracle plsql


【解决方案1】:

为什么不是所有三个参数?摆脱字符串连接:

lv_dyn_sql := q'[UPDATE thirty_days
                    SET attribute86 = :arg1
                      , attribute87 = :arg2
                  WHERE SALESREP_ID = :arg3]';

execute immediate lv_dy_sql using p_column_name, p_column_value, p_salesrepid;

【讨论】:

    【解决方案2】:

    尝试修改您的陈述:

    lv_dyn_sql := 'UPDATE thirty_days
                    SET attribute86 ='||p_COLUMN_NAME||',attribute87 ='||P_COLUMN_VALUE
                    || 'WHERE SALESREP_ID = :1';
    

    lv_dyn_sql := 'UPDATE thirty_days
                    SET attribute86 ='||p_COLUMN_NAME||',attribute87 ='||P_COLUMN_VALUE
                    || 'WHERE SALESREP_ID ='||P_SALESREP_ID;  
    

    当然还有:

    EXECUTE IMMEDIATE lv_dyn_sql;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-04
      • 2013-01-27
      • 2011-11-10
      • 1970-01-01
      • 2019-11-05
      • 2012-02-02
      相关资源
      最近更新 更多