暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 检查有效的SQL语法,而不执行,以及何时架构中不存在对象

askTom 2017-02-13
607

问题描述

我可以在没有在数据库中创建对象的情况下验证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上打开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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论