解析PL / SQL代码以检查语法和语义错误

时间:2014-11-24 12:23:56

标签: java oracle plsql

请考虑以下情况:

  • 我在用户界面上有文字区按钮
  • 用户将在文本区域中输入PL / SQL块。
  • 当用户按按钮时,我想在没有执行
  • 的情况下检查该块中的语法和语义错误。

我真的想要一个解决方案,我不需要再安装任何东西了。

环境信息:

  1. Java 1.6.31
  2. Oracle数据库11g

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

这很困难,您可能必须考虑所有可能性,并确保用户不会通过确保授予非常少的权利来破坏您的数据库。您明白了。

这不是完整的解决方案,但它指出了正确的方向。

您可以尝试将其嵌入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成功编译错误"可用于获取编译错误。

答案 2 :(得分:1)

我认为你需要一个PL / SQL解释器。它可以检查几乎给定的代码语法。 如果要进行全面检查,则不容易,您必须检查数据库对象,属性。权限等。

您可以创建自己的PL / SQL解释器以确保您的要求,或者您可以尝试此解析器:https://github.com/porcelli/plsql-parser

顺便说一句,我将遇到“执行立即”-calls。

答案 3 :(得分:1)

如果您确实可以访问包含相关表的正在运行的Oracle系统,则可以使用dbms_sql.parse()检查给定的SQL是否有效。

常规DML语句不是通过parse()执行,而是DDL 立即执行。因此,您可能希望检查SQL是否不是DDL语句(或者更好,只允许某些语句开头)。

请注意,如果要连接的数据库不包含SQL中使用的表,parse() 抛出错误,即使语句在语法上是正确的。