2016-07-15 4 views
0

Я зациклился на проходящих Датах в качестве параметров массива с страницы Oracle Apex в пакете. Пакет содержит одну процедуру с массивом типов дат. Так что я хочу сделать, это передать простые даты в него с страницы Apex, pl/sql block. Вот мой код:Как передать массив значений из страницы Oracle Apex в хранимую процедуру Oracle

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; 

Просто как это. И я называю эту процедуру из страницы PL/SQL блока Apex:

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

Однако, это не работает, каждый раз, когда я пытаюсь сохранить его, он дает мне ошибку:

•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

Что не так с этим или что я пропустил?

ответ

1

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

вы должны инициализировать конструктор DATES_ARRAY_TYPE() я думаю, что это должно выглядеть следующим образом

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; 

также, если вы хотите использовать TYPE в ПАКЕТА PK_NAME (не глобальные), вы должны использовать объект как PK_NAME.DATES_ARRAY_TYPE в вашем коде.

нормально, отпускает в вашем случае: 1. создать пакет и тело: 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 страницу и кнопку, и после того, как представить процесс: 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. после кнопки, которая отправляет страницу, я получаю это: https://gyazo.com/b894fc6b9b6dd28964ba2e6548244bc8
+0

Я создал еще один регион на странице Apex, с кодом: "declare type array_t является varray (50) даты; массив array_t: = array_t ('31 -JUL-15 ', '01 -AUG-15', '02 -AUG-13 ', '03 -AUG-13'); begin for i in 1..array.count loop htp.prn (array (i)); контур конца; end; «Это прекрасно работает, однако наши требования заключаются в том, чтобы вызвать процедуру пакета из Apex и передать массив дат, поэтому этот рабочий пример не является вариантом, которого я боюсь ... Любые мысли о том, как внедрить его для наших Особые требования?! И спасибо за ответ Анатолий, высоко оценил! – USSR

+0

И когда я пытаюсь использовать PK_NAME.DATES_ARRAY_TYPE, он дает мне ошибку: «ORA-06550: строка 2, столбец 1: PLS-00221:« DATES_ARRAY_TYPE »не процедура или не определена ORA-06550: строка 2, столбец 1: PL/SQL: заявление игнорируется ». И да, я хотел бы использовать его изнутри пакета. Спасибо за ссылку, но я последовал за ней, когда сначала создал мой пакет, просто попробовал преобразовать его для поддержки моих требований. И требования заключаются в том, что с помощью пакета и просто вызывать процедуру из блока PL/sql региона Apex Region и передавать несколько дат в качестве параметров ... – USSR

+0

привет, мой друг, я редактирую мой ответ, чтобы добавить еще несколько примеров и скриншоты. см. его, я надеюсь, что это поможет вам решить проблему. :) –