УСТАНОВИТЬ FMTONLY ON в запросах Oracle - PullRequest
2 голосов
/ 10 ноября 2010

Я хотел бы знать, можно ли использовать SET FMTONLY ON в запросах Oracle. Когда я использую так:

SET FMTONLY ON select * from department

Я получаю сообщение как таковое:

Строка 1: команда SQLPLUS пропущена: УСТАНОВИТЬ FMTONLY ON выберите * из отдела

Я ищу заявление в Oracle, что

, который возвращает клиенту только метаданные для проверки формата ответа без фактического выполнения запроса.

EDIT

Спасибо .... Я хочу что-то общее для всех типов запросов, если запрос содержит какой-либо 'order by', мы не можем добавить это. Если это запрос на вставку, он должен просто проверить запрос, теперь я делаю откат, чтобы просто проверить запрос (а затем выполнить его во время выполнения). SET FMTONLY помогает мне добиться этого в SQL, что-то похожее в Oracle ?? ??.

И «СОЗДАЙТЕ ТАБЛИЦУ FormatTest AS (ВЫБРАТЬ ...), а затем выполните ОПИСАНИЕ FormatTest». Я не получил это: (

Любая помощь приветствуется.

Ответы [ 3 ]

2 голосов
/ 11 ноября 2010

Согласно this , SET FMTONLY ON :

Возвращает клиенту только метаданные.Может использоваться для проверки формата ответа без фактического выполнения запроса.

Строки не обрабатываются и не отправляются клиенту из-за запроса, когда параметр SET FMTONLY включен.

Поэтому я предполагаю, что в результате либо (а) утверждение выполнено успешно, но ничего не происходит;или (b) оператор не выполняется, и возникает исключение.

Следовательно, вы можете добиться аналогичного эффекта в Oracle, запустив 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 голосов
/ 10 ноября 2010

Это не совсем то же самое, но вы можете добавить WHERE rownum<=1 к вашему запросу.Это позволит вам оценить формат на основе одной строки.

Это немного излишне, но вы можете сделать CREATE TABLE FormatTest AS (SELECT ...), а затем сделать DESCRIBE FormatTest.

РЕДАКТИРОВАТЬ:

Исходя из ваших последних изменений, кажется, что вы ищете подтверждение утверждения, а не макет, и в этом случае Янек Богуки или Джеффри Кемп имеют лучшие ответы.

1 голос
/ 10 ноября 2010

Посмотрите на DBMS_SQL.DESCRIBE_COLUMNS . Это данные, которые будут возвращены для каждого столбца,

alt text

Это будет работать с любым оператором select afaik, например, я попытался выполнить этот запрос, изменив Пример 8: Опишите столбцы , и он заработал,

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.
...