2012-10-03 60 views
2

在Oracle 10g上运行Pro * C。Oracle ProC插入值((选择...))

我期待在插入语句值子句中执行子查询。这个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能够编译值范围内subquerys caluse:

即。

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

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

回答

1

可能更改子查询:我不认为我所见过的东西附加到一个子查询你尝试的方式

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

0

你已经发布的代码在逻辑上等同于这样:

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

有你为什么需要在VALUES子句中使用标光标一个特别的原因?

+0

我只显示一个简单的查询来显示什么打破了(在我加入子查询后)。 TARGET_ATTACHMENT表中实际插入了20多个字段,其中只有一个需要来自TARGET表的信息。 – user297500

1

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

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