如何使用分隔符将数组中的值插入到oracle中的表中

时间:2014-11-06 10:04:24

标签: oracle plsql

我们正在使用像这样的函数

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'的值不会增加。

1 个答案:

答案 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