在Oracle 10g上运行Pro * C。
我希望在insert statement 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中编译subquerys:
即。
INSERT into table1 (col1) values ( (select t2.singleCol from table2 t2 where t2.priKey = :priKey) )
这是Pro * C的预期行为吗?或者它是否应该支持values子句中的子查询?
答案 0 :(得分:1)
可能将子查询更改为:
( SELECT CREATED_FLAG || '.tif' from TARGET t where t.TARGET_ID = :targetID )
我不认为我曾经在你尝试过的方式上看到附加在子查询中的东西。
答案 1 :(得分:1)
Pro * C预处理器能够在静态SQL语句中解析的SQL数量非常有限。例如,它甚至无法解析显式的inner joiner
/ outer left join
等符号。
作为一种解决方法,您可以准备一个动态SQL语句并执行它 - 即使您的SQL语句不是真正动态的。
答案 2 :(得分:0)
您发布的代码在逻辑上与此相同:
INSERT INTO TARGET_ATTACHMENT
( TARGET_ID , FILENAME )
select :targetID, CREATED_FLAG|| '.tif'
from TARGET t
where t.TARGET_ID = :targetID )
是否有特殊原因需要在VALUES子句中使用标量游标?