我正在准备一个屏幕,其中用户将输入plsql的一个匿名块(declare ... begin ... end),并且将它的块保存到一个文件中,并在需要时运行它。 但我想验证用户对我的数据库的输入,无论它在执行前是否有语法错误。当我GOOGLE了它,我发现我可以使用antlr,但我找不到任何工作示例。任何人都可以给我一个示例,我可以在java和plsql上下文中找到其他解决方案。验证一个plsql块
0
A
回答
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
相关问题
- 1. 块域验证?
- 2. oracle plsql分块行
- 3. ,C#,服务器验证和验证块
- 4. jQuery验证只验证一个字段
- 5. 企业库验证块 - 将条件验证为另一个属性值
- 6. 使用验证应用程序块验证集合至少有一个项目
- 7. 2个验证器一次验证一个
- 8. 列索引无效PLSQL块
- 9. 返回一个PLSQL光标
- 10. 在另一个AngularJS模块中创建验证
- 11. 输入验证号码与显示另一个块
- 12. 企业库验证块
- 13. Kohana 3:验证模块
- 14. yii2 separete模块验证
- 15. 身份验证模块Perl
- 16. 验证模块VS Nhibernate.Validator
- 17. 模块的ActiveRecord验证
- 18. Catch块串/号验证
- 19. 企业库验证块
- 20. Asp.Net身份验证模块
- 21. Kohana验证码模块
- 22. Linux模块验证失败
- 23. 验证豆一个Bean
- 24. 验证一个招摇杆
- 25. 验证到一个样式
- 26. preg_match验证一个URL slug
- 27. Silverlight - 验证一个属性
- 28. 为什么我的PLSQL触发器验证不会失败?
- 29. “验证返回码:21(无法验证第一个证书)”
- 30. VBA验证 - 一个单元格上的多个日期验证
您确定要允许用户在数据库中运行命令吗?你将如何防止他破坏你的数据库(有意或无意)? – 2012-02-15 10:05:35
我的应用程序将被系统管理员使用。滥用现在不是一个问题。 – dursun 2012-02-15 11:04:02
@dursun系统管理员与其他任何人一样易犯错。一个小错字,它可能会出现可怕的错误... – 2012-02-16 12:02:54