在 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中设置查询级别超时

如何在jdbc中设置锁定超时

如何在 HTML 的输入标签中设置默认值“on”?

如何使用 ADO.NET 在 SQL CE 中设置 NOCOUNT ON?

如何使用 on_delete 属性在用户模型的外键字段中设置用户全名?