Oracle ProC ВСТАВЛЯЕТ В ЦЕННОСТИ ( (выберите...))
Запуск Pro * C на Oracle 10g.
Я ищу сделать подзапрос в предложении вставки значений оператора. Этот sql-запрос полностью действителен и без проблем выполняется в TOAD, но Pro * C не может выполнить синтаксический анализ запроса.
EXEC SQL INSERT INTO TARGET_ATTACHMENT
(
TARGET_ID
FILENAME
)
VALUES (
:targetID,
( SELECT CREATED_FLAG from TARGET t where t.TARGET_ID = :targetID ) || '.tif'
)
Если я удалю:
( SELECT (CREATED_FLAG || DISPLAY_ID) from TARGET t where t.TARGET_ID = :targetID ) ||**".
Компилятор Pro * C работает, и все компилируется и работает так, как ожидается.
Если я НЕ удаляю: компилятор Pro * C выдает синтаксическую ошибку.
1>Syntax error at line 128, column 12, file d:\SVN\...\TA.pc:
1>Error at line 128, column 12 in file d:\SVN\...
1>...\TA.pc
1> ( select CREATED_FLAG from target t where t.TARGET_ID = :targetID )
1>...........1
1>PCC-S-02201, Encountered the symbol "CREATED_FLAG" when expecting one of the fol
1>lowing:
1> ( ) * + - / . @ | at, day, hour, minute, month, second, year,
Это проблема, так как я ожидаю, что Pro * C сможет скомпилировать подзапросы внутри значений caluse:
то есть.
INSERT into table1 (col1) values ( (select t2.singleCol from table2 t2 where t2.priKey = :priKey) )
Это ожидаемое поведение Pro*C? или он должен поддерживать подзапросы в предложении значений?
3 ответа
Возможно изменить подзапрос на:
( SELECT CREATED_FLAG || '.tif' from TARGET t where t.TARGET_ID = :targetID )
Я не думаю, что когда-либо видел что-то, добавленное к подзапросу так, как вы пытались.
Количество SQL, которое препроцессор Pro*C может анализировать в статических операторах SQL, весьма ограничено. Например, он не может даже разобрать явный inner joiner
/outer left join
и т. д.
В качестве обходного пути вы можете просто подготовить динамический оператор SQL и выполнить его, даже если ваш оператор SQL на самом деле не является динамическим.
Код, который вы разместили, логически идентичен этому:
INSERT INTO TARGET_ATTACHMENT
( TARGET_ID , FILENAME )
select :targetID, CREATED_FLAG|| '.tif'
from TARGET t
where t.TARGET_ID = :targetID )
Есть ли конкретная причина, по которой вам нужно использовать скалярные курсоры в предложении VALUES?