sql >> Databasteknik >  >> RDS >> Oracle

Att skicka en array av data som en indataparameter till en Oracle-procedur

Det här är ett sätt att göra det:

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

För att utöka min kommentar till @dcps svar, så här kan du implementera lösningen som föreslås där om du ville använda en associativ array:

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> 

Detta handlar om att skapa en fristående Oracle TYPE (som inte kan vara en associativ array) som kräver definitionen av ett paket som kan ses av alla för att den TYPE som den definierar där kan användas av alla.



  1. Hämta en kolumns namn från dess ID i SQL Server:COL_NAME()

  2. Det går inte att ansluta till Postgres DB på grund av autentiseringstypen 10 stöds inte

  3. MSSQL-fel "Den underliggande leverantören misslyckades vid Open"

  4. Oracle Database 21c