以下是示例程序
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;
我收到錯誤
第 1 行出錯
ORA-00933: SQL 命令未正確結束
ORA-06512:在“MXADMIN.PROCEDURE SP_UPDATE_QTY”,第 11 行
ORA-06512: 在第 1 行
如果我在列印輸出中復制 sql 并運行它,它作業正常。當我通過提供值來運行 proc 時,它會引發錯誤。請幫助我處理這個動態 sql
uj5u.com熱心網友回復:
您有多個錯誤,包括:
CREATE OR REPLACE MXADMIN.PROCEDURE SP_UPDATE_QTY應該CREATE OR REPLACE PROCEDURE MXADMIN.SP_UPDATE_QTY- 該引數是
TABLENAME但在動態查詢TABLE_NAME中使用。 - 您不希望
;在動態 SQL 字串的末尾。 - 您應該對
id值使用系結變數,如果不需要,切勿使用字串連接。 - 您還應該斷言動態表名是有效的。
像這樣:
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<>在這里擺弄
uj5u.com熱心網友回復:
洗掉動態 SQL 陳述句中的最后一個分號,這里:
... ' WHERE ID = ' || ID || ';';
------
here
因為它提高了
ORA-00933: SQL 命令未正確結束
錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/472542.html
