2

Oracle10gでのPro*Cの実行。

挿入ステートメント値句内でサブクエリを実行しようとしています。このSQLクエリは完全に有効で、TOAD内で問題なく実行されますが、Pro*Cはクエリの解析に失敗します。

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

削除した場合:

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

Pro * Cコンパイラが動作し、すべてが期待どおりにコンパイルおよび実行されます。

削除しない場合:Pro*Cコンパイラは構文エラーをスローします。

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,

これは問題です。Pro*Cが値caluse内でサブクエリをコンパイルできることを期待しているからです。

すなわち。

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

これはPro*Cの予想される動作ですか?または、values句内のサブクエリをサポートする必要がありますか?

4

3 に答える 3

1

Pro*C プリプロセッサが静的 SQL 文で解析できる SQL の量は非常に限られています。たとえば、明示的なinner joiner/outer left joinなどの表記を解析することさえできません。

回避策として、動的 SQL ステートメントを準備して実行することができます - SQL ステートメントが実際には動的でない場合でも。

于 2013-08-11T09:52:09.013 に答える
1

おそらくサブクエリを次のように変更します。

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

あなたが試みていた方法でサブクエリに追加されたものを見たことはないと思います。

于 2012-10-03T15:07:32.597 に答える
0

あなたが投稿したコードは、論理的にはこれと同じです:

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

VALUES 句でスカラー カーソルを使用する必要がある特別な理由はありますか?

于 2012-10-03T15:25:53.310 に答える