2016-07-15 60 views
0

我被傳遞的日期作爲數組參數從Oracle Apex頁面套入包中。包中包含一個包含日期類型數組的過程。所以我想要做的就是從Apex頁面pl/sql塊傳入一個簡單的日期。這裏是我的代碼到目前爲止:如何將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塊:

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; 

此外,如果你想在包裝PK_NAME(而非全球)使用類型,你必須使用對象像PK_NAME.DATES_ARRAY_TYPE在你的代碼中。

OK,讓我們去你的情況: 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.創建頁面和按鈕,提交後處理: 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 is date 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 loop; end;「它工作正常,但是,我們的要求是從Apex調用包過程並傳遞日期數組,因此這個工作示例恐怕不是我的選擇......關於如何嵌入它的任何想法特別要求?!並感謝您的答覆Анатолий,高度讚賞! – USSR

+0

當我嘗試使用PK_NAME.DATES_ARRAY_TYPE它給我一個錯誤:「ORA-06550:第2行,第1列:PLS-00221:'DATES_ARRAY_TYPE'不是一個過程或未定義的ORA-06550:第2行,第1列:PL/SQL:語句被忽略「,是的,我想從包中使用它,謝謝你的鏈接,但是當我第一次創建我時包,只是試圖將其轉換爲支持我的要求。而要求是,使用包和從Apex Region pl/sql塊簡單地調用過程並將幾個日期作爲參數傳遞... – USSR

+0

hello my friend,i'm edit我的答案增加了更多的例子和截圖。看到它,我希望這可以幫助你解決問題。 :) –

相關問題