在Oracle10g上运行Pro*C。

我正在寻找在insert语句values子句中执行子查询。此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中编译子querys:

即。

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

这是Pro*C的预期行为吗?或者它应该支持values子句中的子查询?

有帮助吗?

解决方案

可能会将子查询更改为:

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

我不认为我已经看到了一些你尝试的方式附加的东西。

其他提示

Pro*C预处理器能够在静态SQL语句中解析的SQL量非常有限。例如,它甚至不能解析显式 inner joiner/outer left join 等。符号。

作为一种解决方法,您可以准备一个动态SQL语句并执行它-即使您的SQL语句不是真正的动态。

您发布的代码在逻辑上与此相同:

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

是否有一个特定原因,您需要在值子句中使用标量游标?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top