解析PL / SQL代码以检查语法和语义错误
请考虑以下情况:
- 我在UI上有一个文本区域和一个按钮 。
- 用户将在Text-Area中输入PL / SQL块。
- 当用户按下Button时 ,我想检查该块中的语法和语义错误而不执行它。
我真的想要一个解决方案,我不需要再安装任何东西。
环境信息:
- Java 1.6.31
- Oracle数据库11g
SQL> explain plan for select from dual; explain plan for select from dual * ERROR at line 1: ORA-00936: missing expression SQL> explain plan for select * from dual; Explained.
要么
declare c integer := dbms_sql.open_cursor(); begin dbms_sql.parse(c, 'select * emp', dbms_sql.native); dbms_sql.close_cursor(c); end; / Error at line 1 ORA-00923: FROM keyword not found where expected ORA-06512: at "SYS.DBMS_SQL", line 1053 ORA-06512: at line 4
或点击http://www.softpedia.com/get/Internet/Servers/Database-Utils/EasySQL-Checker-for-Oracle.shtml
这很困难,您可能必须考虑所有可能性并确保用户不会通过确保授予非常少的权限来破坏您的数据库。您明白了。
这不是完整的解决方案,但它指出了正确的方向。
您可以尝试将其嵌入到CREATE or REPLACE PROCEDURE
并获取错误。 像这样的东西:
declare text_area varchar2(4000) := 'declare x number; begin xy := x + 1; end;'; begin execute immediate 'create or replace procedure DUMMY#__ IS BEGIN null; begin '|| text_area ||' end; END;'; exception -- see comment below about error handling when others then -- signal yourself it went wrong RAISE; end;
匿名阻止的问题在于它是立即被执行的。 但是这样你只执行编译过程的创建。 如果您有多个用户,则可能需要创建不同的过程名称,或者您希望创建不同的模式以防止冲突。 正如我所说,这不是完整的解决方案,只是指向一些方向。
“编译错误的ORA-23344成功”可用于获取编译错误。
我认为你需要一个PL / SQL解释器。 它可以检查几乎给定的代码语法。 如果要进行全面检查,则不容易,您必须检查数据库对象,属性。 权限等
你可以自己创建一个PL / SQL解释器来确保你的需求,或者你可以尝试这个解析器: https : //github.com/porcelli/plsql-parser
顺便说一句,我将遇到“立即执行” – 调用问题。
如果您确实可以访问包含相关表的正在运行的Oracle系统,则可以使用dbms_sql.parse()
来检查给定的SQL是否有效。
常规DML语句不通过parse()
执行,但DDL 将立即执行。 因此,您可能希望检查SQL是否不是DDL语句(或者更好,只允许某些语句开头)。
请注意,如果要连接的数据库不包含SQL中使用的表,则即使语句在语法上正确, parse()
也会抛出错误。