2016-07-15 18 views
0

Ich bin mit der Weitergabe von Daten als ein Array-Parameter von der Oracle Apex-Seite in Paket stecken. Paket enthält eine Prozedur mit einem Array von Datenarten. Also, was ich tun möchte, ist, ein einfaches Datum von der Apex-Seite, pl/sql Block, hinein zu geben. Hier ist mein Code so weit:Wie übergeben Sie ein Array von Werten von Oracle Apex Page in Oracle gespeicherte Prozedur

create or replace PACKAGE PK_NAME AS 

TYPE DATES_ARRAY_TYPE IS VARRAY(100) OF DATE; 

PROCEDURE PASS_DATES (
     DATES DATES_ARRAY_TYPE 
); 

END PK_NAME; 

create or replace PACKAGE BODY PK_NAME AS 

PROCEDURE PASS_DATES (
    DATES DATES_ARRAY_TYPE 
) AS  
BEGIN  
for i in 1..DATES.count loop     
    HTP.P(DATES(i)); 
end loop; 
END; 
END PASS_DATES; 

END PK_NAME; 

Einfach so. Und ich nenne dieses Verfahren von dem Apex Seite PL/SQL-Block:

PK_NAME.PASS_DATES (
    DATES => '15-JAN-15', '16-JAN-15', '17-JAN-15' 
); 

Allerdings funktioniert es nicht, jedes Mal, ich versuche, es zu retten, es gibt mir eine Fehlermeldung:

•ORA-06550: line 3, column 25: PLS-00312: a positional parameter association may not follow a named association ORA-06550: line 2, column 1: PL/SQL: Statement ignored

Was ist daran falsch oder was habe ich verpasst?

Antwort

1

https://docs.oracle.com/cd/A97630_01/appdev.920/a96624/05_colls.htm

Sie Konstruktor DATES_ARRAY_TYPE init muss() ich denke, es wie dieses

create TYPE DATES_ARRAY_TYPE IS VARRAY(100) OF DATE; 

create or replace procedure test_case(p_dates DATES_ARRAY_TYPE) is 
begin 
    dbms_output.put_line(p_dates(1)); 
end; 

declare 
a DATES_ARRAY_TYPE; 
begin 
a := DATES_ARRAY_TYPE(sysdate, sysdate + 1,to_date('1.01.2016','dd.mm.yyyy')); 
    test_case(a); 
end; 

auch verwenden, müssen Sie wie Objekt, wenn Sie wollen aussehen muss TYPE in PAKET PK_NAME (nicht global) verwenden PK_NAME.DATES_ARRAY_TYPE in Ihrem Code.

ok, kann in Ihrem Fall gehen: 1. erstellen Paket und Körper: https://gyazo.com/789b875ce47852e859c395c2021f9cd4

create or replace PACKAGE PCK AS 
    -- your type in pck 
    TYPE DATES_ARRAY_TYPE IS VARRAY(100) OF DATE; 
    procedure test_case(p_dates DATES_ARRAY_TYPE);  
END PCK; 

create or replace PACKAGE body PCK AS 
    procedure test_case(p_dates DATES_ARRAY_TYPE) IS 
    BEGIN 
    --here just raise second element in array for DEMO 
    raise_application_error('-20000',p_dates(2)); 
    END; 
END PCK; 

2.Create Seite und Knopf und nach einreichen Prozess: https://gyazo.com/755f6e089db0a6a8ea058567d2b3384b

declare 
    asd PCK.DATES_ARRAY_TYPE := PCK.DATES_ARRAY_TYPE('31-JUL-15', '01-AUG-15', '02-AUG-13', '03-AUG-13'); 
begin 
    pck.test_case(asd); 
end; 
  1. nach der Schaltfläche, die Seite senden, bekomme ich diese: https://gyazo.com/b894fc6b9b6dd28964ba2e6548244bc8
+0

Ich habe eine weitere Region innerhalb der Apex-Seite mit dem Code erstellt: "declare Typ Array_t ist Varray (50) des Datums; Array array_t: = array_t ('31 -JUL-15 ', '01-AUG-15', '02-AUG-13 ', '03-AUG-13'); beginnen für i in 1..array.count Schleife htp.prn (Array (i)); Endschleife; Ende: "Es funktioniert gut, aber unsere Anforderungen ist es, Package-Prozedur von der Apex aufrufen und Array von Daten übergeben, so dass dieses Arbeitsbeispiel keine Option ist, fürchte ich ... Alle Gedanken, wie Sie es für unsere einbetten Besondere Anforderungen?! Und vielen Dank für die Antwort Анатолий, sehr geschätzt! – USSR

+0

Und wenn ich versuche, PK_NAME.DATES_ARRAY_TYPE zu verwenden, gibt es mir einen Fehler: "ORA-06550: Zeile 2, Spalte 1: PLS-00221: 'DATES_ARRAY_TYPE' ist nicht eine Prozedur oder ist undefiniert ORA-06550: Zeile 2, Spalte 1: PL/SQL: Anweisung ignoriert ". Und ja, ich möchte sie aus dem Paket heraus verwenden. Danke für den Link, aber ich folgte ihm, als ich zuerst meine erstellte Paket, einfach versucht, es zu konvertieren, um meine Anforderungen zu unterstützen. Und Anforderungen sind, mit dem Paket und einfach Prozedur aus dem Apex Region pl/sql Block aufrufen und mehrere Daten als Parameter übergeben ... – USSR

+0

Hallo mein Freund, ich bin bearbeiten meine Antwort, um weitere Beispiele hinzuzufügen und Screenshots. sieh es dir an, ich hoffe das hilft dir das Problem zu lösen. :) –