Pergunta

Executando Pro*C no Oracle 10g.

Estou procurando fazer uma subconsulta dentro de uma cláusula de valores de instrução de inserção.Esta consulta sql é totalmente válida e é executada no TOAD sem problemas, mas o Pro*C não consegue analisar a consulta.

EXEC SQL INSERT INTO TARGET_ATTACHMENT 
      (
          TARGET_ID
          FILENAME
      ) 
      VALUES ( 
         :targetID,
         ( SELECT CREATED_FLAG from TARGET t where t.TARGET_ID = :targetID ) || '.tif'
      )

Se eu remover:

( SELECT (CREATED_FLAG || DISPLAY_ID) from TARGET t where t.TARGET_ID = :targetID ) ||**". 

O compilador Pro*C funciona e tudo é compilado e executado conforme o esperado.

Se eu NÃO remover:O compilador Pro*C gera um erro de sintaxe.

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,

Isso é um problema, pois espero que o Pro*C seja capaz de compilar subconsultas dentro de um cálculo de valores:

ou seja.

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

Esse é o comportamento esperado do Pro*C?ou Deveria suportar subconsultas dentro da cláusula de valores?

Foi útil?

Solução

Possivelmente altere a subconsulta para:

( SELECT CREATED_FLAG || '.tif' from TARGET t where t.TARGET_ID = :targetID ) 

Acho que nunca vi algo anexado a uma subconsulta da maneira que você estava tentando.

Outras dicas

A quantidade de SQL que o pré-processador Pro*C é capaz de analisar em instruções SQL estáticas é bastante limitada.Por exemplo, não é possível nem analisar explícito inner joiner/outer left join etc.notação.

Como solução alternativa, você pode simplesmente preparar uma instrução SQL dinâmica e executá-la - mesmo que sua instrução SQL não seja realmente dinâmica.

O código que você postou é logicamente idêntico a este:

INSERT INTO TARGET_ATTACHMENT       
  ( TARGET_ID ,  FILENAME )      
 select    :targetID, CREATED_FLAG|| '.tif' 
 from TARGET t 
where t.TARGET_ID = :targetID ) 

Existe uma razão específica pela qual você precisa usar cursores escalares em uma cláusula VALUES?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top