Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 有没有一种方法可以在不执行的情况下获取未知db查询的类型/名称?_Sql_Database_Oracle_Plsql - Fatal编程技术网

Sql 有没有一种方法可以在不执行的情况下获取未知db查询的类型/名称?

Sql 有没有一种方法可以在不执行的情况下获取未知db查询的类型/名称?,sql,database,oracle,plsql,Sql,Database,Oracle,Plsql,我有一个web应用程序,用户可以在其中输入任意sql查询,以便以后进行批处理。我们希望在不实际执行查询的情况下验证查询的语法。有些查询需要很长时间,这就是我们不想执行它们的原因。我正在使用Oracle的dbms_sql.parse来实现这一点 但是,现在我需要知道结果集列的数量和类型。有没有一种方法可以在不实际执行查询的情况下做到这一点?也就是说,让Oracle解析查询并告诉我在实际执行查询时将返回哪些结果数据类型/名称?我使用的是Oracle10g,它是一个Java1.5/Servlet2.4

我有一个web应用程序,用户可以在其中输入任意sql查询,以便以后进行批处理。我们希望在不实际执行查询的情况下验证查询的语法。有些查询需要很长时间,这就是我们不想执行它们的原因。我正在使用Oracle的dbms_sql.parse来实现这一点

但是,现在我需要知道结果集列的数量和类型。有没有一种方法可以在不实际执行查询的情况下做到这一点?也就是说,让Oracle解析查询并告诉我在实际执行查询时将返回哪些结果数据类型/名称?我使用的是Oracle10g,它是一个Java1.5/Servlet2.4应用程序


编辑:输入查询的用户已经是数据库中的用户。他们使用数据库凭据对我的应用进行身份验证,并使用这些凭据执行查询。因此,他们不能放入任何仅通过连接sqlplus无法运行的查询。

您应该能够准备一个SQL查询来验证语法并获取结果集元数据。准备查询时不应执行它

import java.sql.*;
. . .
Connection conn;
. . .
PreparedStatement ps = conn.prepareStatement("SELECT * FROM foo");
ResultSetMetadata rsmd = ps.getMetaData();
int numberOfColumns = rsmd.getColumnCount();

然后,您可以获取有关结果集的每一列的元数据。

如果您希望严格通过pl/sql执行此操作,则可以执行以下操作:

DECLARE 
  lv_stat varchar2(100) := 'select blah blah blah';
  lv_cur INTEGER;
  lv_col_cnt INTEGER;
  lv_desc DBMS_SQL.desc_tab;
BEGIN
  DBMS_SQL.parse(lv_cur,lv_stat,DBMS_SQL.NATIVE);
  DBMS_SQL.describe_columns(lv_cur,lv_col_cnt,lv_desc);
  FOR ndx in lv_desc.FIRST .. lv_desc.LAST LOOP
    DBMS_OUTPUT.PUT_LINE(lv_desc(ndx).col_name ||' '||lv_desc(ndx).col_type);
  END LOOP;
END;

DBMS_SQL.desc_选项卡包含了您需要了解的关于列的几乎所有信息。

您允许用户输入查询吗?这听起来太危险了,我赞成!“从…删除*!”!我也投票反对这种做法!应该允许用户输入值,但不能输入code.HA!我想我不是唯一一个讨厌SQL*Plus的人。他们制作了一个网络应用程序来绕过那个恼人的POS此行是否尝试连接数据库?如果数据库关闭了怎么办?这还能工作吗?@KisHanSarsecHaGajjar,它必须连接到数据库才能解析SQL语句并发现存在哪些列。如果数据库关闭,您的SQL将无法工作。您能否建议其他方法,让我们在不执行或连接数据库的情况下获取查询列?我想解析从用户输入中获取的查询并从中获取列,但在用户配置查询时,如果数据库关闭,他不应该被阻止。@KisHanSarsecHaGajjar,这是一个奇怪的请求。既然无法执行查询,为什么在数据库关闭时需要准备查询?您需要能够解析SQL语法、根据RDBMS表和列中的元数据生成访问计划以及评估SQL表达式语义的代码。如果你有所有这些代码,你基本上会有一个工作的SQL RDBMS,从这个意义上说,数据库不会关闭!