在 Oracle 查询中设置 FMTONLY ON
Posted
技术标签:
【中文标题】在 Oracle 查询中设置 FMTONLY ON【英文标题】:SET FMTONLY ON in Oracle queries 【发布时间】:2010-11-10 10:14:42 【问题描述】:我想知道SET FMTONLY ON
是否可以在Oracle 查询中使用。当我这样使用时:
SET FMTONLY ON select * from department
我收到这样的消息:
第 1 行:跳过 SQLPLUS 命令:SET FMTONLY ON select * from department
我在 Oracle 中寻找一个声明
只向客户端返回元数据以测试响应的格式,而不实际运行查询。
编辑
谢谢....我想要所有类型的查询通用的东西,如果查询包含任何“order by”,那么我们不能添加它。如果它是插入查询,它应该只是验证查询,现在我正在回滚以验证查询(然后在运行时执行它) SET FMTONLY 帮助我在 SQL 中实现它,在 Oracle 中类似? ??。
然后“CREATE TABLE FormatTest AS (SELECT ...) 然后执行 DESCRIBE FormatTest。”我没有得到这个:(
感谢任何帮助。
【问题讨论】:
"SET FMTONLY ON" 是一个 MS SQL Server 命令,所以我不确定你为什么希望它在 Oracle 中工作! Oracle 中有没有等价的? 【参考方案1】:根据this,SET FMTONLY ON:
仅将元数据返回给客户端。 可用于测试格式 在没有实际运行的情况下响应 查询。
没有行被处理或发送到 客户端因为 SET 时的请求 FMTONLY 已开启。
因此,我猜测结果是(a)语句成功,并且没有任何反应;或 (b) 语句失败,并引发异常。
因此,您可以通过运行EXPLAIN PLAN FOR xxx
在Oracle 中实现类似的效果,例如:
SQL> EXPLAIN PLAN FOR insert into baddml values (1);
explain plan for INSERT INTO baddml VALUES (1)
*
ERROR at line 1:
ORA-00942: table or view does not exist
如果语句成功,则可以假定该语句在语法上是有效的。
【讨论】:
+1 这似乎是寻求语句验证的最简单途径。【参考方案2】:并不完全相同,但您可以将WHERE rownum<=1
添加到您的查询中。它可以让您根据一行来评估格式。
这有点矫枉过正,但您可以先输入CREATE TABLE FormatTest AS (SELECT ...)
,然后再输入DESCRIBE FormatTest
。
编辑:
根据您最近的编辑,听起来您正在寻找语句验证而不是布局,在这种情况下,Janek Bogucki 或 Jeffrey Kemp 有更好的答案。
【讨论】:
【参考方案3】:看看DBMS_SQL.DESCRIBE_COLUMNS。这是每列将返回的数据,
这将适用于任何 select 语句 afaik,例如,我通过修改 Example 8: Describe Columns 尝试了此查询并且它有效,
DBMS_SQL.PARSE(c, 'SELECT sysdate, b.* FROM scott.bonus b', DBMS_SQL.NATIVE);
col_type = 12
col_maxlen = 7
col_name = SYSDATE
col_name_len = 7
col_schema_name =
col_schema_name_len = 0
col_precision = 0
col_scale = 0
col_null_ok = true
col_type = 1
col_maxlen = 10
col_name = ENAME
col_name_len = 5
col_schema_name =
col_schema_name_len = 0
col_precision = 0
col_scale = 0
col_null_ok = true
col_type = 1
col_maxlen = 9
col_name = JOB
col_name_len = 3
col_schema_name =
col_schema_name_len = 0
col_precision = 0
col_scale = 0
col_null_ok = true
col_type = 2
col_maxlen = 22
col_name = SAL
col_name_len = 3
col_schema_name =
col_schema_name_len = 0
col_precision = 0
col_scale = -127
col_null_ok = true
col_type = 2
col_maxlen = 22
col_name = COMM
col_name_len = 4
col_schema_name =
col_schema_name_len = 0
col_precision = 0
col_scale = -127
col_null_ok = true
PL/SQL procedure successfully completed.
【讨论】:
以上是关于在 Oracle 查询中设置 FMTONLY ON的主要内容,如果未能解决你的问题,请参考以下文章
我应该在应用程序的所有 SELECT 查询中设置 ARITHABORT ON
如何使用java在hibernate 3 + oracle中设置查询级别超时