Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie man mit PL/SQL-Arrays oder -Sammlungen als Parameter arbeitet und sie dann nach Index zusammenfügt

Der von Ihnen verwendete Sammlungstyp ist ein Varray, daher ist er indiziert. Sie können Folgendes tun:

FOR i IN 1..v_contacts_fname.COUNT
LOOP

  dbms_output.put_line(v_contacts_fname(i) ||', ' || v_contacts_lname(i));

END LOOP;

Anpassung Ihres Beispielcodes:

DECLARE

PROCEDURE create_account(p_entity_id NUMBER
                         , p_sub_id NUMBER
                         , v_contacts_fname sys.odcivarchar2list
                         , v_contacts_lname sys.odcivarchar2list
                         )
  IS

  BEGIN

    dbms_output.put_line('Entity_id: ' || p_entity_id || ' - Sub_id: ' || p_sub_id);

    FOR i IN 1..v_contacts_fname.COUNT
    LOOP

      dbms_output.put_line(v_contacts_fname(i) ||', ' || v_contacts_lname(i));

    END LOOP;


END create_account;

BEGIN

  create_account(p_entity_id            => 550005
                     , p_sub_id         => 100051
                     , v_contacts_fname => sys.odcivarchar2list('dan','bob')
                     , v_contacts_lname => sys.odcivarchar2list('anderson','bebop')
      ) ;

END;
/

bekommt jetzt

Entity_id: 550005 - Sub_id: 100051
dan, anderson
bob, bebop


PL/SQL procedure successfully completed.

Sie könnten zu Beginn eine sehr einfache Überprüfung durchführen, um zu überprüfen, ob der count von beiden Arrays ist gleich - wenn nicht, dann werfen Sie vielleicht eine Ausnahme.

Wenn Sie ein einzelnes Sammlungsargument übergeben möchten, müsste dieses Argument eine Sammlung von Datensatz- oder Objekttypen sein, die entweder auf Schemaebene oder vielleicht in einem Paket deklariert werden, je nachdem, wie Sie den Inhalt verwenden möchten (und bis zu einem gewissen Grad , die Version von Oracle, die Sie verwenden). Es hört sich aber so an, als ob Sie das nicht wollen.