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

Oracle 使用PL/SQL解析有效的WHERE子句语法

askTom 2017-02-18
319

问题描述

我在表中有一个谓词列,该列存储必须是有效WHERE子句的文本

SEQ谓词
--- ---------
1 EMPNO in (从emp中选择mgr) 和 (COMISSION为null或SAL> 100)
2 RTRIM (最后名称),如 “% KYTE %”

如何解析PL/SQL中的谓词并确定它是否是有效的WHERE子句?

需要什么:
1.我需要有效谓词在语法上是否正确?

不需要的是:
1.我不需要检查数据库中是否存在EMPNO,COMMISSION列。这是因为这些列可能不存在于同一数据库中。
2.我不必检查列所属的表是否具有所需的授权,对架构的访问权限

专家解答

您可以使用dbms_sql.parse,例如

SQL> declare
  2      p_query varchar2(32767) := 'select * from scott.emp where EMPNO in ( select mgr from emp) AND ( COMM is null or SAL > 100 )';
  3      l_theCursor     integer default dbms_sql.open_cursor;
  4  begin
  5      dbms_sql.parse(  l_theCursor,  p_query, dbms_sql.native );
  6  end;
  7  /

PL/SQL procedure successfully completed.

SQL>
SQL>
SQL> declare
  2      p_query varchar2(32767) := 'select * from scott.emp where EMPNO in ( select mgr from emp) AND  ( ( COMM is null or SAL > 100 )';
  3      l_theCursor     integer default dbms_sql.open_cursor;
  4  begin
  5      dbms_sql.parse(  l_theCursor,  p_query, dbms_sql.native );
  6  end;
  7  /
declare
*
ERROR at line 1:
ORA-00907: missing right parenthesis
ORA-06512: at "SYS.DBMS_SQL", line 1120
ORA-06512: at line 5
复制


这是一个完整的解析,所以如果你只是想知道SQL在语法上是正确的 (即使表等不存在),那么这是一个更艰难的命题。

您需要通过parse运行它,并根据错误代码,决定是否允许SQL被视为有效。

例如,如果检查 “where EMPNO = 10”,则可以执行

SQL> declare
  2      p_query varchar2(32767) := 'select * from dual where EMPNO = 10';
  3      l_theCursor     integer default dbms_sql.open_cursor;
  4  begin
  5      dbms_sql.parse(  l_theCursor,  p_query, dbms_sql.native );
  6  end;
  7  /
declare
*
ERROR at line 1:
ORA-00904: "EMPNO": invalid identifier
ORA-06512: at "SYS.DBMS_SQL", line 1120
ORA-06512: at line 5
复制


然后将904捕获为 “ok”,因为它不一定是语法错误,而类似

SQL> declare
  2      p_query varchar2(32767) := 'select * from dual where A'' = 10';
  3      l_theCursor     integer default dbms_sql.open_cursor;
  4  begin
  5      dbms_sql.parse(  l_theCursor,  p_query, dbms_sql.native );
  6  end;
  7  /
declare
*
ERROR at line 1:
ORA-01756: quoted string not properly terminated
ORA-06512: at "SYS.DBMS_SQL", line 1120
ORA-06512: at line 5
复制


* 将 * 定义为语法错误。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论