存储过程TYPE类型参数调试

当我们写完一段存储过程后,必然需要调试运行一下写的代码是否能成功运行,当参数是字符,数字或日期时,可以直接在测试窗口输入值。但是类型如果是定义好的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个元素的拷贝。

原文地址:https://www.cnblogs.com/ghq120/p/10659015.html