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个元素的拷贝。

  • 相关阅读:
    【转】C#使用PrintDocument打印 多页 打印预览
    【转】线程间操作无效: 从不是创建控件“textBox2” 的线程访问它。
    C# 定时执行方法: System.Timers.Timer用法示例
    SQL查找数据库中所有没有主键的数据表脚本
    linux之shell编程基本语法
    Linux之shell编程条件判断-if,while,for,case
    Linux之shell编程函数使用
    2.sparkSQL--DataFrames与RDDs的相互转换
    Spark2.1集群安装(standalone模式)
    storm1.0节点间消息传递过久分析及调优
  • 原文地址:https://www.cnblogs.com/ghq120/p/10659015.html
Copyright © 2011-2022 走看看