PL/SQL: 테이블에서 연결 배열로 선택
하나의 쿼리에서 pl/sql 연관 배열로 데이터를 선택하려고 합니다.하드 코딩된 키로 이 작업을 수행할 수 있지만 다른 열(키 열)을 대신 참조할 수 있는 방법이 있는지 알고 싶었습니다.
DECLARE
TYPE VarAssoc IS TABLE OF varchar2(2) INDEX BY varchar2(3);
vars VarAssoc;
BEGIN
SELECT foo, bar INTO vars(foo) FROM schema.table;
END;
이 작업을 수행할 때 foo가 선언되어야 한다는 오류가 발생합니다.단일 쿼리에서 내 어소시에이트 어레이를 생성할 수 있는 방법이 있습니까? 아니면 FOR 루프에 다시 의존해야 합니까?
APC의 답변에 대한 당신의 의견을 읽어보세요, 이것은 당신이 스스로 해결한 것처럼 들립니다.하지만 저는 미래의 연구자들을 위해 어떻게든 답을 넣을 것이라고 생각했습니다.
이 코드는 더 간단하지만 BULK COLLECT를 사용할 때의 속도 이점은 없습니다.쿼리에 의해 반환된 행을 반복하고 연관 배열의 요소를 개별적으로 설정하기만 하면 됩니다.
DECLARE
TYPE VarAssoc IS TABLE OF varchar2(200) INDEX BY varchar2(30);
vars VarAssoc;
BEGIN
FOR r IN (SELECT table_name,tablespace_name FROM user_tables) LOOP
vars(r.table_name) := r.tablespace_name;
END LOOP;
dbms_output.put_line( vars('JAVA$OPTIONS') );
END;
가능하다면 깔끔하겠지만 그것은 이것을 얻는 간단한 방법이 아닙니다.
일반 PL/SQL 컬렉션에 데이터를 로드한 다음 연관 배열에 로드할 수 있습니다.이것이 단순히 테이블을 빙글빙글 도는 것보다 더 빠른지는 tats의 문제입니다. 우리가 대량의 데이터를 처리하지 않는 한 문제는 아마 문제가 되지 않을 것입니다.
이 테스트 데이터를 보면...
SQL> select * from t23
2 order by c1
3 /
C1 C2
-- ---
AA ABC
BB BED
CC CAR
DD DYE
EE EYE
ZZ ZOO
6 rows selected.
SQL>
...다음 두 단계로 연결 어레이를 채울 수 있습니다.
SQL> set serveroutput on
SQL>
SQL> declare
2 type varassoc is table of varchar2(3) index by varchar2(2);
3 vars varassoc;
4
5 type nt is table of t23%rowtype;
6 loc_nt nt;
7
8 begin
9 select * bulk collect into loc_nt from t23;
10 dbms_output.put_line('no of recs = '||sql%rowcount);
11
12 for i in loc_nt.first()..loc_nt.last()
13 loop
14 vars(loc_nt(i).c1) := loc_nt(i).c2;
15 end loop;
16
17 dbms_output.put_line('no of vars = '||vars.count());
18
19 dbms_output.put_line('ZZ = '||vars('ZZ'));
20
21 end;
22 /
no of recs = 6
no of vars = 6
ZZ = ZOO
PL/SQL procedure successfully completed.
SQL>
실제 문제는 연관 배열을 채우는 것이 테이블에서 행을 선택하는 것보다 성능이 더 좋은지 여부입니다.11g Enterprise 버전을 사용하는 경우 결과 집합 캐싱을 대신 고려해야 합니다.
당신은 연상배열과 완전히 결혼했습니까?문자 키를 사용하여 배열을 조회할 수 있기 때문에 이 작업을 수행하는 것으로 가정합니다.
그렇다면 컬렉션 유형으로 구현하는 것을 고려해 보셨습니까?
예.
CREATE OR REPLACE TYPE VAR_ASSOC as OBJECT(
KEYID VARCHAR2(3),
DATAVAL VARCHAR2(2)
)
/
CREATE OR REPLACE TYPE VAR_ASSOC_TBL AS TABLE OF VAR_ASSOC
/
CREATE OR REPLACE PROCEDURE USE_VAR_ASSOC_TBL
AS
vars Var_Assoc_tbl;
-- other variables...
BEGIN
select cast ( multiset (
select foo as keyid,
bar as dataval
from schema.table
) as var_Assoc_tbl
)
into vars
from dual;
-- and later, when you want to do your lookups
select ot.newfoo
,myvars.dataval
,ot.otherval
into ....
from schema.other_Table ot
join table(vars) as myvars
on ot.newfoo = myvars.keyid;
end;
/
이렇게 하면 문자 키 값별로 조회할 수 있으며 모든 작업을 대량으로 수행할 수 있습니다.
언급URL : https://stackoverflow.com/questions/5183330/pl-sql-selecting-from-a-table-into-an-assoc-array
'programing' 카테고리의 다른 글
github에서 상호 참조 커밋 (0) | 2023.08.24 |
---|---|
UserControl, WebControl, RenderedControl 및 CompositeControl의 차이점은 무엇입니까? (0) | 2023.08.24 |
제출하기 전에 양식에 필드를 추가하는 방법은 무엇입니까? (0) | 2023.08.24 |
오른쪽 테이블 결과에서 다차원 배열 가져오기 (0) | 2023.08.24 |
Mysql, 날짜 범위에서 파티셔닝이 작동하지 않습니다. (0) | 2023.08.24 |