Oracle ProC INSERT INTO VALUES ((selecione…))
-
13-12-2019 - |
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?
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?