我有一个名为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我正在避免使用循环
答案 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应该是数组类型。