Oracle中执行立即报错
Execute immediate error in Oracle
我想通过游标执行以下命令,其中列名和列值位于不同的 table。
但是脚本失败并显示以下错误消息。
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;
我已将此查询放在 运行 员工需要的程序中。
您的值 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;
您的 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;
我想通过游标执行以下命令,其中列名和列值位于不同的 table。
但是脚本失败并显示以下错误消息。
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;
我已将此查询放在 运行 员工需要的程序中。
您的值 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;
您的 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;