gpt4 book ai didi

database - 带有内联注释的 Oracle 存储过程包装编译错误

转载 作者:搜寻专家 更新时间:2023-10-30 19:45:42 24 4
gpt4 key购买 nike

我正在尝试使用 dbms_ddl.create_wrapped() 方法在 Oracle 中包装一个存储过程。如果存储过程包含内联注释,我会得到 ORA-24344: success with compilation error

错误:

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;

为什么会这样?

最佳答案

如果你在调用后执行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”命令行实用程序并省去所有这些。

关于database - 带有内联注释的 Oracle 存储过程包装编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30698599/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com