根据竖线分隔符拆分varchar2变量
Split varchar2 variable based on vertical line delimiter
我有以下 plsql 代码
DECLARE
v_personal_info VARCHAR2(100);
v_name VARCHAR2(100);
v_signature VARCHAR2(100);
CURSOR c_personal_info
IS
select personal_info from users where name is not null;
BEGIN
FOR lr_row IN c_personal_info
LOOP
v_personal_info := lr_row.personal_info;
-- Need to split v_personal_info based on |
END LOOP;
END;
/
v_personal_info
的典型值看起来像 'Aniket Thakur | athakur'
,我需要将其拆分为不同的变量,例如
v_name := 'Aniket Thakur'
v_signature := 'athakur'
我应该怎么做。是否有任何内置函数可以根据预定义的分隔符进行拆分?
如果v_personal_info
的值是统一的并且总是string_1
+|
+string_2
的结构,那么你可以很容易地使用REGEXP_SUBSTR。
那样的话,你的程序可以这样写:
DECLARE
v_personal_info VARCHAR2(100);
v_name VARCHAR2(100);
v_signature VARCHAR2(100);
CURSOR c_personal_info
IS
select personal_info from users where name is not null;
BEGIN
FOR lr_row IN c_personal_info
LOOP
v_personal_info := lr_row.personal_info;
v_name := REGEXP_SUBSTR ( v_personal_info, '^[^|]*');
v_signature := REGEXP_SUBSTR (v_personal_info,'[^|]*$')
END LOOP;
END;
/
当然,除非您将这些值写在某处,否则实际上该过程没有用。
但是,如果您想要一种使用不同定界符拆分字符串的通用方法,则必须创建自己的函数。这里有多个例子可以做到这一点。参见 this & this
其中一位 SO 用户写了一篇非常好的文章 Split single comma delimited string into rows in Oracle
Hawks 的回答很好,但我不想使用正则表达式,所以我使用简单的 SUBSTR
和 INSTR
方法。
DECLARE
v_personal_info VARCHAR2(100);
v_name VARCHAR2(100);
v_signature VARCHAR2(100);
delimitIndex number;
CURSOR c_personal_info
IS
select personal_info from users where name is not null;
BEGIN
FOR lr_row IN c_personal_info
LOOP
v_personal_info := lr_row.personal_info;
delimitIndex := INSTR(v_personal_info, '|');
if delimitIndex != 0 then
v_name := SUBSTR(v_personal_info, 1, delimitIndex - 1);
v_signature := SUBSTR(v_personal_info, delimitIndex+1, LENGTH(v_personal_info)-delimitIndex);
END if;
END LOOP;
END;
/
我有以下 plsql 代码
DECLARE
v_personal_info VARCHAR2(100);
v_name VARCHAR2(100);
v_signature VARCHAR2(100);
CURSOR c_personal_info
IS
select personal_info from users where name is not null;
BEGIN
FOR lr_row IN c_personal_info
LOOP
v_personal_info := lr_row.personal_info;
-- Need to split v_personal_info based on |
END LOOP;
END;
/
v_personal_info
的典型值看起来像 'Aniket Thakur | athakur'
,我需要将其拆分为不同的变量,例如
v_name := 'Aniket Thakur'
v_signature := 'athakur'
我应该怎么做。是否有任何内置函数可以根据预定义的分隔符进行拆分?
如果v_personal_info
的值是统一的并且总是string_1
+|
+string_2
的结构,那么你可以很容易地使用REGEXP_SUBSTR。
那样的话,你的程序可以这样写:
DECLARE
v_personal_info VARCHAR2(100);
v_name VARCHAR2(100);
v_signature VARCHAR2(100);
CURSOR c_personal_info
IS
select personal_info from users where name is not null;
BEGIN
FOR lr_row IN c_personal_info
LOOP
v_personal_info := lr_row.personal_info;
v_name := REGEXP_SUBSTR ( v_personal_info, '^[^|]*');
v_signature := REGEXP_SUBSTR (v_personal_info,'[^|]*$')
END LOOP;
END;
/
当然,除非您将这些值写在某处,否则实际上该过程没有用。
但是,如果您想要一种使用不同定界符拆分字符串的通用方法,则必须创建自己的函数。这里有多个例子可以做到这一点。参见 this & this
其中一位 SO 用户写了一篇非常好的文章 Split single comma delimited string into rows in Oracle
Hawks 的回答很好,但我不想使用正则表达式,所以我使用简单的 SUBSTR
和 INSTR
方法。
DECLARE
v_personal_info VARCHAR2(100);
v_name VARCHAR2(100);
v_signature VARCHAR2(100);
delimitIndex number;
CURSOR c_personal_info
IS
select personal_info from users where name is not null;
BEGIN
FOR lr_row IN c_personal_info
LOOP
v_personal_info := lr_row.personal_info;
delimitIndex := INSTR(v_personal_info, '|');
if delimitIndex != 0 then
v_name := SUBSTR(v_personal_info, 1, delimitIndex - 1);
v_signature := SUBSTR(v_personal_info, delimitIndex+1, LENGTH(v_personal_info)-delimitIndex);
END if;
END LOOP;
END;
/