programing

PL/SQL에서 Associative 배열을 재설정하시겠습니까?

testmans 2023. 10. 17. 20:07
반응형

PL/SQL에서 Associative 배열을 재설정하시겠습니까?

이것은 "더 좋은 방법이 있을거야" 라는 질문들 중 하나입니다.제가 문제를 설정하고 나서 해킹된 제 솔루션을 드릴 테니, 더 나은 솔루션을 제안해 주시기 바랍니다.감사합니다!

PL/SQL에 대한 약간의 정보를 살펴보도록 하겠습니다.

DECLARE
 TYPE foo_record IS RECORD (foo%type, bar%type);
 TYPE foo_records IS TABLE OF foo_record INDEX BY PLS_INTEGER;
 arr_foos foo_records;

 CURSOR monkeys is SELECT primates FROM zoo;
 row_monkey monkeys%rowtype;
BEGIN
 FOR row_monkey IN monkeys loop
  /*
    at this point in each iteration I need to have the associative array 
    arr_foos in its original state. if this were java, I'd declare it 
    right here and its scope would be limited to this iteration. However, 
    this is not java, so the scope of the array is effectively global and 
    I can't have one iteration's data meddle with the next.
  */
  null;
 END LOOP;
END;

이해 하셨나요?저는 기본적으로 그것을 무언가로 리셋할 필요가 있습니다.0에서 시작하는 숫자라면 그냥 숫자를 말할 수 있을 겁니다.=0; 모든 반복의 맨 위에 위치하며 완료됩니다.하지만 이건 숫자가 아니라 그냥 깨끗한 상태로 리셋할 수 있는 타입입니다 :=0.

어쨌든, 내 해킹에 대해:

DECLARE
 TYPE foo_record IS RECORD (foo%type, bar%type);
 TYPE foo_records IS TABLE OF foo_record INDEX BY PLS_INTEGER;
 arr_foos foo_records;
 arr_foos_reset foo_records;

 CURSOR monkeys is SELECT primates FROM zoo;
 row_monkey monkeys%rowtype;
BEGIN
 FOR row_monkey IN monkeys loop
  arr_foos := arr_foos_reset;
  null;
 END LOOP;
END;

같은 유형의 멤버를 원래 상태로 유지할 수 있다면 작업 변수를 원래 값으로 다시 설정할 수 있습니다.그리고, 놀랍게도, 그것은 효과가 있습니다 (제 생각에는).)하지만 더 좋은 방법이 있을 겁니다누가 도와줄 수 있습니까?

감사합니다!

가장 쉬운 방법:

arr_foos.Delete();

다른 방법은 내부의 변수를 선언하는 것입니다.FOR루프입니다. 이렇게 하면 패스마다 다시 생성됩니다.

다음과 같은 경우:

DECLARE
 TYPE foo_record IS RECORD (foo%type, bar%type);
 TYPE foo_records IS TABLE OF foo_record INDEX BY PLS_INTEGER;     

 CURSOR monkeys is SELECT primates FROM zoo;
 row_monkey monkeys%rowtype;
BEGIN
 FOR row_monkey IN monkeys loop
  DECLARE
    arr_foos foo_records;
  BEGIN
    null;
  END;
 END LOOP;
END;

동물원 테이블의 데이터를 수집품으로 읽을 건가요?그러면 더 좋은 방법이 있습니다.

DECLARE
  type foos_ts is table of zoo.foo%type index by pls_integer;
  foos foos_t;
BEGIN
  select foo
  bulk collect into foos
  from zoo;
  ...
END;

대량 수집은 가져오기 전에 자동으로 수집을 지웁니다. 루프에서 행 단위로 읽는 것보다 더 빠르게 작동합니다.안타깝게도 레코드와 함께 작동하지 않기 때문에 각 필드별로 여러 개의 PL/SQL 테이블이 필요합니다.

BULK COLLECT 절을 사용하여 쿼리 결과를 컬렉션으로 검색하는 방법은 여기에서 확인할 수 있습니다.

언급URL : https://stackoverflow.com/questions/1731818/resetting-an-associative-array-in-pl-sql

반응형