Oracle ProC INSÉRER DANS les VALEURS de ( (select ...) )
-
13-12-2019 - |
Question
Pro*C sur Oracle 10g.
Je suis à la recherche de faire une sous-requête dans une instruction insert valeurs de la clause.Cette requête sql est pleinement valide et fonctionne au sein de CRAPAUD avec pas de problèmes, mais en Pro*C ne parvient pas à analyser la requête.
EXEC SQL INSERT INTO TARGET_ATTACHMENT
(
TARGET_ID
FILENAME
)
VALUES (
:targetID,
( SELECT CREATED_FLAG from TARGET t where t.TARGET_ID = :targetID ) || '.tif'
)
Si je supprime:
( SELECT (CREATED_FLAG || DISPLAY_ID) from TARGET t where t.TARGET_ID = :targetID ) ||**".
Le Pro*C compilateur travaille et tout se compile et s'exécute comme prévu.
Si je N'enlève PAS:Le Pro*C compilateur renvoie une erreur de syntaxe.
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,
C'est un problème, comme je m'attends à Pro*C pour être en mesure de compiler subquerys dans un les valeurs caluse:
c'est à dire.
INSERT into table1 (col1) values ( (select t2.singleCol from table2 t2 where t2.priKey = :priKey) )
Est-ce que les comportements attendus de la Pro*C?ou faut-il soutenir les sous-requêtes dans la clause values?
La solution
Changer éventuellement la sous-requête à:
( SELECT CREATED_FLAG || '.tif' from TARGET t where t.TARGET_ID = :targetID )
Je ne pense pas que j'ai jamais vu quelque chose a annoncé à une sous-requête comme vous tenez.
Autres conseils
Le montant de SQL, Pro*C préprocesseur est capable d'analyser en statique SQL est assez limité.Par exemple, il ne peut même pas analyser explicite inner joiner
/outer left join
etc.la notation.
Comme solution de contournement, vous pouvez préparer une instruction SQL dynamique et d'exécuter elle - même si votre instruction SQL n'est pas vraiment dynamique.
Le code que vous avez affiché est logiquement identique à ceci:
INSERT INTO TARGET_ATTACHMENT
( TARGET_ID , FILENAME )
select :targetID, CREATED_FLAG|| '.tif'
from TARGET t
where t.TARGET_ID = :targetID )
Y a-t-il une raison particulière pour laquelle vous devez utiliser des curseurs scalaires dans une clause de valeurs?