반응형
PL/SQL에서 쉼표로 구분된 문자열을 구문 분석하는 방법은 무엇입니까?
PL/SQL 스크립트에 쉼표로 구분된 문자열(예: data:= 'a,b,c,d,e')이 있으므로 스크립트 내에서 구문 분석해야 합니다.
저는 줄을 반복해서 하나하나 처리하고 싶습니다.마치 'forach' 루프처럼.
PL/SQL에서 이것이 가능합니까? 누가 나에게 어떤 코드를 가리켜 줄 수 있습니까?
Oracle 10G 또는 11G를 사용하는 경우에는 Apex 기능이 내장되어 있어야 합니다.apex_util.string_to_table
:
SQL> declare
2 v_array apex_application_global.vc_arr2;
3 v_string varchar2(2000);
4 begin
5
6 -- Convert delimited string to array
7 v_array := apex_util.string_to_table('alpha,beta,gamma,delta', ',');
8 for i in 1..v_array.count
9 loop
10 dbms_output.put_line(v_array(i));
11 end loop;
12
13 -- Convert array to delimited string
14 v_string := apex_util.table_to_string(v_array,'|');
15 dbms_output.put_line(v_string);
16 end;
17 /
alpha
beta
gamma
delta
alpha|beta|gamma|delta
PL/SQL procedure successfully completed.
Oracle 11g:
SELECT num_value
FROM ( SELECT TRIM (REGEXP_SUBSTR (num_csv,
'[^,]+',
1,
LEVEL))
num_value
FROM ( SELECT '1,2,3,4,5,6,7,8,9,10' num_csv FROM DUAL)
CONNECT BY LEVEL <= regexp_count (num_csv, ',', 1) + 1)
WHERE num_value IS NOT NULL
간략하고 간단한 예는 다음과 같습니다.
declare
string_to_parse varchar2(2000) := 'abc,def,ghi,klmno,pqrst';
l_count number;
l_value varchar2(2000);
begin
string_to_parse := string_to_parse||',';
l_count := length(string_to_parse) - length(replace(string_to_parse,',',''));
-- In oracle 11g use regexp_count to determine l_count
for i in 1 .. l_count loop
select regexp_substr(string_to_parse,'[^,]+',1,i)
into l_value
from dual;
dbms_output.put_line(l_value);
end loop;
end;
Oracle 10g 및 11g에서 작동하는 간단한 토키저 SQL 문은 다음과 같이 작성할 수 있습니다.
WITH string AS (
SELECT pv_string value
FROM dual)
SELECT DISTINCT upper(trim(regexp_substr (value, '[^' || pv_separator || ']+', 1, ROWNUM))) value,
level
FROM string
CONNECT BY LEVEL <= LENGTH(regexp_replace (value, '[^' || pv_separator || ']+')) + 1
ORDER BY level;
대체할 수 있는 위치pv_string
구문 분석할 문자열(예: 'a,b,c,d,e') 및pv_separator
구분자 문자열(예: ',')을 사용합니다.
쉼표로 구분된 기본 문자열의 경우.아래의 실행 절차는 한 번에 한 조각씩 레코드를 축소하도록 설계되었습니다.언제p_input_string = p_output_value
끝났다.기본값은 쉼표이지만 다른 구분 기호로 전달할 수 있습니다.
parse_delimited_string(V_string, v_value, ';');
세미콜론 구분
create or replace procedure parse_delimited_string(P_INPUT_STRING IN OUT VARCHAR2,
P_OUTPUT_VALUE OUT VARCHAR2,
P_DELIMITOR IN VARCHAR2 DEFAULT ',')
is
/*This Procedure will parse out the first field of a delimited string it will return
the result and a the orginal string minus the parsed out string.
the ideal would be to execute this procedure for each field you want to extract
from string. If you don't know how many values you need to parse out you can just
keep executing this until the p_input_strng equals the P_output_value
*/
begin
IF (instr(P_INPUT_STRING, P_DELIMITOR)) > 0
THEN
P_OUTPUT_VALUE := substr(P_INPUT_STRING, 1, (instr(P_INPUT_STRING, P_DELIMITOR)));
P_INPUT_STRING := regexp_replace(P_INPUT_STRING, P_OUTPUT_VALUE, '',1,1);
P_OUTPUT_VALUE := replace(P_OUTPUT_VALUE, P_DELIMITOR, '');
IF NVL(P_INPUT_STRING, ' ') = ' '
THEN
P_INPUT_STRING := P_OUTPUT_VALUE;
END IF;
ELSE
P_OUTPUT_VALUE := P_INPUT_STRING;
END IF;
end parse_delimited_string;
declare
type vartype is varray(10) of number;
x1 vartype;
total integer;
begin
x1 := vartype (1,2,3,4);
total := x1.count;
for i in 1 .. total loop
dbms_output.put_line(x1(i));
end loop;
end;
/
언급URL : https://stackoverflow.com/questions/7028098/how-to-parse-comma-delimited-string-in-pl-sql
반응형
'programing' 카테고리의 다른 글
숫자가 들어 있는 문자열을 올바르게 정렬하는 방법은 무엇입니까? (0) | 2023.07.20 |
---|---|
IPython 노트북을 올바르게 닫는 방법은 무엇입니까? (0) | 2023.07.20 |
Oracle의 NULL 스토리지 (0) | 2023.07.20 |
플라스크 응답으로 이미지를 반환하는 방법은 무엇입니까? (0) | 2023.07.20 |
설명 계획과 실행 계획의 차이 (0) | 2023.07.20 |