Вопрос

Запуск 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 сможет компилировать подзапросы внутри вычисления значений:

то есть.

INSERT into table1 (col1) values ( (select t2.singleCol from table2 t2 where t2.priKey = :priKey) )

Это ожидаемое поведение Pro*C?или Должен ли он поддерживать подзапросы в разделе значений?

Это было полезно?

Решение

Возможно, изменить подзапрос на:

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

Есть ли определенная причина, почему вам нужно использовать скалярные курсоры в пункте значений?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top