在Oracle查询中设置FMTONLY ON

时间:2010-11-10 10:14:43

标签: sql oracle sqlplus

我想知道在Oracle查询中是否可以使用SET FMTONLY ON。当我这样使用时:

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。”我没有得到这个:(

感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

它不完全相同,但您可以在查询中添加WHERE rownum<=1。它允许您根据一行评估格式。

它有点矫枉过正,但您可以CREATE TABLE FormatTest AS (SELECT ...)然后执行DESCRIBE FormatTest

修改

基于您最近的编辑,听起来您正在寻找声明验证而不是布局,在这种情况下,Janek Bogucki或Jeffrey Kemp会有更好的答案。

答案 1 :(得分:2)

根据this SET FMTONLY ON

  

仅返回客户端的元数据。   可以用来测试格式   没有实际运行的响应   查询。

     

没有处理或发送任何行   客户端因为SET时的请求   FMTONLY已开启。

因此,我猜测结果是(a)声明成功,没有任何反应;或(b)该陈述失败,并提出例外。

因此,您可以通过运行EXPLAIN PLAN FOR xxx来实现类似的效果,例如:

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

如果语句成功,则可以假定语句在语法上有效。

答案 2 :(得分:1)

看看DBMS_SQL.DESCRIBE_COLUMNS。这是将为每列返回的数据

alt text

这适用于所有选择语句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.