2014-09-25 59 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