각 문자열에 대해 함수/프로시저 실행
문자열 목록을 반복하여 각 문자열을 인수로 사용하여 함수/프로시저를 실행하려고 합니다.
다음 일반 코드에 대한 가장 좋은 대안은 무엇입니까(합법적이지 않기 때문에):
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
'programing' 카테고리의 다른 글
ODP를 지우는 방법.연결 오류 시 NET 연결 풀? (0) | 2023.07.20 |
---|---|
ORA-01465: BLOB를 사용하는 동안 오라클의 16진수가 잘못되었습니다. (0) | 2023.07.20 |
스키마 독립 엔티티 프레임워크 코드 첫 번째 마이그레이션 (0) | 2023.07.20 |
Win32-API에 사용자 지정 유형이 많은 이유는 무엇입니까? (0) | 2023.07.20 |
Firebase 권한 거부됨 (0) | 2023.07.20 |