sql >> Databáze >  >> RDS >> Oracle

Předání pole dat jako vstupního parametru proceduře Oracle

Toto je jeden způsob, jak to udělat:

SQL> set serveroutput on
SQL> CREATE OR REPLACE TYPE MyType AS VARRAY(200) OF VARCHAR2(50);
  2  /

Type created

SQL> CREATE OR REPLACE PROCEDURE testing (t_in MyType) IS
  2  BEGIN
  3    FOR i IN 1..t_in.count LOOP
  4      dbms_output.put_line(t_in(i));
  5    END LOOP;
  6  END;
  7  /

Procedure created

SQL> DECLARE
  2    v_t MyType;
  3  BEGIN
  4    v_t := MyType();
  5    v_t.EXTEND(10);
  6    v_t(1) := 'this is a test';
  7    v_t(2) := 'A second test line';
  8    testing(v_t);
  9  END;
 10  /

this is a test
A second test line

Chcete-li rozšířit svůj komentář k odpovědi @dcp, zde je návod, jak byste mohli implementovat zde navržené řešení, pokud byste chtěli použít asociativní pole:

SQL> CREATE OR REPLACE PACKAGE p IS
  2    TYPE p_type IS TABLE OF VARCHAR2(50) INDEX BY BINARY_INTEGER;
  3  
  4    PROCEDURE pp (inp p_type);
  5  END p;
  6  /

Package created
SQL> CREATE OR REPLACE PACKAGE BODY p IS
  2    PROCEDURE pp (inp p_type) IS
  3    BEGIN
  4      FOR i IN 1..inp.count LOOP
  5        dbms_output.put_line(inp(i));
  6      END LOOP;
  7    END pp;
  8  END p;
  9  /

Package body created
SQL> DECLARE
  2    v_t p.p_type;
  3  BEGIN
  4    v_t(1) := 'this is a test of p';
  5    v_t(2) := 'A second test line for p';
  6    p.pp(v_t);
  7  END;
  8  /

this is a test of p
A second test line for p

PL/SQL procedure successfully completed

SQL> 

To obchoduje s vytvořením samostatného Oracle TYPE (který nemůže být asociativním polem) s vyžadováním definice balíčku, který může vidět všichni, aby TYPE, který tam definuje, mohli používat všichni.



  1. Zkontrolujte verzi SQLite

  2. Důvod, proč Oracle rozlišuje velká a malá písmena?

  3. Jak mohu získat počet dní mezi 2 daty v Oracle 11g?

  4. Použití Robolectric s SQLiteAssetHelper