在Oracle中执行立即错误

时间:2015-01-26 11:29:05

标签: oracle plsql plsqldeveloper

我想通过游标执行以下命令,其中我在不同的表中有列名和列值。

但是脚本失败并显示以下错误消息。

ORA-00933:SQL命令未正确结束

execute immediate 'UPDATE EMP_DETAILS_T SET ' || EMP_REC.COLUMN_NAME || ' = ' || '''' || EMP_REC.VALUE ||''' ' || ' where employee_id = ' || ''''|| EMP_REC.EMPLOYEE_ID || ''' '  ;

整个命令如下。

DECLARE 
CURSOR CR_EMP_ATT IS
SELECT COLUMN_NAME,
       VALUE,
       EMPLOYEE_ID
FROM  UPDATE_DATA_T
WHERE EMPLOYEE_ID = P_EMP_ID;

BEGIN


FOR CR_EMP IN CR_EMP_ATT LOOP

    BEGIN
    EXECUTE IMMEDIATE 'Update EMP_DETAILS_T set ' || CR_EMP.COLUMN_NAME || ' = ' ||''''||CR_EMP.VALUE||''''|| '  where employee_id  =  ' ||''''|| P_EMP_ID||'''';
    DBMS_OUTPUT.PUT_LINE('temp table updated');
    END;

END LOOP;

END;

我已将此查询放在一个程序中,以便在员工需要时运行。

2 个答案:

答案 0 :(得分:2)

您的值CR_EMP.VALUE是否包含任何'字符?

这是使用绑定变量的另一个原因,即

EXECUTE IMMEDIATE 'Update EMP_DETAILS_T set '||CR_EMP.COLUMN_NAME||' = ' :val WHERE employee_id = :id' 
USING CR_EMP.VALUE, P_EMP_ID;

答案 1 :(得分:2)

您的value列包含包含单引号的值。 (&符号不会成为问题)。您可以通过在执行之前显示它来查看它如何打破语句:

dbms_output.put_line('Update EMP_DETAILS_T set ' || CR_EMP.COLUMN_NAME
  || ' = ' ||''''||CR_EMP.VALUE||''''|| '  where employee_id  =  '
  ||''''|| P_EMP_ID||'''');

......揭示:

Update EMP_DETAILS_T set SOME_COLUMN = 'Standard & Poor's'  where employee_id  =  'ABC123'

......单引号不平衡;你甚至可以在语法高亮中看到它。

最简单的解决方法是对两个值使用绑定变量 - 不能用于列名 - 并使用USING子句传递实际值:

EXECUTE IMMEDIATE 'Update EMP_DETAILS_T set ' || CR_EMP.COLUMN_NAME
    || ' = :VALUE where employee_id = :EMP_ID'
    USING CR_EMP.VALUE, P_EMP_ID;