我想知道在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。”我没有得到这个:(
感谢任何帮助。
答案 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。这是将为每列返回的数据
这适用于所有选择语句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.