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?

Était-ce utile?

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?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top