我们正在使用像这样的函数
FUNCTION GetValue(i_string IN VARCHAR2
,I_DELIM IN VARCHAR2
,i_occur IN NUMBER) RETURN VARCHAR2
IS
i NUMBER;
j NUMBER;
BEGIN
i := INSTR(i_string, i_delim, 1, i_occur);
IF i = 0 THEN
RETURN null;
ELSE
IF i_occur > 1 THEN
j := INSTR(i_string, i_delim, 1, i_occur-1);
RETURN SUBSTR(i_string, j+1, i-j-1);
ELSE
RETURN SUBSTR(i_string, 1, i-1);
END IF;
END IF;
user_id是要插入的列。在这种情况下,值将以类似
的数组传递00001,0
00002,1...
我希望将它们作为
插入00001
00002..
我尝试的是
for i in 1 .. I_USER_ID.last
loop
V_USER_ID:= GETVALUE(I_USER_ID(i), ',', i);
PROCEDURE310 (I_USER_ID
,C_PACKAGE_ID
,C_METHOD_ID
);
我把T_user_id作为数据类型。
这不起作用。 请有人帮忙。'i'的值不会增加。
答案 0 :(得分:0)
使用匿名块中的虚拟数据,您可以看到列表中只有第一个值对从函数中获取任何内容:
declare
type T_USER_ID is table of varchar2(10) index by pls_integer;
I_USER_ID T_USER_ID;
V_USER_ID varchar2(10);
BEGIN
I_USER_ID(1) := '00001,0';
I_USER_ID(2) := '00002,1';
I_USER_ID(3) := '00003,2';
for i in 1 .. I_USER_ID.last
loop
V_USER_ID:= GETVALUE(I_USER_ID(i), ',', i);
dbms_output.put_line(V_USER_ID);
end loop;
END;
/
00001
(null)
(null)
对于每对值,您要求以较短的逗号分隔的“第i个”元素。所以对于第一对你要求第一个元素,第二对你要求第二个,等等,这不是你需要的 - 你总是想要每一对中的第一个元素。所以你总是需要将1
作为第三个参数传递给你的函数:
V_USER_ID:= GETVALUE(I_USER_ID(i), ',', 1);
现在得到:
00001
00002
00003
顺便说一句,您的函数永远不会返回列表中的最后一个元素。如果你打电话说:
select getvalue('a,b,c', ',', 1) as first,
getvalue('a,b,c', ',', 2) as second,
getvalue('a,b,c', ',', 3) as third
from dual;
FIRST SECOND THIRD
------ ------ ------
a b (null)
...然后你会得到null而不是c
。当你要求第三个元素时,instr
正在寻找第三个逗号,但输入字符串只有两个逗号 - 你通常希望看到的分隔符少于元素。 INSTR('a,b,c', ',', 1, 3
为零。您在计算j
时尝试在函数中稍后处理,但是您已经从上一次检查i = 0
返回了null。您可以清理它,但您也可以使用regexp_substr
替换整个功能:
V_USER_ID:= regexp_substr(I_USER_ID(i), '[^,]+', 1, 1);
或更常见的是找到以逗号分隔的字符串的“ith”元素:
regexp_substr(<value>, '[^,]+', 1, i);
例如:
select regexp_substr('a,b,c', '[^,]+', 1, 1) as first,
regexp_substr('a,b,c', '[^,]+', 1, 2) as second,
regexp_substr('a,b,c', '[^,]+', 1, 3) as third
from dual;
FIRST SECOND THIRD
------ ------ ------
a b c