zoukankan      html  css  js  c++  java
  • 存储过程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个元素的拷贝。

  • 相关阅读:
    Oracle 安装报错 [INS-06101] IP address of localhost could not be determined 解决方法输入日志标题
    Linux下安装oracle数据库提示DISPLAY not set. Please set the DISPLAY and try again。
    redhat 关机注销命令详解
    VirtualBox的四种网络连接方式
    修改RedHat的系统显示时间
    insufficient memory to configure kdump(没有足够的内存)解决方法(待验证、待解决)
    xen坑随笔 heartbeat dpkg垃圾数据库清除
    tomcat 监控脚本
    负载均衡随笔
    GIT命令介绍
  • 原文地址:https://www.cnblogs.com/ghq120/p/10659015.html
Copyright © 2011-2022 走看看