请考虑以下情况:
我真的想要一个解决方案,我不需要再安装任何东西了。
环境信息:
答案 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()
将抛出错误,即使语句在语法上是正确的。