无法在执行立即调用函数(存储在批量收集中)

时间:2015-09-29 03:11:08

标签: oracle plsql toad

我有一个名为E.g GET_FUNCTION(#value#)的列(USING_FUNCTION)和另一个包含要使用的vaule的列(VALUE)

我正在尝试使用以下函数将函数名称和值集中到批量运算符中:

Select (substr(using_function, 1, instr(using_function, '(', -1) -1)) 
        || '(' || value || ')' 
bulk collect into V_value 
from table1 
where using_function != 'N';

然后使用execute immediate来调用该函数(例如,执行GET_WEEK_DATE(-2)将给我16-SEP-2015),然后将其插入另一个表(table2):

Execute immediate ' insert into table2 (name,value) select name, '
      || V_value ||' from table1 where using_function != ''N''';

我收到错误:调用'||'时参数的数量或类型错误。

* ps我正在避免使用循环

3 个答案:

答案 0 :(得分:1)

PLS-00306是编译错误。您使用||连接运算符的方式存在问题。错误消息包含行号,这将允许您识别哪个特定行是错误的,但这可能是罪魁祸首:|| V_value ||

它无效,因为V_value是一个集合。连接需要标量变量。如果您定义了一个引用索引的循环,则会解决编译错误:|| V_value(idx) ||

答案 1 :(得分:0)

如果您不想使用循环,那么您可以使用FORALL(这不是循环),这是批量收集的完美配对。我假设您的V_value变量是varchar2的集合。也许你可以将它声明为记录集合而不是?在声明部分,添加以下行:

           TYPE myrecord is RECORD(name table1.name%TYPE,
                                   value table1.VALUE%TYPE);
           TYPE tableofrecords is table of myrecord index by pls_integer;
           V_value tableofrecords;

然后在你的块体内,你可以把这些行:

          Select name,(substr(using_function, 1, instr(using_function, '(', -1) -1)) 
    || '(' || value || ')' 
        bulk collect into V_value 
        from table1 
        where using_function != 'N';
        forall a in 1..v_value.count
             insert into table2 (name,value) values (v_value(a).name,v_value(a).value);

答案 2 :(得分:0)

尝试添加此块。它将执行存储在v_value

中的函数
execute immediate 'select '||v_value||' from dual ' into new_v_value

注意:new_v_value应该是数组类型。