Oracle PL/SQL For Loop을 사용하여 쉼표로 구분된 문자열을 반복합니다.
나는 문자열의 내용에 대해 반복해야 하는 코드를 작성하고 있으며, 각 값은 다음과 같이 구분됩니다.,
.
예: 내 것이 있습니다.elements
v_list_pak_like varchar2(4000) := 'PEBO,PTGC,PTTL,PTOP,PTA';
루프에서 반복하기 위해 배열/커서로 가져오려면 어떻게 해야 합니까?
for x in (elements)
loop
-- do my stuff
end loop;
가능하다면 연관 배열을 선언하는 것을 피하는 매우 간단한 방법을 찾고 있습니다.
입력으로 사용할 수 있는 것을 반환하는 함수를 만드는 것이 가능합니까?for
루프(https://stackoverflow.com/a/19184203/6019417) 처럼 사용할 수 있는 기간과 비교하면 어떻습니까?
미리 감사 드려요.
순수 SQL에서 쉽게 수행할 수 있습니다. 여러 가지 방법이 있습니다. Oracle에서 쉼표로 구분된 문자열을 행으로 분할을 참조하십시오.
그러나 PL/SQL에서 이 작업을 수행하려면 다음과 같이 수행할 수 있습니다.
SQL> set serveroutput on
SQL> DECLARE
2 str VARCHAR2(100) := 'PEBO,PTGC,PTTL,PTOP,PTA';
3 BEGIN
4 FOR i IN
5 (SELECT trim(regexp_substr(str, '[^,]+', 1, LEVEL)) l
6 FROM dual
7 CONNECT BY LEVEL <= regexp_count(str, ',')+1
8 )
9 LOOP
10 dbms_output.put_line(i.l);
11 END LOOP;
12 END;
13 /
PEBO
PTGC
PTTL
PTOP
PTA
PL/SQL procedure successfully completed.
SQL>
랄릿의 훌륭한 지침 덕분에, 나는 나의 컴퓨터에서 호출할 수 있는 함수를 만들 수 있습니다.for
루프:
유형 및 함수 만들기
CREATE OR REPLACE TYPE t_my_list AS TABLE OF VARCHAR2(100);
CREATE OR REPLACE
FUNCTION comma_to_table(p_list IN VARCHAR2)
RETURN t_my_list
AS
l_string VARCHAR2(32767) := p_list || ',';
l_comma_index PLS_INTEGER;
l_index PLS_INTEGER := 1;
l_tab t_my_list := t_my_list();
BEGIN
LOOP
l_comma_index := INSTR(l_string, ',', l_index);
EXIT
WHEN l_comma_index = 0;
l_tab.EXTEND;
l_tab(l_tab.COUNT) := TRIM(SUBSTR(l_string,l_index,l_comma_index - l_index));
l_index := l_comma_index + 1;
END LOOP;
RETURN l_tab;
END comma_to_table;
/
그럼 내 루프에서 호출하는 방법:
declare
v_list_pak_like varchar2(4000) := 'PEBO,PTGC,PTTL,PTOP,PTA';
begin
FOR x IN (select * from (table(comma_to_table(v_list_pak_like)) ) )
loop
dbms_output.put_line(x.COLUMN_VALUE);
end loop;
end;
/
기본 이름 확인COLUMN_VALUE
오라클이 제공한 결과를 사용하기 위해 필요합니다.
예상대로의 결과:
PEBO
PTGC
PTTL
PTOP
PTA
declare
type array_type is table of VARCHAR2(255) NOT NULL;
my_array array_type := array_type('aaa','bbb','ccc');
begin
for i in my_array.first..my_array.last loop
dbms_output.put_line( my_array(i) );
end loop;
end;
첫 번째 줄은 원하는 모든 유형의 테이블을 정의합니다.
그런 다음 해당 유형의 변수를 선언하고 생성자를 사용하여 값을 지정합니다.
그런 다음 결과를 첫 번째 인덱스에서 마지막 인덱스로 루프합니다.
편집 - 실제 문자열을 처리하는 솔루션:
declare
str VARCHAR2(1024) := 'aaa,bbb,ccc';
type ARRAY_TYPE is table of VARCHAR2(255) NOT NULL;
my_array ARRAY_TYPE;
begin
SELECT REGEXP_SUBSTR(str, '[^,]+', 1, LEVEL) BULK COLLECT INTO my_array
FROM DUAL
CONNECT BY REGEXP_SUBSTR(str, '[^,]+', 1, LEVEL) IS NOT NULL;
for i in my_array.first..my_array.last loop
dbms_output.put_line( my_array(I));
end loop;
end;
언급URL : https://stackoverflow.com/questions/36325831/use-oracle-pl-sql-for-loop-to-iterate-through-comma-delimited-string
'programing' 카테고리의 다른 글
Chocolaty 설치 경로는 어디입니까? (0) | 2023.08.12 |
---|---|
setCaseSensitiveInfo를 모든 폴더 및 하위 폴더에 재귀적으로 적용 (0) | 2023.08.12 |
ES6 화살표 기능에서 반환문을 사용해야 하는 경우 (0) | 2023.08.12 |
경험이 풍부한 새로운 고객을 위한 Oracle Gotchas (0) | 2023.08.12 |
단일 구성 키에 대한 다중 값 (0) | 2023.08.07 |