2012-02-15 68 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