>source

두 가지 절차가 있습니다. 프로 시저 1에서 두 번째 프로 시저를 호출하면 테이블을 출력 매개 변수로 리턴합니다. 때때로 프로 시저 2가 두 번 이상 호출 될 수 있습니다. 문제는 절차 2에서 얻은 모든 것을 하나의 테이블로 병합하거나 추가하는 방법입니다.

테이블 유형은 사용자 정의입니다 :

CREATE OR REPLACE TYPE t_record AS OBJECT
(
  i         NUMBER,
  city_name VARCHAR2(100)
);
create or replace type t_table as table of t_record;

나는 MULTISET UNION ALL 에 대해 알고있다 , 그러나 절차 1 내에서 절차 2가 몇 번이나 호출되는지 모르기 때문에 사용이 불가능 해 보입니다.

어떻게해야합니까? 어쩌면 내가하는 모든 일이 잘못되어 더 나은 방법이있을 수 있습니다. 제안을 듣고 기뻐할 것입니다.

FOR @hotfix

절차 1의 코드를 단순화했습니다. 실제로 루프와 사후 루프 내에서 절차 2를 호출합니다.

FOR insurance_program IN insurance_programs LOOP
    IF insurance_program.level_of_service = 'additional' THEN
        Procedure2(client_id, 2, insurance_program.program_id, avaliable_cities);
    END IF; 
END LOOP; 
Procedure2(client_id, 1, 1, avaliable_cities);


  • 답변 # 1

    MULTISET UNION ALL 사용  반환하는 배열에 추가하려면 다음을 수행하십시오.

    CREATE PROCEDURE Procedure1(
      client_id        IN  NUMBER,
      available_cities OUT t_table
    )
    IS
      program_available_cities t_table;
      -- Dummy cursor with 3 rows.
      CURSOR insurance_programs IS
        SELECT LEVEL AS program_id,
               'additional' AS level_of_service
        FROM   DUAL
        CONNECT BY LEVEL <= 3;
    BEGIN
      available_cities := t_table();
      FOR insurance_program IN insurance_programs LOOP
        IF insurance_program.level_of_service = 'additional' THEN
          Procedure2( client_id, 2, insurance_program.program_id, program_available_cities );
          available_cities := available_cities MULTISET UNION ALL program_available_cities;
        END IF; 
      END LOOP;
    END;
    /
    
    

    :

    CREATE OR REPLACE TYPE t_record AS OBJECT
    (
      i         NUMBER,
      city_name VARCHAR2(100)
    );
    create or replace type t_table as table of t_record;
    -- Dummy procedure to output 4 cities every time it is called
    CREATE PROCEDURE Procedure2(
      client_id  IN NUMBER,
      variable1  IN NUMBER,
      program_id IN NUMBER,
      available_cities OUT t_table
    )
    IS
    BEGIN
      available_cities := t_table();
      available_cities.EXTEND(4);
      FOR i IN 1 .. 4 LOOP
        available_cities(i) := t_record(
                                 4 * program_id + i - 4,
                                 'City' || TO_CHAR( 4 * program_id + i - 4 )
                               );
      END LOOP;
    END;
    /
    DECLARE
      available_cities t_table;
    BEGIN
      Procedure1( 1, available_cities );
      FOR i in 1 .. available_cities.COUNT LOOP
        DBMS_OUTPUT.PUT_LINE( available_cities(i).i || ': ' || available_cities(i).city_name );
      END LOOP;
    END;
    /
    
    

    출력:

    1: City1
    2: City2
    3: City3
    4: City4
    5: City5
    6: City6
    7: City7
    8: City8
    9: City9
    10: City10
    11: City11
    12: City12
    
    

    db<>여기에서 바이올린

  • 이전 sql - 명명 된 인스턴스와 기본 인스턴스의 차이점은 무엇입니까?
  • 다음 여러 검색어가 포함 된 Elasticsearch Nester_filter