【问题标题】:Oracle ProC INSERT INTO VALUES ( (select ...) )Oracle ProC 插入值((选择 ...))
【发布时间】:2012-09-24 13:04:50
【问题描述】:

在 Oracle 10g 上运行 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 子句中的子查询?

【问题讨论】:

    标签: sql oracle insert subquery oracle-pro-c


    【解决方案1】:

    可能将子查询更改为:

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

    我认为我从未见过像您尝试的那样附加到子查询的内容。

    【讨论】:

      【解决方案2】:

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

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

      是否有特殊原因需要在 VALUES 子句中使用标量游标?

      【讨论】:

      • 我只展示了一个简化的查询来显示什么坏了(在我添加子查询之后)。 TARGET_ATTACHMENT 表中实际上插入了 20 多个字段,其中只有一个需要 TARGET 表中的信息。
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2022-06-16
        • 2012-07-11
        • 2015-07-05
        • 2021-10-22
        • 2019-06-03
        • 2014-02-16
        • 1970-01-01
        相关资源
        最近更新 更多