嵌套表和立即执行

Posted

技术标签:

【中文标题】嵌套表和立即执行【英文标题】:Nested Table and EXECUTE IMMEDIATE 【发布时间】:2014-11-18 15:33:04 【问题描述】:

我总是遇到从我的 PL/SQL 过程中截取的以下问题 我需要变量来创建动态 SQL 语句,但我还需要嵌套表。

 l_code list_code := list_code();

 l_code := PKG_DATA.GET_CODES(in_code) ;


v_sql := 'SELECT ' || in_var_name ||'
              FROM view 
              WHERE supplier = '||in_supplier ||'
                AND factory = '|| in_factory ||'
                AND code IN ('|| ( SELECT * FROM TABLE(l_code) )||')  ';


 EXECUTE IMMEDIATE   v_sql
                INTO v_value;

v_value 是一个嵌套表

[错误] PLS-00103 (60: 46): PLS-00103: 遇到符号“SELECT” 预期以下情况之一时:

( - + case mod new not null continue, [错误] PLS-00103 (60: 74): PLS-00103: 在期待其中之一时遇到符号“)” 以下:

, ;为了 作为有相交负序的组开始联合 wh

有没有人有想法或剪断?

谢谢

【问题讨论】:

【参考方案1】:
v_sql := 'SELECT ' || in_var_name 
       || ' FROM view ' 
       || ' WHERE supplier = :supplier AND factory = :factory ' 
       || '   AND code IN (SELECT * FROM TABLE(PKG_DATA.GET_CODES(:code)))';

EXECUTE IMMEDIATE v_sql INTO v_value USING in_supplier, in_factory, in_code;       

【讨论】:

您的代码中唯一的错误是:'EXECUTE IMMEDIATE v_sql using in_supplier, in_factory, in_code INTO v_value; ' .更正:'使用 in_supplier、in_factory、in_code 立即执行 v_sql INTO v_value; '【参考方案2】:

我建议使用绑定变量

v_sql := 'SELECT :in_var_name
          FROM view 
          WHERE supplier = :in_supplier
            AND factory = :in_factory
            AND code IN (SELECT * FROM TABLE(:l_code) ))  ';

EXECUTE IMMEDIATE v_sql
INTO v_value
USING in_var_name, in_supplier, in_factory, l_code;

但很有可能,您根本不需要动态 SQL:

SELECT in_var_name
INTO v_value
FROM view
WHERE supplier = in_supplier
  AND factory = in_factory
  AND code IN (SELECT * FROM TABLE(l_code));

【讨论】:

以上是关于嵌套表和立即执行的主要内容,如果未能解决你的问题,请参考以下文章

嵌套表和表头的语义

嵌套表和 VARRAY 之间的区别

9. MyBatis加载策略

MySQL中3表join流程分析

Oracle SQL3 3 嵌套表插入问题

使用 jQuery 在嵌套表结构中选择***别的 td