1. 程式人生 > >存儲過程TYPE類型參數調試

存儲過程TYPE類型參數調試

uid test result 數字 變量 not null name 但是 ret

當我們寫完一段存儲過程後,必然需要調試運行一下寫的代碼是否能成功運行,當參數是字符,數字或日期時,可以直接在測試窗口輸入值。但是類型如果是定義好的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個元素的拷貝。

存儲過程TYPE類型參數調試