我正在尝试使用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;
为什么会这样?
答案 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”命令行实用程序并省去所有这些。