Domanda

L'esecuzione di Pro*C, Oracle 10g.

Sto cercando di fare una sottoquery all'interno di un'istruzione insert valori clausola.Questa query sql è pienamente valida e viene eseguito all'interno di ROSPO senza problemi, ma il Pro*C non riesce ad analizzare la query.

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

Se rimuovo:

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

Il Pro*C compilatore funziona e tutto viene compilato ed eseguito come previsto.

Se io NON rimuovere:Il Pro*C compilatore genera un errore di sintassi.

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,

Questo è un problema, come mi aspetto che Pro*C per essere in grado di compilare subquerys entro valori caluse:

ie.

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

Questo è il comportamento previsto di Pro*C?o Dovrebbe sottoquery supporto entro i valori clausola?

È stato utile?

Soluzione

Eventualmente modificare la sottoquery a:

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

Non penso di aver mai visto qualcosa aggiunto a una sottoquery nel modo in cui stavi tentando.

Altri suggerimenti

La quantità di SQL Pro*il preprocessore C è in grado di analizzare in statico istruzioni SQL è piuttosto limitata.Per esempio non è in grado di analizzare esplicito inner joiner/outer left join ecc.la notazione.

Come soluzione alternativa si può preparare una istruzione SQL dinamico e di esecuzione, anche se l'istruzione SQL non è molto dinamico.

Il codice che hai pubblicato è logicamente identico a questo:

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

C'è un motivo particolare per cui è necessario utilizzare i cursori scalari in una clausola di valori?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top