programing

Oracle PL/SQL For Loop을 사용하여 쉼표로 구분된 문자열을 반복합니다.

javajsp 2023. 8. 12. 09:49

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