问题描述
我可以在没有在数据库中创建对象的情况下验证SQL语法吗?
我有一个自由文本,用户应该在其中输入有效的SQL文本。我必须确定哪些是有效的,哪些是无效的条目。
创建表元数据 (data_src_name varchar2(30),column_name varchar2(30),data_type varchar2(30));
插入元数据 (data_src_name,column_name,data_type) 值 ('tab1','col1','number');
插入元数据 (data_src_name,column_name,data_type) 值 ('tab1','col2','varhar2(100)');
插入元数据 (data_src_name,column_name,data_type) 值 ('tab1','col3','varhar2(200)');
插入元数据 (data_src_name,column_name,data_type) 值 ('tab1','col4','date');
创建表t (id号,data_src_name varchar2(30),filter_condition varchar2(4000),is_valid varchar(10));
插入到t (id,data_src_name,filter_condition,is _ valid) 值 (1,'tab1','col1> 100和col2 = 'abc' ',NULL);
插入到t (id,data_src_name,filter_condition,is _ valid) 值 (2,'tab1','col2 = ''abc'' 和col2 = ''xyz'',NULL);
插入到t (id,data_src_name,filter_condition,is _ valid) 值 (3,'tab1','col1 = 'abc' ',NULL);
插入到t (id,data_src_name,filter_condition,is _ valid) 值 (4,'tab2','col1 = 90',NULL);
这里id = 1将被翻译为: 从tab1中选择1,其中col1> 100,col2 = 'abc';
id = 2将被翻译为: 从tab1中选择1,其中col2 = 'abc' 和col2 = 'xyz';
所需输出:
从t中选择id,是 _ 有效;
id是 _ 有效
--- ---------
1是
2是
3否
4否
is_valid失败的原因-
3. col1是数字
4.Tab2中不存在col1。在 “metdata” 表中定义了可能的组合。
是否有可能没有tab1和tab2实际存在于架构中?只有元数据信息对我可用。
我试图使用dbms_sql.parse。任何指向这一点的建议都将非常有帮助
我有一个自由文本,用户应该在其中输入有效的SQL文本。我必须确定哪些是有效的,哪些是无效的条目。
创建表元数据 (data_src_name varchar2(30),column_name varchar2(30),data_type varchar2(30));
插入元数据 (data_src_name,column_name,data_type) 值 ('tab1','col1','number');
插入元数据 (data_src_name,column_name,data_type) 值 ('tab1','col2','varhar2(100)');
插入元数据 (data_src_name,column_name,data_type) 值 ('tab1','col3','varhar2(200)');
插入元数据 (data_src_name,column_name,data_type) 值 ('tab1','col4','date');
创建表t (id号,data_src_name varchar2(30),filter_condition varchar2(4000),is_valid varchar(10));
插入到t (id,data_src_name,filter_condition,is _ valid) 值 (1,'tab1','col1> 100和col2 = 'abc' ',NULL);
插入到t (id,data_src_name,filter_condition,is _ valid) 值 (2,'tab1','col2 = ''abc'' 和col2 = ''xyz'',NULL);
插入到t (id,data_src_name,filter_condition,is _ valid) 值 (3,'tab1','col1 = 'abc' ',NULL);
插入到t (id,data_src_name,filter_condition,is _ valid) 值 (4,'tab2','col1 = 90',NULL);
这里id = 1将被翻译为: 从tab1中选择1,其中col1> 100,col2 = 'abc';
id = 2将被翻译为: 从tab1中选择1,其中col2 = 'abc' 和col2 = 'xyz';
所需输出:
从t中选择id,是 _ 有效;
id是 _ 有效
--- ---------
1是
2是
3否
4否
is_valid失败的原因-
3. col1是数字
4.Tab2中不存在col1。在 “metdata” 表中定义了可能的组合。
是否有可能没有tab1和tab2实际存在于架构中?只有元数据信息对我可用。
我试图使用dbms_sql.parse。任何指向这一点的建议都将非常有帮助
专家解答
一种简单的方法是尝试在SQL上打开ref光标
或者试着得到一个执行计划
SQL> declare 2 rc sys_refcursor; 3 begin 4 open rc for 'select * from dual'; 5 close rc; 6 end; 7 / PL/SQL procedure successfully completed. SQL> SQL> SQL> declare 2 rc sys_refcursor; 3 begin 4 open rc for 'nonsense'; 5 close rc; 6 end; 7 / declare * ERROR at line 1: ORA-00900: invalid SQL statement ORA-06512: at line 4 SQL> SQL> declare 2 rc sys_refcursor; 3 begin 4 open rc for 'select * from missing_table'; 5 close rc; 6 end; 7 / declare * ERROR at line 1: ORA-00942: table or view does not exist ORA-06512: at line 4 SQL> SQL>
或者试着得到一个执行计划
SQL> exec execute immediate 'explain plan for '|| 'select * from dual'; PL/SQL procedure successfully completed. SQL> exec execute immediate 'explain plan for '|| 'nonsense'; BEGIN execute immediate 'explain plan for '|| 'nonsense'; END; * ERROR at line 1: ORA-00905: missing keyword ORA-06512: at line 1 SQL> exec execute immediate 'explain plan for '|| 'select * from missing_table'; BEGIN execute immediate 'explain plan for '|| 'select * from missing_table'; END; * ERROR at line 1: ORA-00942: table or view does not exist ORA-06512: at line 1
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




