加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

oracle – 拆分字符串并迭代存储进程中的每个值

发布时间:2021-03-14 23:56:53 所属栏目:站长百科 来源:网络整理
导读:我在Oracle中有一个要求,我必需将逗号脱离的国度/地域代码字符勾串报给Oracle存储进程. 在存储进程中,我想在逗号上拆分字符串并迭代每个国度/地域代码. 我想要一个相同如下的SP: PROCEDURE Get_Query( v_company IN VARCHAR2,) ISsqlstr VARCHAR2(32767);BE

我在Oracle中有一个要求,我必需将逗号脱离的国度/地域代码字符勾串报给Oracle存储进程.

在存储进程中,我想在逗号上拆分字符串并迭代每个国度/地域代码.

我想要一个相同如下的SP:

PROCEDURE Get_Query
(
  v_company IN VARCHAR2,) IS
sqlstr VARCHAR2(32767);
BEGIN
/*
split the v_company on comma (e.g. IN,US,...etc)
iterate for each country code  

*/
END;

办理要领

你可以行使 DBMS_UTILITY.COMMA_TO_TABLE.

DBMS_UTILITY包提供各类适用措施子措施.一个这样有效的适用措施是COMMA_TO_TABLE进程,它将逗号脱离的名称列表转换为名称的PL / SQL表.

譬喻,

SQL> set serveroutput on;
SQL> DECLARE
  2    l_tablen BINARY_INTEGER;
  3    l_tab DBMS_UTILITY.uncl_array;
  4    CURSOR cur
  5    IS
  6      SELECT 'word1,word2,word3,word4,word5,word6' val FROM dual;
  7    rec cur%rowtype;
  8  BEGIN
  9    OPEN cur;
 10    LOOP
 11      FETCH cur INTO rec;
 12      EXIT
 13    WHEN cur%notfound;
 14      DBMS_UTILITY.comma_to_table (
 15      list => rec.val,tablen => l_tablen,tab => l_tab);
 16      FOR i IN 1 .. l_tablen
 17      LOOP
 18        DBMS_OUTPUT.put_line(i || ' : ' || trim(l_tab(i)));
 19      END LOOP;
 20    END LOOP;
 21    CLOSE cur;
 22  END;
 23  /
1 : word1
2 : word2
3 : word3
4 : word4
5 : word5
6 : word6

PL/SQL procedure successfully completed.

SQL>

更新正如@ruudvan指出的那样,行使COMMA_TO_TABLE有一些限定,假如你有像IS,AS平脱离字符串的要害字它将无法事变.

要降服COMMA_TO_TABLE的限定,尚有很多其他要领,请参阅How to split comma delimited string into rows in Oracle

譬喻,您可以行使REGULAR EXPRESSION,如下所示:

测试用例

SQL> CREATE OR REPLACE
  2  PROCEDURE Get_Query(
  3      v_company IN VARCHAR2 )
  4  IS
  5  BEGIN
  6    
  7    FOR i IN
  8    (SELECT level,9      trim(regexp_substr(v_company,'[^,]+',1,LEVEL)) str
 10    FROM dual
 11      CONNECT BY regexp_substr(v_company,LEVEL) IS NOT NULL
 12    )
 13    LOOP
 14      -- do something
 15      dbms_output.put_line('Company code no.'||i.level||' = '||i.str);
 16    END LOOP;
 17  END;
 18  /

Procedure created.

SQL> sho err
No errors.

让我们搜查:

SQL> set serveroutput on
SQL> EXEC get_query('COMP1,COMP2,COMP3,COMP4');
Company code no.1 = COMP1
Company code no.2 = COMP2
Company code no.3 = COMP3
Company code no.4 = COMP4

PL/SQL procedure successfully completed.

SQL>

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读