2012-02-15 62 views
0

我正在准备一个屏幕,其中用户将输入plsql的一个匿名块(declare ... begin ... end),并且将它的块保存到一个文件中,并在需要时运行它。 但我想验证用户对我的数据库的输入,无论它在执行前是否有语法错误。当我GOOGLE了它,我发现我可以使用antlr,但我找不到任何工作示例。任何人都可以给我一个示例,我可以在java和plsql上下文中找到其他解决方案。验证一个plsql块

+2

您确定要允许用户在数据库中运行命令吗?你将如何防止他破坏你的数据库(有意或无意)? – 2012-02-15 10:05:35

+0

我的应用程序将被系统管理员使用。滥用现在不是一个问题。 – dursun 2012-02-15 11:04:02

+0

@dursun系统管理员与其他任何人一样易犯错。一个小错字,它可能会出现可怕的错误... – 2012-02-16 12:02:54

回答

3

你可以用DBMS_SQL解析PLSQL命令:

SQL> CREATE OR REPLACE PROCEDURE parse(p_command VARCHAR2) AUTHID CURRENT_USER IS 
    2  l_cursor INTEGER; 
    3 BEGIN 
    4  l_cursor := dbms_sql.open_cursor; 
    5  dbms_sql.parse(l_cursor, p_command, dbms_sql.native); 
    6  dbms_sql.close_cursor(l_cursor); 
    7 EXCEPTION 
    8  WHEN OTHERS THEN 
    9  dbms_sql.close_cursor(l_cursor); 
10  RAISE; 
11 END; 
12/

Procedure created 

SQL> exec parse ('BEGIN NULL;END;'); 

PL/SQL procedure successfully completed 

SQL> exec parse ('BEGIN incorrect_statement;END;'); 

begin parse ('BEGIN incorrect_statement;END;'); end; 

ERROR at line 1: 
ORA-06550: line 1, column 7: 
PLS-00201: identifier 'INCORRECT_STATEMENT' must be declared 

小心你解析什么,但:DDL将在解析被执行(!)。

+3

勇敢的研究员,“dursun” – 2012-02-15 20:04:00

+0

@RogerCornejo它将如何危险 – dursun 2012-02-17 07:05:40

+0

@dursun - 基本上,代码将运行任何东西,可能包括SQL注入(“黑客金矿”)。 – 2012-03-28 12:14:26