当我们写完一段存储过程后,必然需要调试运行一下写的代码是否能成功运行,当参数是字符,数字或日期时,可以直接在测试窗口输入值。但是类型如果是定义好的TYPE,就无法简单的输入。
一、自定义TYPE
TYPE的创建
CREATE OR REPLACE TYPE "TYP_USER_INFO" AS OBJECT
(
U_ID VARCHAR2(4) --用户ID
,U_NAME VARCHAR2(10) --用户名
,U_SEX VARCHAR2(1) --性别
)
需要测试的存储过程
举一个简单的例子,查询某个用户的具有的权限
CREATE OR REPLACE PACKAGE BODY PKG_TYPE_TEST IS
TYPE typCSR IS REF CURSOR;
FUNCTION F_GET_POWER_DATA(ptUSER_INFO IN TYP_USER_INFO
,powerInfoList OUT typCSR) RETURN VARCHAR2 IS
BEGIN
OPEN pPowerInfoList FOR
'SELECT P.PID, P.PNAME
FROM D_USER_POWER P
WHERE P.UID = ' || '''' || ptUSER_INFO. U_ID || '''' || '';
END F_GET_POWER_DATA;
END PKG_TYPE_TEST;
选中方法,进入TEST窗口
DECLARE
ptuser_info typ_user_info := typ_user_info('9572','小唐','1');
BEGIN
:result := PKG_TYPE_TEST. F_GET_POWER_DATA(ptuser_info => ptuser_info,
powerInfoList => : powerInfoList,
);
END;
首先需要声明一个TYPE类型变量,存储TYPE中需要封装的数据,再传入方法中即可进行测试。
二、集合
Oracle数据库中声明集合类型有好几种方法,这里举例使用的是嵌套表,即使用IS TABLE OF
。
CREATE OR REPLACE TYPE "TYP_USER_INFO_LIST" AS TABLE OF TYP_USER_INFO
语句中的TYP_USER_INFO
是文章开头创建的TYPE。
这次是查询指定ID的用户的信息
CREATE OR REPLACE PACKAGE BODY PKG_TYPE_TEST IS
TYPE typCSR IS REF CURSOR;
FUNCTION F_GET_USER_DATA(ptUSER_INFO_LIST IN TYP_USER_INFO_LIST
,userInfoList OUT typCSR) RETURN VARCHAR2 IS
lIdList LONG := '';
lNameList LONG := '';
ptuserInfo TYP_USER_INFO;
BEGIN
IF userInfoList IS NOT NULL AND userInfoList.COUNT > 0 THEN
FOR IDX IN 1 .. userInfoList.COUNT LOOP
ptuserInfo := userInfoList(IDX);
lIdList := lIdList || '''' || ptuserInfo. U_ID || '''' || ',';
lNameList := lNameList || '''' || ptuserInfo.U_NAME || '''' || ',';
END LOOP;
lIdList := substr(lIdList,0,length(lIdList)-1);
lNameList := substr(lNameList,0,length(lNameList)-1);
END IF;
OPEN userInfoList FOR
'SELECT U.*
FROM D_USER_INFO U
WHERE AND U. U_ID IN (' || lIdList ||')
AND U.U_NAME IN (' || lNameList ||')';
END F_GET_USER_DATA;
END PKG_TYPE_TEST;
选中方法,进入TEST窗口
DECLARE
puserinfolist TYP_USER_INFO_LIST := TYP_USER_INFO_LIST();
BEGIN
puserinfolist.Extend(3);
puserinfolist(1) := TYP_USER_INFO('9572','小唐','1');
puserinfolist(2) := TYP_USER_INFO('9573','小王','2');
puserinfolist(3) := TYP_USER_INFO('9574','小李','1');
:result := PKG_TYPE_TEST. F_GET_USER_DATA(puserinfolist => puserinfolist,
userInfoList => : userInfoList,
);
END;
集合测试时候要使用
Extend
关键字。
Extend方法
向可变数组或嵌套表尾部添加元素。集合可以为EMPTY,但不能为NULL。
Extend(n),向集合添加n个null元素。
Extend(n, i),向集合添加n个第i个元素的拷贝。