Maison base de données tutoriel mysql oracel中字符串分割成集合详解

oracel中字符串分割成集合详解

Jun 07, 2016 pm 05:49 PM
字符串分割

文章分享一篇关于自己的学习笔记,oracel中字符串分割成集合详解有需要学习的同学可以看看。

首先分别使用两种方式构造两个函数

 代码如下 复制代码

-- use conventional plsql
create or replace function f_str2list_pls
(
  p_str       varchar2,
  p_separator varchar2 default ','
) return my_tk_str_tab_type is
  l_idx  pls_integer := 0;
  l_str  varchar2(32767) := trim(p_str);
  l_elmt varchar2(100) := null;
  l_list my_tk_str_tab_type := my_tk_str_tab_type();
begin
  while l_str is not null loop
    l_idx := instr(l_str, p_separator);
    if l_idx = 0 then
      l_elmt := l_str;
      l_str  := null;
    else
      l_elmt := substr(l_str, 1, l_idx - 1);
      l_str  := substr(l_str, l_idx + 1);
    end if;
 
    l_list.extend;
    l_list(l_list.last) := trim(l_elmt);
  end loop;

  return l_list;
end;
/

-- use single sql
create or replace function f_str2list_sql
(
  p_str       varchar2,
  p_separator varchar2 default ','
) return my_tk_str_tab_type is
  l_list my_tk_str_tab_type := my_tk_str_tab_type();
begin
  substr(a.str,
                instr(p_separator || a.str, p_separator, 1, rn),
                instr(a.str || p_separator, p_separator, 1, rn) -
                instr(p_separator || a.str, p_separator, 1, rn)) q
    bulk collect into l_list
    from (select p_str as str from dual) a,
         (select rownum rn from dual connect by rownum    where instr(p_separator || a.str, p_separator, 1, rn) > 0;

  return l_list;
end;
/

 

 


确认两种方法完成同样的功能

 

----------------------------------------------------

 代码如下 复制代码

-- same result
declare
  l_list my_tk_str_tab_type := my_tk_str_tab_type();
  l_str varchar2(1000) := 'a,b,c';
begin
  l_list := f_str2list_pls(l_str,',');
  for i in 1..l_list.count loop
    dbms_output.put_line(l_list(i));
  end loop;
 
  dbms_output.put_line('');
  l_list := f_str2list_sql(l_str,',');
  for i in 1..l_list.count loop
    dbms_output.put_line(l_list(i));
  end loop;
end;
/

SQL> set serveroutput on
a
b
c
 
a
b
c

 

 

 

 

 

我们知道在PL/SQL和SQL里面,varchar2类型的长度限制是不同的。那么这两种方法是否也存在同样的限制?验证一下

先测试PL/SQL版本

 

-- 这里使用单个字母作为元素,加上必要的逗号分割符,一个元素占用长度2. PL/SQL中上限32767。当取(32767/2 = 16383)个元素的时候,运行成功
----------------------------------------------------

 代码如下 复制代码

-- pls versions tring length limit
declare
  l_list my_tk_str_tab_type := my_tk_str_tab_type();
  l_str  varchar2(32767) := '';
  l_max  pls_integer := 16383;
begin
  -- construct string
  for i in 1 .. l_max loop
    l_str := l_str || ',' || 'a';
  end loop;
  l_str := substr(l_str, 2);

   l_list := f_str2list_pls(l_str, ',');
end;
/

PL/SQL procedure successfully completed

-- 增加一个元素,当取(16384)个元素的时候,超过了varchar2的限制,所以无法运行。(构造字符串就报错了,这个时候其实还没有调用f_str2list_pls)
 代码如下 复制代码

declare
  l_list my_tk_str_tab_type := my_tk_str_tab_type();
  l_str  varchar2(32767) := '';
  l_max  pls_integer := 16384;
begin
  -- construct string
  for i in 1 .. l_max loop
    l_str := l_str || ',' || 'a';
  end loop;

  l_list := f_str2list_pls(l_str, ',');
end;
/

ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 9

-- 修改一下代码,实际调用这个函数。从结果可以看到,f_str2list_pls()内部报超长错误
declare
  l_list my_tk_str_tab_type := my_tk_str_tab_type();
  l_str  varchar2(32767) := '';
  l_max  pls_integer := 16383;
begin
  -- construct string
  for i in 1 .. l_max loop
    l_str := l_str || ',' || 'a';
  end loop;

  l_list := f_str2list_pls(l_str||',a', ',');
end;
 
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at "T2.F_STR2LIST_PLS", line 7
ORA-06512: at line 12

 

 

 


下面测试SQL版本

 

 代码如下 复制代码

-- 因为SQL中varchar2上限是4000,所以使用2000个元素。一切正常。
----------------------------------------------------
-- sql versions tring length limit
declare
  l_list my_tk_str_tab_type := my_tk_str_tab_type();
  l_str  varchar2(32767) := '';
  l_max  pls_integer := 2000;
begin
  -- construct string
  for i in 1 .. l_max loop
    l_str := l_str || ',' || 'a';
  end loop;
  l_str := substr(l_str, 2);

   l_list := f_str2list_sql(l_str, ',');
end;
/

PL/SQL procedure successfully completed

-- 直接增加到2001个元素,发现f_str2list_sql()内部报错,说明构造字符串的成功传入,但是函数不能处理
 代码如下 复制代码

declare
  l_list my_tk_str_tab_type := my_tk_str_tab_type();
  l_str  varchar2(32767) := '';
  l_max  pls_integer := 2001;
begin
  -- construct string
  for i in 1 .. l_max loop
    l_str := l_str || ',' || 'a';
  end loop;
  l_str := substr(l_str, 2);

   l_list := f_str2list_sql(l_str, ',');
end;
 
ORA-01460: unimplemented or unreasonable conversion ed
ORA-06512: at "T2.F_STR2LIST_SQL", line 8
ORA-06512: at line 13

备注:ORA-01460的描述很不清楚,其实这里就是varchar2超长

 

 

 

 

 

测试比较两种方式在不同数据量下的性能

 

 代码如下 复制代码

----------------------------------------------------
-- performance test
declare
  l_list my_tk_str_tab_type := my_tk_str_tab_type();
  l_str  varchar2(32767) := '';
  l_max  pls_integer := 2000;
begin
  -- construct string
  for i in 1 .. l_max loop
    l_str := l_str || ',' || 'a';
  end loop;
  l_str := substr(l_str, 2);

  -- warm up before actually calculation
  l_list := f_str2list_sql(l_str, ',');
  l_list := f_str2list_pls(l_str, ',');
 
  -- begin calc and diff
  my_rs.rs_start;
  -- 1. pls version
  l_list := f_str2list_pls(l_str, ',');
  my_rs.rs_middle;
  -- 2. sql version
  l_list := f_str2list_sql(l_str, ',');
  my_rs.rs_stop();
end;
/

 

 

 


我们分别测试当元素个数为100, 200, 500, 1000, 2000的情况。每种情况进行3-5次然后取平均

元素个数

PL/SQL 运行时间 (1/100 second)

SQL 运行时间 (1/100 second)

PCT

100

1

1

100%

200

1

1 - 2

50% - 100%

500

1 - 2

2 - 3

30% - 50%

1000

1

4

25%

2000

2

10

20%

总结:

SQL版本的书写简便,并且可以脱离PL/SQL环境直接使用(单条SQL进行行列转换)。

SQL版本只能处理长度小于4000的字符串,实际最大只能包含2000个元素。PL/SQL版本可以处理长度小于32767的字符串。

小数据量情况下,两者性能相当。随着数据量增大,PL/SQL版本性能明显占优

 

 

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment utiliser la fonction split() dans Python 3.x pour diviser une chaîne selon le délimiteur spécifié Comment utiliser la fonction split() dans Python 3.x pour diviser une chaîne selon le délimiteur spécifié Jul 31, 2023 pm 08:33 PM

Python est un langage de programmation populaire qui fournit de nombreuses fonctions intégrées pour gérer les chaînes. L'une des fonctions couramment utilisées est la fonction split(), qui peut diviser une chaîne en plusieurs sous-chaînes selon le délimiteur spécifié. Cet article explique comment utiliser la fonction split() dans Python3.x. En Python, la fonction split() est une fonction intégrée de la classe string. Sa syntaxe de base est la suivante : string.split(separator,maxsplit)

Comment utiliser la fonction exploser pour diviser une chaîne en PHP Comment utiliser la fonction exploser pour diviser une chaîne en PHP Jun 26, 2023 pm 12:03 PM

Dans le langage PHP, il existe de nombreuses fonctions de base qui peuvent nous aider à traiter les chaînes rapidement et efficacement. Parmi elles, la fonction d'explosion est une fonction de fractionnement de chaînes très pratique. Il peut diviser une chaîne en tableaux selon le délimiteur spécifié, puis effectuer des opérations de chaîne plus flexibles. Dans cet article, nous présenterons comment utiliser la fonction d'explosion pour diviser des chaînes en PHP. 1. Le format de la fonction éclater Le format de la fonction éclater dans le langage PHP est le suivant : éclater(sépara

La longueur maximale de division d'une chaîne de telle sorte que chaque caractère de la chaîne apparaisse dans une sous-chaîne La longueur maximale de division d'une chaîne de telle sorte que chaque caractère de la chaîne apparaisse dans une sous-chaîne Aug 25, 2023 pm 02:41 PM

Dans cet article, nous explorerons le problème de savoir comment trouver la longueur de la partition maximisée d'une chaîne avec des caractères uniques. Nous comprenons d’abord l’énoncé du problème, puis étudions des méthodes naïves et efficaces pour résoudre ce problème, y compris leurs algorithmes respectifs et leurs complexités temporelles. Enfin, nous implémenterons la solution en C++. Énoncé du problème Étant donné une chaîne, divisez la chaîne en autant de sous-chaînes que possible afin que chaque caractère de la chaîne apparaisse dans une seule sous-chaîne. Renvoie la longueur de ces divisions maximisées. Approche naïve L'approche naïve consiste à parcourir la chaîne, en enregistrant la dernière occurrence de chaque caractère. Ensuite, parcourez à nouveau la chaîne et créez une partition lorsque la dernière occurrence du caractère actuel est trouvée. Algorithme (naïf) pour initialiser un tableau pour stocker des chaînes dans

Comment diviser une chaîne en tableau en PHP Comment diviser une chaîne en tableau en PHP Jul 08, 2023 pm 01:49 PM

Comment diviser une chaîne en tableau en PHP En PHP, nous devons souvent traiter des chaînes et les diviser en plusieurs parties. Diviser une chaîne en un tableau est une opération courante qui nous aide à mieux gérer les différentes parties de la chaîne. Dans cet article, nous apprendrons comment diviser une chaîne en un tableau à l'aide de fonctions en PHP et fournirons quelques exemples de code. Utilisez la fonction exploser pour diviser une chaîne en un tableau. PHP fournit une fonction appelée exploser, qui peut diviser la chaîne en fonction du délimiteur spécifié.

Comptez le nombre de façons de diviser une chaîne en K sous-chaînes commençant par un nombre pair et ayant une longueur minimale de M Comptez le nombre de façons de diviser une chaîne en K sous-chaînes commençant par un nombre pair et ayant une longueur minimale de M Sep 09, 2023 pm 02:01 PM

Dans ce problème, nous calculerons la manière de diviser la chaîne donnée en K sous-chaînes de telle sorte qu'elle satisfasse aux conditions données dans l'énoncé du problème. Nous utiliserons la récursion pour résoudre ce problème. De plus, nous utiliserons des méthodes de programmation dynamique tabulaire pour résoudre efficacement ce problème. Énoncé du problème - Nous avons une chaîne de longueur spécifique appelée bin_Str. La chaîne contient uniquement des caractères numériques de « 0 » à « 9 ». Nous devons calculer le nombre de façons de diviser la chaîne en K sous-chaînes afin qu'elle remplisse les conditions suivantes. La sous-chaîne doit contenir au moins 2 caractères. Le premier caractère de chaque sous-chaîne doit être pair et le dernier caractère impair. ExempleExemple inputM=2,K=2;bin_str="255687&q

Comment résoudre l'erreur signalée par la fonction d'explosion en PHP Comment résoudre l'erreur signalée par la fonction d'explosion en PHP Mar 11, 2024 am 11:45 AM

La méthode pour résoudre l'erreur signalée par la fonction d'explosion en PHP nécessite des exemples de code spécifiques. En PHP, la fonction d'explosion est une fonction utilisée pour diviser une chaîne en un tableau selon le délimiteur spécifié. Cependant, une erreur se produit parfois lors de l'utilisation de la fonction d'éclatement, principalement parce que les paramètres transmis ne répondent pas aux exigences de la fonction. Ci-dessous, nous discuterons en détail des problèmes et des solutions possibles, et fournirons des exemples de code spécifiques. Erreur causée par un nombre incorrect de paramètres lors de l'utilisation de la fonction d'éclatement

Exemple de fonction de chaîne PHP : fractionnement de chaîne Exemple de fonction de chaîne PHP : fractionnement de chaîne Jun 20, 2023 pm 01:58 PM

Il existe de nombreuses fonctions de chaîne en PHP, parmi lesquelles la fonction de fractionnement de chaîne est très couramment utilisée. La fonction string split peut diviser une chaîne en fonction du délimiteur spécifié et renvoyer un tableau. Ci-dessous, nous présenterons plusieurs fonctions de fractionnement de chaînes couramment utilisées. Fonction exploser La fonction exploser peut diviser une chaîne selon le délimiteur spécifié et renvoyer un tableau. La syntaxe est la suivante : éclater(string$separator,string$string

Vérifie si une chaîne peut être divisée en trois sous-chaînes, où une sous-chaîne est une sous-chaîne des deux autres sous-chaînes Vérifie si une chaîne peut être divisée en trois sous-chaînes, où une sous-chaîne est une sous-chaîne des deux autres sous-chaînes Sep 22, 2023 am 11:53 AM

Dans ce problème, nous devons diviser la chaîne donnée de telle sorte que la troisième sous-chaîne puisse être une sous-chaîne des deux premières sous-chaînes. Pensons à une solution. La troisième chaîne ne peut être une sous-chaîne des deux premières chaînes que si les deux premières chaînes contiennent tous les caractères de la troisième chaîne. Nous devons donc trouver au moins un caractère dont la fréquence est supérieure à 3 dans la chaîne donnée, et nous pouvons prendre la troisième sous-chaîne de ce caractère unique. Énoncé du problème - On nous donne une chaîne str contenant N caractères alphabétiques minuscules. Nous devons vérifier si nous pouvons diviser la chaîne en trois sous-chaînes a, b et c de telle sorte que la sous-chaîne c soit une sous-chaîne de a et b. Selon que 3 sous-chaînes peuvent être trouvées, écrivez "oui" ou "non"

See all articles