programing

각 문자열에 대해 함수/프로시저 실행

muds 2023. 7. 20. 22:12
반응형

각 문자열에 대해 함수/프로시저 실행

문자열 목록을 반복하여 각 문자열을 인수로 사용하여 함수/프로시저를 실행하려고 합니다.

다음 일반 코드에 대한 가장 좋은 대안은 무엇입니까(합법적이지 않기 때문에):

set serveroutput on;  
begin
    FOR r IN ('The', 'Quick', 'brown', 'fox')
    LOOP
        dbms_output.put_line( r );
   END LOOP;
end;

이에 대한 패턴이 있을 수 있다고 생각합니다.

완전성을 위해 순수 PL/SQL 솔루션을 제공합니다.

SQL> set serveroutput on
SQL>
SQL> declare
  2      my_array sys.dbms_debug_vc2coll
  3          := sys.dbms_debug_vc2coll('The', 'Quick', 'brown', 'fox');
  4  begin
  5     for r in my_array.first..my_array.last
  6      loop
  7          dbms_output.put_line( my_array(r) );
  8     end loop;
  9  end;
 10  /
The
Quick
brown
fox

PL/SQL procedure successfully completed.

SQL>

이는 사전 선언된 내용을 사용합니다.sys.dbms_debug_vc2coll...의 정의가 상당히 관대한 자료형.

SQL> desc sys.dbms_debug_vc2coll
 sys.dbms_debug_vc2coll TABLE OF VARCHAR2(1000)

SQL>

그래서 개리가 말했듯이, 당신은 당신의 것을 신고하기를 원할 수도 있습니다.특히 현이 짧고 현이 많은 경우에는 더욱 그렇습니다.

DECLARE
  -- 1. declare a list type
  TYPE STR_LIST_TYPE IS TABLE OF VARCHAR2(15);

  -- 2. declare the variable of the list
  V_STR_VALUES STR_LIST_TYPE;

  -- 3. optional variable to store single values
  V_STR_VALUE VARCHAR2(15);

BEGIN

  -- 4. initialize the list of values to be iterated in a for-loop
  V_STR_VALUES := STR_LIST_TYPE('String 1','String 2');

  -- 5. iterating over the values
  FOR INDX IN V_STR_VALUES.FIRST..V_STR_VALUES.LAST
  LOOP

    -- 6. accessing the value itself
    V_STR_VALUE := V_STR_VALUES(INDX);

  END LOOP;     
END;

여기서 답은 줄이 어디서 나오느냐에 따라 달라집니다.'데이터베이스 언어'가 아닌 경우에는 위에서 설명한 것처럼 문자열을 배열로 가져온 다음 배열 위에 루프합니다.문제는 문자열 목록이 하드 코딩되어 있는지, 아니면 데이터베이스 테이블에서 문자열을 선택하고 있는지입니다.

OMG 포니 솔루션은 효과가 있지만, 불필요한 선택이 필요할 수 있습니다.PLSQL 테이블이나 어레이를 사용하는 것이 더 나을 수 있습니다. 제가 말했듯이, 그것은 당신이 처리해야 하는 프로그램에 어떻게 문자열을 넣느냐에 달려 있습니다.다음은 plsql 테이블을 사용하는 예입니다.

declare
  type myarray is table of varchar2(255) index by binary_integer;
  v_array myarray;
begin
  v_array(v_array.count + 1) := 'The';  
  v_array(v_array.count + 1) := 'quick';
  v_array(v_array.count + 1) := 'brown';
  v_array(v_array.count + 1) := 'fox';
  for i in 1..v_array.count loop
    dbms_output.put_line(v_array(i));
  end loop; 
end;
/

나는 보통 나만의 수집 유형을 사용하지만, 당신은 내장된 sys.dbms_debug_vc2coll을 사용할 수 있습니다.

select column_value from table(sys.dbms_debug_vc2coll('The', 'Quick', 'brown', 'fox'));

[columnn_name not column_value를 잘못 받았습니다.수정해 주셔서 감사합니다]

사용:

SELECT package.your_function(x.col)
  FROM (SELECT 'The' AS col
          FROM DUAL
        UNION ALL
        SELECT 'Quick'
          FROM DUAL
        UNION ALL
        SELECT 'brown'
          FROM DUAL
        UNION ALL
        SELECT 'fox'
          FROM DUAL) x

Oracle 9i+, 하위 쿼리 팩터링(AKACTE) 사용


WITH list AS (
  SELECT 'The' AS col
    FROM DUAL
  UNION ALL
  SELECT 'Quick'
    FROM DUAL
  UNION ALL
  SELECT 'brown'
    FROM DUAL
  UNION ALL
  SELECT 'fox'
   FROM DUAL)
SELECT package.your_function(x.col)
  FROM list x
set serveroutput on;  
begin
   dbms_output.put_line('The');
   dbms_output.put_line('Quick');
   dbms_output.put_line('brown');
   dbms_output.put_line('fox');
end;

언급URL : https://stackoverflow.com/questions/2242024/for-each-string-execute-a-function-procedure

반응형