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