我有CSV字符串100.01,200.02,300.03,我需要传递到Oracle中的PL / sql存储过程。
在proc中,我需要在表的Number列中插入这些值。
为此,我从这里得到了一个工作方法:
[2]按层次使用sql的连接。
现在,我有另一个要求。
我需要传递2个CSV字符串(长度相等)作为PL / sql存储proc.的输入。我需要打破这个字符串,并将两个CSV字符串中的每个值插入表中的两个不同的列。请允许我知道怎么去呢?
CSV输入示例:
mystring varchar2(2000):=’0.75,0.64,0.56,0.45′;
myAmount varchar2(2000):=’0.25,0.5,0.65,0.8′;
myString值将进入列A和myAmount值到表B中的列。
你能让我知道如何实现吗?
谢谢。
这应该做你正在寻找的..它假设你的列表将永远只是数字。如果不是这样,只需将对DBMS_sql.NUMBER_TABLE的引用更改为适用于所有数据的表类型:
CREATE OR REPLACE PROCEDURE insert_from_lists(
list1_in IN VARCHAR2,list2_in IN VARCHAR2,delimiter_in IN VARCHAR2 := ','
)
IS
v_tbl1 DBMS_sql.NUMBER_TABLE;
v_tbl2 DBMS_sql.NUMBER_TABLE;
FUNCTION list_to_tbl
(
list_in IN VARCHAR2
)
RETURN DBMS_sql.NUMBER_TABLE
IS
v_retval DBMS_sql.NUMBER_TABLE;
BEGIN
IF list_in is not null
THEN
/*
|| Use lengths loop through the list the correct amount of times,|| and substr to get only the correct item for that row
*/
FOR i in 1 .. length(list_in)-length(replace(list_in,delimiter_in,''))+1
LOOP
/*
|| Set the row = next item in the list
*/
v_retval(i) :=
substr (
delimiter_in||list_in||delimiter_in,instr(delimiter_in||list_in||delimiter_in,1,i ) + 1,instr (delimiter_in||list_in||delimiter_in,i+1) - instr (delimiter_in||list_in||delimiter_in,i) -1
);
END LOOP;
END IF;
RETURN v_retval;
END list_to_tbl;
BEGIN
-- Put lists into collections
v_tbl1 := list_to_tbl(list1_in);
v_tbl2 := list_to_tbl(list2_in);
IF v_tbl1.COUNT <> v_tbl2.COUNT
THEN
raise_application_error(num => -20001,msg => 'Length of lists do not match');
END IF;
-- Bulk insert from collections
FORALL i IN INDICES OF v_tbl1
insert into tmp (a,b)
values (v_tbl1(i),v_tbl2(i));
END insert_from_lists;
总结
如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。