ストアドプロシージャTYPEタイプパラメータデバッグ

3887 ワード

ストレージ・プロシージャを完了すると、必ず書き込みコードが正常に実行されるかどうかをデバッグする必要があります.パラメータが文字、数字、日付の場合、テスト・ウィンドウに直接値を入力できます.ただしタイプが定義された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番目の要素のコピーを追加する.