PL/SQL 动态程序问题 sql
PL/SQL procedure issue on Dynamic sql
以下是示例过程
CREATE OR REPLACE MXADMIN.PROCEDURE SP_UPDATE_QTY (
TABLENAME NVARCHAR2,
ID IN NUMBER)
IS
SQL_STMT VARCHAR2 (1000);
BEGIN
SQL_STMT :=
'UPDATE MXADMIN.SAMPLE_TEST SET PROCESSED_RECORDS = ( SELECT COUNT(*) FROM MXADMIN.'|| TABLE_NAME ||' WHERE ID = ' || ID || ')' || ', MODIFIED_DATE = SYSDATE'|| ' WHERE ID = ' || ID || ';';
DBMS_OUTPUT.PUT_LINE(SQL_STMT);
EXECUTE IMMEDIATE SQL_STMT;
COMMIT;
END;
尝试执行为
EXEC MXADMIN.PROCEDURE SP_UPDATE_QTY ('TEMP_RECORDS',100);
打印输出如下:
UPDATE MXADMIN.SAMPLE_TEST SET PROCESSED_RECORDS = (SELECT COUNT (*)
FROM MXADMIN.TEMP_RECORDS WHERE ID = 100) WHERE ID =100;
我收到错误消息
Error at line 1
ORA-00933: SQL command not properly ended
ORA-06512: at "MXADMIN.PROCEDURE SP_UPDATE_QTY", line 11
ORA-06512: at line 1
如果我在打印输出中复制 sql 并 运行 它,它工作正常。当我通过提供值 运行 proc 时,它会抛出错误。请帮我解决这个动态 sql
删除动态SQL语句中最后的semi-colon,这里:
... ' WHERE ID = ' || ID || ';';
------
here
因为它提高了
ORA-00933: SQL command not properly ended
错误。
您有多个错误,包括:
CREATE OR REPLACE MXADMIN.PROCEDURE SP_UPDATE_QTY
应该是 CREATE OR REPLACE PROCEDURE MXADMIN.SP_UPDATE_QTY
- 参数是
TABLENAME
但在动态查询中使用 TABLE_NAME
。
- 您不希望
;
位于动态 SQL 字符串的末尾。
- 您应该为
id
值使用绑定变量,如果没有必要,切勿使用字符串连接。
- 您还应该声明动态 table 名称有效。
像这样:
CREATE OR REPLACE PROCEDURE MXADMIN.SP_UPDATE_QTY (
TABLENAME IN NVARCHAR2,
ID IN NUMBER
)
IS
SQL_STMT VARCHAR2(1000);
BEGIN
SQL_STMT := 'UPDATE MXADMIN.SAMPLE_TEST
SET PROCESSED_RECORDS = (SELECT COUNT(*)
FROM MXADMIN.'|| DBMS_ASSERT.QUALIFIED_SQL_NAME(TABLENAME) ||'
WHERE ID = :1),
MODIFIED_DATE = SYSDATE
WHERE ID = :2';
DBMS_OUTPUT.PUT_LINE(SQL_STMT);
EXECUTE IMMEDIATE SQL_STMT USING id, id;
COMMIT;
END;
/
db<>fiddle here
以下是示例过程
CREATE OR REPLACE MXADMIN.PROCEDURE SP_UPDATE_QTY (
TABLENAME NVARCHAR2,
ID IN NUMBER)
IS
SQL_STMT VARCHAR2 (1000);
BEGIN
SQL_STMT :=
'UPDATE MXADMIN.SAMPLE_TEST SET PROCESSED_RECORDS = ( SELECT COUNT(*) FROM MXADMIN.'|| TABLE_NAME ||' WHERE ID = ' || ID || ')' || ', MODIFIED_DATE = SYSDATE'|| ' WHERE ID = ' || ID || ';';
DBMS_OUTPUT.PUT_LINE(SQL_STMT);
EXECUTE IMMEDIATE SQL_STMT;
COMMIT;
END;
尝试执行为
EXEC MXADMIN.PROCEDURE SP_UPDATE_QTY ('TEMP_RECORDS',100);
打印输出如下:
UPDATE MXADMIN.SAMPLE_TEST SET PROCESSED_RECORDS = (SELECT COUNT (*)
FROM MXADMIN.TEMP_RECORDS WHERE ID = 100) WHERE ID =100;
我收到错误消息
Error at line 1
ORA-00933: SQL command not properly ended
ORA-06512: at "MXADMIN.PROCEDURE SP_UPDATE_QTY", line 11
ORA-06512: at line 1
如果我在打印输出中复制 sql 并 运行 它,它工作正常。当我通过提供值 运行 proc 时,它会抛出错误。请帮我解决这个动态 sql
删除动态SQL语句中最后的semi-colon,这里:
... ' WHERE ID = ' || ID || ';';
------
here
因为它提高了
ORA-00933: SQL command not properly ended
错误。
您有多个错误,包括:
CREATE OR REPLACE MXADMIN.PROCEDURE SP_UPDATE_QTY
应该是CREATE OR REPLACE PROCEDURE MXADMIN.SP_UPDATE_QTY
- 参数是
TABLENAME
但在动态查询中使用TABLE_NAME
。 - 您不希望
;
位于动态 SQL 字符串的末尾。 - 您应该为
id
值使用绑定变量,如果没有必要,切勿使用字符串连接。 - 您还应该声明动态 table 名称有效。
像这样:
CREATE OR REPLACE PROCEDURE MXADMIN.SP_UPDATE_QTY (
TABLENAME IN NVARCHAR2,
ID IN NUMBER
)
IS
SQL_STMT VARCHAR2(1000);
BEGIN
SQL_STMT := 'UPDATE MXADMIN.SAMPLE_TEST
SET PROCESSED_RECORDS = (SELECT COUNT(*)
FROM MXADMIN.'|| DBMS_ASSERT.QUALIFIED_SQL_NAME(TABLENAME) ||'
WHERE ID = :1),
MODIFIED_DATE = SYSDATE
WHERE ID = :2';
DBMS_OUTPUT.PUT_LINE(SQL_STMT);
EXECUTE IMMEDIATE SQL_STMT USING id, id;
COMMIT;
END;
/
db<>fiddle here