Oracle存储过程使用内联注释包装编译错误

时间:2015-06-07 21:26:22

标签: database oracle stored-procedures plsql

我正在尝试使用dbms_ddl.create_wrapped()方法在Oracle中包装存储过程。如果存储过程包含内联注释,我会收到ORA-24344:编译错误成功

错误:

BEGIN
dbms_ddl.create_wrapped('CREATE OR REPLACE PROCEDURE TEST_WRAP '
|| '('
|| '  NAME IN VARCHAR2 ' 
|| ') AS '
|| ' theName user_errors.name%TYPE; '
|| ' -- Inline Comment'
|| ' BEGIN '
|| ' BEGIN '
||  '  SELECT Name INTO theName FROM user_errors WHERE name LIKE ''Nothing''; '
||  ' EXCEPTION '
|| '   WHEN NO_DATA_FOUND THEN  '
||  '    NULL; '
|| ' END; '
|| ' EXCEPTION ' 
|| ' WHEN OTHERS THEN '
|| '   NULL; '
|| ' END TEST_WRAP; ');
END;

使用:

BEGIN
dbms_ddl.create_wrapped('CREATE OR REPLACE PROCEDURE TEST_WRAP '
|| '('
|| '  NAME IN VARCHAR2 ' 
|| ') AS '
|| ' theName user_errors.name%TYPE; '
|| ' BEGIN '
|| ' BEGIN '
||  '  SELECT Name INTO theName FROM user_errors WHERE name LIKE ''Nothing''; '
||  ' EXCEPTION '
|| '   WHEN NO_DATA_FOUND THEN  '
||  '    NULL; '
|| ' END; '
|| ' EXCEPTION ' 
|| ' WHEN OTHERS THEN '
|| '   NULL; '
|| ' END TEST_WRAP; ');
END;

为什么会这样?

1 个答案:

答案 0 :(得分:3)

如果您在通话结束后执行show errors,则会看到如下消息:

1/70           PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:

   begin function pragma procedure subtype type <an identifier>
   <a double-quoted delimited-identifier> current cursor delete
   exists prior

以下是您的通话的简化版本。我添加了chr(10)

  BEGIN
dbms_ddl.create_wrapped('CREATE OR REPLACE PROCEDURE TEST_WRAP '
|| '('
|| '  NAME IN VARCHAR2 ' 
|| ') AS '
|| ' theName varchar2(100); '
|| ' -- Inline Comment  ' || chr(10)
|| ' BEGIN '
|| '   NULL; '
|| ' END TEST_WRAP; ');
END;

那么这里发生了什么? pl / sql编译器正在使用您的文字字符串并对其进行解析。没有回车符,您的内联注释包括跟随它的所有文本,并且它被视为注释。添加回车符强制换行,解析器很高兴。因此要么使用“完整”注释,例如/ * blah .. * /,要么根据需要添加回车符。 或者更好的是,只需使用“wrap”命令行实用程序并省去所有这些。