Oracle存过里面使用自定义type实现类似于事物执行中产生一张临时表过渡数据

本文介绍如何在Oracle存储过程中使用自定义Type来实现类似临时表的功能,以存储和处理中间数据。通过定义自定义Type,可以在不创建物理临时表的情况下,解决在PL/SQL中缓存和操作数据的问题。文中提到了Type的使用场景、类型以及注意事项,如不能直接返回给游标,需用SELECT查询结果,以及在JOIN时需要使用TABLE()等。
摘要由CSDN通过智能技术生成

记录这篇文章前,是今天写了一个存过的需求,嗯,咋说,不想新建临时表,所以想了下用自定义type的形式想办法在纯过里面搞一个table级别的数据集合,先上代码:

CREATE OR REPLACE PROCEDURE GET_TAG_COM(
INDATA IN VARCHAR2,
OUTDATA OUT SYS_REFCURSOR
)
IS


-----------------重点:自定义类型-------------------------------------------------------------
V_MYTAB1                    MYTABLE_COL1_TAB;
V_MYTAB4                    MYTABLE_COL4_TAB;
V_INDATA                    MYARRAY;
V_ONEDATA                   MYARRAY;
---------------------------------------------------------------------------------------------

V_CONDITION                 VARCHAR2(30000);
I                           NUMBER;
V_QUERYID                   NUMBER;
V_TIME                      NUMBER;
V_SQL1                      VARCHAR2(30000);
V_SQL2                      VARCHAR2(30000);



  BEGIN
       
       --自定义方法用于数据库切分字符串------------------------------------------
       --前端入参格式:["UPDATETIME=5,isCalCount=Y,CHANNELID=21,QUERYID=1,PageIndex=1,startLine=1,recCount=20,PageSize=20"]
       --自定义函数切分后得到的格式:["UPDATETIME=5","isCalCount=Y","CHANNELID=21","QUERYID=1","PageIndex=1","startLine=1","recCount=20","PageSize=20"]
       V_INDATA             := COMMON_FUNC.SplitString(INDATA,',');

       --用于where后面的sql拼接,一个很好的解决是否要and的方法
       V_CONDITION          := ' AND 1=1';

       --循环遍历的初始赋值
       I                    := 0
          
       FOR I IN 1 .. V_INDATA.COUNT LOOP
            --再次调用自定义切分函数,由于第一次已经把字符串切分成一个数组,这里循环数组取出单个进行而且切分
            --切分前格式:["UPDATETIME=5"]
            --切分后格式:["UPDATETIME","5"]
           V_ONEDATA   := COMMON_FUNC.SplitString(V_INDATA(I),'=');
           
           IF     UPPER(V_ONEDATA(1))      = 'QUERYID'
           THEN

           --由于二次切分,就可以更具数组判定入参值了,甚至还能调整想要的参数
                 V_QUERYID                := TO_NUMBER(V_ONEDATA(2));
              
           ELSIF UPPER(V_ONEDATA(1))      = 'UPDATETIME'
           THEN
                 V_TIME                   := TO_NUMBER(V_ONEDATA(2)/(24*60));
           END IF;
       END LOOP;
        
        
       ---------------------------------全量--------------------------------------------------
       --根据入参可以分逻辑处理事件 
       IF V_QUERYID = 1
          THEN
            
              
          
       --------------------------------获取参数数据--------------------------------------------
              FOR I IN 1 .. V_INDATA.COUNT LOOP
                  V_ONEDATA  := COMMON_FUNC.SplitString(V_INDATA(1),'=');
                  --这里再次调用自定义二次切分函数,通过凭借到where 1=1 可以得到where条件的拼接
                  SELECT V_CONDITION || DECODE(V_ONEDATA(1),
                                             'CHANNELID',
                                             ' AND TZC.Channelid IN( ''' || REPLACE(V_ONEDATA(2),'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值