微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

oracle – 在PL/SQL存储过程中分割逗号分隔的字符串

我有CSV字符串100.01,200.02,300.03,我需要传递到Oracle中的PL / sql存储过程。
在proc中,我需要在表的Number列中插入这些值。

为此,我从这里得到了一个工作方法

http://stackoverflow.com/questions/1089508/how-to-best-split-csv-strings-in-oracle-9i

[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;

原文地址:https://www.jb51.cc/oracle/206260.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐