programing

PL/SQL: 테이블에서 연결 배열로 선택

i4 2023. 8. 24. 21:48
반응형

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

반응형