当前位置:  数据库>oracle

Oracle - 为子查询提供动态结果集

    来源: 互联网  发布时间:2017-06-17

    本文导语: 曾经遇到过这样一个需求:要求为method传入String,内容如"用户ID0,用户ID1,用户ID2...",然后根据这些ID返回一个结果集作为数据表供别人查询。SELECT * FROM TBL WHERE ID IN ('用户ID0,用户ID1,用户ID2') 不就可以解决问题吗? 但实际情况是...

曾经遇到过这样一个需求:要求为method传入String,内容如"用户ID0,用户ID1,用户ID2...",然后根据这些ID返回一个结果集作为数据表供别人查询。
SELECT * FROM TBL WHERE ID IN ('用户ID0,用户ID1,用户ID2') 不就可以解决问题吗?
 但实际情况是,结果集无法通过一个简单的SELECT就可以得到。

 让我明确一下需要解决的问题:

我们给FUNCTION传递这样的一个String参数后如何让它动态RETURN一个结果集供其他SELECT语句使用。

 既然我们要返回一个结果集,那便是要得到一个TABLE OF XXX类型,XXX可以是VARCHAR2或者INTEGER或者某个表的%ROWTYPE,但我的情况稍微复杂一点,我要自己创建一个OBJECT TYPE。

 于是我们要写的FUNCTION的RETURN类型是这样创建的:
CREATE OR REPLACE TYPE TYP_USER_RECORD AS OBJECT (USER_ID CHAR(40),USER_NUM VARCHAR2(200),CREATE_DATE DATE);
CREATE OR REPLACE TYPE TYP_USER_TBL AS TABLE OF TYP_USER_RECORD;

下面是FUNCTION的创建:
CREATE OR REPLACE FUNCTION REGROUP_USER_BY_USERIDSTR(USERIDSTR IN VARCHAR2)
  RETURN TYP_USER_TBL
  PIPELINED IS

  --参数声明开始
  TYPE USER_CURSOR IS REF CURSOR;
  USER_INFO_LIST USER_CURSOR;      --用来获得检索结果的CURSOR

  TYPE USER_ROW IS RECORD(
    USER_ID CHAR(40),USER_NUM VARCHAR2(200),CREATE_DATE DATE);
  USER_INFO USER_ROW;              --用于提取CURSOR中的记录的RECORD

  USER_ROW4RESULT TYP_USER_RECORD;  --我们要返回的数据集的数据行对象
  QUERYSTR          VARCHAR2(2000); --拼接后的SELECT语句
  --参数声明结束

BEGIN
  --此处根据传入的ID进行了各种判断拼接SELECT语句 并给QUERYSTR赋值
  OPEN USER_INFO_LIST FOR QUERYSTR; --打开CURSOR
  --循环从CURSOR获得结果 并将结果变成TYP_USER_RECORD对象 再将对象放到PIPE里
  LOOP
    FETCH USER_INFO_LIST INTO USER_INFO;
    EXIT WHEN USER_INFO_LIST%NOTFOUND;
    USER_ROW4RESULT := TYP_USER_RECORD(USER_INFO.USER_ID,
                              USER_INFO.USER_NUM,
                              USER_INFO.CREATE_DATE);
    PIPE ROW(USER_ROW4RESULT);
  END LOOP;

  CLOSE USER_INFO_LIST;
  RETURN;
END;

既然RETURN TYPE是TABLE类型的,调用时便可以使用TABLE()函数进行查询。
SELECT * FROM TABLE(REGROUP_USER_BY_USERIDSTR)

另外,本人目前工程中使用的持久化框架是MyBatis,此语句执行无误。
 参数虽然可以直接传入SELECT * FROM XX IN ()进行查询,但也可能需要进行截取变成COLLECION,下面是该功能的FUNCTION:
CREATE OR REPLACE TYPE TBL_VARCHAR2 AS TABLE OF VARCHAR2(400);

CREATE OR REPLACE FUNCTION STR2TBL( PARAM_STR IN VARCHAR2 ) RETURN TBL_VARCHAR2
  AS
      TMP_RECORD  LONG DEFAULT PARAM_STR || ',';
      ROW_INDEX        NUMBER;
      TMP_TBL    TBL_VARCHAR2 := TBL_VARCHAR2();
  BEGIN
      LOOP
          ROW_INDEX := INSTR( TMP_RECORD, ',' );
          EXIT WHEN (NVL(ROW_INDEX,0) = 0);
          TMP_TBL.EXTEND;
          TMP_TBL( TMP_TBL.COUNT ) := LTRIM(RTRIM(SUBSTR(TMP_RECORD,1,ROW_INDEX-1)));
          TMP_RECORD := SUBSTR( TMP_RECORD, ROW_INDEX+1 );
      END LOOP;
      RETURN TMP_TBL;
  END;

这种方式的意义可能只有让开发方便了一些,试图用一句SQL拯救世界必将导致各种问题。
 为什么会有这种需求,可能是因为数据关系梳理地有些仓促,数据散落在不同的数据表。
 无论如何这是一个糟糕的场景。


    
 
 

您可能感兴趣的文章:

  • Oracle存储过程如何返回一个结果集&如何获取
  • shell调用oracle储存过程,怎么判断储存过程执行结果是否正确
  • Oracle的大数据量查询结果显示问题。(高手帮忙)
  • oracle导出sql语句的结果集和保存执行的sql语句(深入分析)
  • Oracle将查询的结果放入一张自定义表中并再查询数据
  • 有关结果数据集的修改-java和ORACLE数据库
  • 数据库查询排序使用随机排序结果示例(Oracle/MySQL/MS SQL Server)
  • Linux下用SHELL脚本执行带输入输出参数的ORACLE存储过程并得到结果
  • Oracle中返回结果集的存储过程分享
  • oracle sys_connect_by_path 函数 结果集连接
  • 详解如何在Oracle中连接输出结果
  • 用Oracle动态性能视图采集查询调优数
  • Oracle动态生成查询交叉表
  • 关键字: oracle,存储过程,数据库,查询,动态sql包,数组,参传,jdbc 1
  • Oracle 9i数据库中动态重配置深入分析
  • 在Oracle PL/SQL中游标声明中表名动态变化的方法
  • Oracle组件实现动态Web数据库
  • oracle生成动态前缀且自增号码的函数分享
  • Oracle过程中执行动态SQL或DDL语句
  • 如何用不算很熟练的jsp,oracle,javascript,html,css等建设动态网站,要网页打开速度快、易于日常维护更新?
  • 基于Oracle的高性能动态SQL程序开发
  • Oracle静态注册与动态注册详解
  • Oracle动态交叉表生成
  • Oracle实现动态SQL的拼装要领
  • oracle中动态SQL使用详细介绍
  • oracle 动态AdvStringGrid完美示例 (AdvStringGrid使用技巧/Cells)
  • Oracle9i 动态SGA,PGA特性探索
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 红帽Linux表示Oracle提供Linux支持是不完美的
  • 有人在fedora 10下安装 oracle database 11g,没有呀?提供个安装步骤
  • Oracle 11gR1 for Linux现在已经开始提供下载
  • oracle怎么删除用户提供解决方案
  • 如何能在网上找到一个可以提供ORACLE进行JSP设计的主机展示我的作品啊,付费也行
  • Oracle为IBM大型机服务器提供Linux方案
  • 谁能帮忙提供与ORACLE连接的JAVA BEAN!谢谢!分必给!!
  • oracle查询锁表与解锁情况提供解决方案
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle 数据库开发工具 Oracle SQL Developer
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle EBS R12 支持 Oracle Database 11g
  • Oracle 10g和Oracle 11g网格技术介绍
  • SCO unix下安装oracle,但没有光盘,请大家推荐一个oracle下载站点(unix版本的)。谢谢!!!!
  • oracle中如何把表中具有相同值列的多行数据合并成一行
  • 网络技术 iis7站长之家
  • Oracle 数据库(oracle Database)性能调优技术详解
  • Linux /$ORACLE_HOME $ORACLE_HOME
  • ORACLE日期相关操作
  • Linux系统下Oracle的启动与Oracle监听的启动
  • ORACLE数据库常用字段数据类型介绍
  • 请问在solaris下安装ORACLE,用root用户和用oracle用户安装有什么区别么?
  • Oracle 12c的九大最新技术特性介绍
  • 网间Oracle的连接,远程连接Oracle服务器??


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3