通过 Oracle 的 JDBC 驱动程序解析 SQL

发布于 2024-09-26 04:25:15 字数 274 浏览 2 评论 0原文

我想测试给定的 SQL 语句在语法和语义上是否有效(即没有语法错误和字段拼写错误)。

对于大多数数据库,Connection.prepareStatementPreparedStatement.getMetaData 就可以解决问题(没有例外 == 良好的查询)。不幸的是,Oracle 的最新驱动程序仅像这样解析 SELECT 查询,而不解析其他类型的查询。老司机甚至不会这样做。

Oracle 是否提供了一些其他工具来解析 SQL 语句?

I'd like to test whether given SQL statement is syntactically and semantically valid (ie. no syntax errors and no field misspellings).

For most databases Connection.prepareStatement and PreparedStatement.getMetaData would do the trick (no exception == good query). Unfortunately Oracle's newest driver only parses like this only SELECT queries, but not other kind of queries. Older drivers don't do even that.

Is there some other facility provided by Oracle for parsing SQL statements?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

北陌 2024-10-03 04:25:15

您可以使用 Oracle DBMS_SQL 包来解析字符串中保存的语句。例如:

SQL> declare
  2    c integer;
  3    l_statement varchar2(4000) := 'insert into mytable (col) values (1,2)';
  4  begin
  5    c := dbms_sql.open_cursor;
  6    dbms_sql.parse(c,l_statement,dbms_sql.native);
  7    dbms_sql.close_cursor(c);
  8  end;
  9  /
declare
*
ERROR at line 1:
ORA-00913: too many values
ORA-06512: at "SYS.DBMS_SYS_SQL", line 824
ORA-06512: at "SYS.DBMS_SQL", line 32
ORA-06512: at line 6

您可以将其包装到一个存储函数中,如果语句有效则返回 1,如果无效则返回 0,如下所示:

function sql_is_valid
  ( p_statement varchar2
  ) return integer
is  
  c integer;
begin
  c := dbms_sql.open_cursor;
  dbms_sql.parse(c,p_statement,dbms_sql.native);
  dbms_sql.close_cursor(c);
  return 1;
exception
  when others then 
    return 0;
end;

然后您可以像下面的 PL/SQL 示例一样使用它:

:n := sql_is_valid('insert into mytable (col) values (1,2)');

You can use the Oracle DBMS_SQL package to parse a statement held in a string. For example:

SQL> declare
  2    c integer;
  3    l_statement varchar2(4000) := 'insert into mytable (col) values (1,2)';
  4  begin
  5    c := dbms_sql.open_cursor;
  6    dbms_sql.parse(c,l_statement,dbms_sql.native);
  7    dbms_sql.close_cursor(c);
  8  end;
  9  /
declare
*
ERROR at line 1:
ORA-00913: too many values
ORA-06512: at "SYS.DBMS_SYS_SQL", line 824
ORA-06512: at "SYS.DBMS_SQL", line 32
ORA-06512: at line 6

You could wrap that up into a stored function that just returned e.g. 1 if the statement was valid, 0 if invalid, like this:

function sql_is_valid
  ( p_statement varchar2
  ) return integer
is  
  c integer;
begin
  c := dbms_sql.open_cursor;
  dbms_sql.parse(c,p_statement,dbms_sql.native);
  dbms_sql.close_cursor(c);
  return 1;
exception
  when others then 
    return 0;
end;

You could then use it something like this PL/SQL example:

:n := sql_is_valid('insert into mytable (col) values (1,2)');
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文