2014-09-25 58 views
0
PROCEDURE test_max_rows (
    test_out OUT NOCOPY test_col_t, 
    test_in IN   test_t, 
    max_rows IN   NUMBER DEFAULT 1000; 
) 
IS 
    CURSOR cur_test (max_rows IN number) IS 
     SELECT id FROM test_table 
     WHERE test_in.key_id = 'ABC' 
     AND test_in.curr_nm IS NOT NULL 
     AND max_rows < 1 OR ROWNUM <= max_rows; 
BEGIN 
    OPEN cur_test(NVL(max_rows, 1000)) ; 
    FETCH cur_test BULK COLLECT INTO test_out; 
    CLOSE cur_test ; 
END test_max_rows; 
/

test_t是對象類型,定義如下的存儲過程:測試其使用集合類型

test_t

DATE_FROM TIMESTAMP 
DATE_TO TIMESTAMP 
CD  col_t 
CURR_NM col_t 
VAL  VARCHAR2(40)   
KEY_ID NUMBER 

col_t是集合類型,定義如下:

CREATE OR REPLACE TYPE COL_T IS TABLE OF VARCHAR2(200); 

我沒工作過無線並希望通過創建一個PL/SQL匿名塊來驗證此proc,以驗證在爲max_rows傳遞不同值時它會輸出正確的行數。

MAX_ROWS:500個返回的行:500個

MAX_ROWS:10000個返回的行:10000個

MAX_ROWS:-1返回的行:全部取出由選擇查詢光標。

我不知道如何在匿名塊中傳遞對象和集合類型的值。感謝您提前提供任何幫助。

回答

1

你只需要聲明一個相同類型的集合變量;並聲明並填充要傳遞的對象;

set serveroutput on 
DECLARE 
    result test_col_t; 
    input test_t; 
BEGIN 
    input := new test_t(null, null, null, new test_col_t(), null, 'ABC'); 
    test_max_rows(result, input, 50); 
    dbms_output.put_line('Rows returned: ' || result.count); 
END; 
/

你並不需要初始化集合,因爲它是在程序的OUT參數,但你需要初始化IN參數。現在我已經將您沒有使用的對象屬性設置爲null。如果您願意,您可以定義一個NUMBER變量作爲max_rows號碼。

我一直堅持使用ABC作爲您的查詢所需的內容,但在您的對象定義中它是一個數字,因此您需要更改類型或將其設置爲(並測試)一個數字代替。如果KEY_ID被定義爲VARCHAR2而不是NUMBER,它會按照您顯示的定義(錯誤更正,如在DEFAULT 1000之後刪除分號)運行。

+0

Thanks @Alex。我已經編輯了一下這個問題。你可以請進一步幫助。 – 2014-09-25 07:09:10

+0

@WamglindCarmasaic - 你發佈的內容存在一些問題,但我已經修復了我的區塊以傳遞一個對象,並進行了一些小的調整來解決這些問題。 – 2014-09-25 07:32:04

+0

@WamglindCarmasaic - 我懷疑你的意思是你的編輯改爲'WHERE user_id = test_in.key_id',所以這些類型需要保持一致。測試'curr_nm'是否爲空看起來有點奇怪,因爲它與表中的行沒有關係。 – 2014-09-25 07:47:37