• 网络学院
  • 新手学堂
  • 操作系统
  • 网络技术
  • 软件应用
  • 办公软件
  • 编程技术
  • 网站架设
  • 数据库类
  • 平面设计
  • 多媒体类
  • 游戏资讯
  • 教学论文
  • 认证考试
将查询结果连接成列表的几个方法
广告位
  站点:
  • 首 页
  • 最新软件
  • 最新文章
  • 国内软件
  • 国外软件
  • 汉化软件
  • 源码下载
  • 字体下载
将查询结果连接成列表的几个方法
软件发布 将查询结果连接成列表的几个方法
网络软件 系统工具 应用软件 联络聊天 图形图像 多媒体类 行业软件 游戏娱乐 编程开发 安全相关 教育教学 数码软件
热门软件: QQ 瑞星 pplive e话通 木马克星 千千静听 office2000 五笔字根 Photoshop 视频分割
返回首页 | 文章首页 | 认证考试 | Oracle认证 | Oracle指导 | 将查询结果连接成列表的几个方法

将查询结果连接成列表的几个方法

 

添加时间: 2008-4-19 22:30:43  作者:   阅读次数:11   来源:

 

 

       

  我们在实际开发过程中, 经常需要将一个查询的结果连接成一个单行的字符串列表, 比如说将一个部门及其所有员工列在一行显示.
  
  本文介绍了从最简单到最通用的几种方法来达到这一目的.
  
  1.  已知列的取值范围
  
  比如说, 有以下产品表, 每种产品只有3种颜色(R-RED, B-BLACK, W-WHITE):
  
  scott@ORCL> DESC PROD
  
  名称                   空?   类型
  
  ----------------------------------------- -------- --------------
  
  PRODNAME                      VARCHAR2(20)
  
  COLOR                       VARCHAR2(1)
  
  scott@ORCL> SELECT * FROM PROD;
  
  PRODNAME       C
  
  -------------------- -
  
  CAR         R
  
  CAR         B
  
  CAR         W
  
  MOTOR        W
  
  MOTOR        B
  
  我们希望列出每种产品都有哪些颜色.
  
  这种情况下, 只要简单的使用decode()函数即可.
  
  下面是script代码及相应的运行结果.
  scott@ORCL> COLUMN COLORS FORMAT A10
  
  scott@ORCL >select PRODNAME,
  
  2     max(decode( COLOR, ’B’, COLOR, null )) ||
  
  3     max(decode( COLOR, ’W’, COLOR, null )) ||
  
  4     max(decode( COLOR, ’R’, COLOR, null )) COLORS
  
  5 from PROD
  
  6 group by PRODNAME
  
  7 /
  
  PRODNAME       COL
  
  -------------------- ---
  
  CAR         BWR
  
  MOTOR        BW
  
  2. 静态SQL
  
  这种方法适合于列的取值不能预知, 由于使用静态sql, 相对方法3来说比较简单. 不过该函数只能用于特定的表.
  
  示例所用的表及数据使用oracle随机demo表emp.
  
  注意: 受varchar2的长度限制, 列的取值的总长度是有限制的, 在方法3中也有同样的问题.
  
  下面是函数及其运行结果
  
  create or replace
  
  function list_func1( p_dept in varchar2 )
  
  return varchar2
  
  is
  
  l_str varchar2(4000) default null;
  
  l_sep varchar2(2) default null;
  
  begin
  
  for x in ( select empno from emp where deptno = p_dept ) loop
  
  l_str := l_str || l_sep || to_char(x.empno);
  
  l_sep := ’, ’;
  
  end loop;
  
  return l_str;
  
  end;
  
  /


scott@ORCL> column emplist format a60
  
  scott@ORCL> select deptno, emplist1(deptno) emplist
  
  2 from emp
  
  3 group by deptno
  
  4 /
  
  DEPTNO EMPLIST
  
  ---------- ------------------------------------------------------------
  
  10 7782, 7839, 7934
  
  20 7369, 7566, 7788, 7876, 7902
  
  30 7499, 7521, 7654, 7698, 7844, 7900
  
  scott@ORCL>
  
  3.    动态SQL
  
  这种方法由于使用动态sql, 相对来说比较复杂, 但与此同时, 它比其方法2来说功能大大增强: 它可以用于任意表, 并可以连接表中的任意列.
  
  函数代码:
  
  create or replace
  
  function list_func2( p_key_name in varchar2,
  
  p_key_val in varchar2,
  
  p_other_col_name in varchar2,
  
  p_tname   in varchar2 )
  
  return varchar2
  
  as
  
  type rc is ref cursor;
  
  l_str  varchar2(4000);
  
  l_sep  varchar2(2);
  
  l_val  varchar2(4000);
  
  l_cur  rc;
  
  begin
  
  open l_cur for ’select ’||p_other_col_name||’
  
  from ’|| p_tname || ’
  
  where ’ || p_key_name || ’ = :x ’
  
  using p_key_val;
  
  loop
  
  fetch l_cur into l_val;
  
  exit when l_cur%notfound;
  
  l_str := l_str || l_sep || l_val;
  
  l_sep := ’, ’;
  
  end loop;
  
  close l_cur;
  
  return l_str;
  
  end;
  
  /
  
  参数说明:
  
  p_key_name -       查询依据的列名
  
  p_key_val -        查询依据的列名所对应的列值
  
  p_other_col_name -   要连接成列表的列名
  
  p_tname -         表名
  
  下面是运行结果:
  
  scott@ORCL> column emplist format a60
  
  scott@ORCL> select DEPTNO,
  
  2   list_func2(’DEPTNO’, DEPTNO, ’EMPNO’, ’EMP’) emplist
  
  3 from emp
  
  4 group by deptno
  
  5 /
  
  DEPTNO EMPLIST
  
  ---------- --------------------------------------------------
  
  10 7782, 7839, 7934
  
  20 7369, 7566, 7788, 7876, 7902
  
  30 7499, 7521, 7654, 7698, 7844, 7900

 

 

 

上下文章:

 

上一篇文章: Function怎么返回一个数据集? 下一篇文章: 本地分区索引如何确定表空间(2)

相关文章:

  • 键盘的F1到F12键 你究竟会用几个
  • 在ORACLE的存储过程中如何做简单的动态查询
  • 常见问题诊断方法---(常见错误篇)
  • 常见问题诊断方法---(SQL*NET篇)
  • PL/SQL用光标查询多条记录

相关软件:

  • 海啸QQ地址IP查询库 V1.7.080520国际IP版
  • 域名批量查询保姆 V2008.05
  • SQL智能查询分析器 V1.2
  • 四角号码查询器 V4.0
  • 104种木马清理方法 CHM格式电子书
  • 手机归属地、邮编、区号查询 V3.0

 

 

快速导航

  • 网络学院
  • 精品汇聚
  • 字体下载
  • 教程下载
  • ASP源码
  • PHP源码
  • Net源码
  • JSP 源码

Oracle认证分类导航

  • Oracle动态
  • Oracle指导
  • Oracle题库

本类经典文章推荐

  • Oracle中关于逻辑备份与恢复
  • Oracle开发人员JAVA存储过程
  • 为数据库的表自动生成行号
  • Oracle中的OOP概念
  • 用java从oracle取数
  • 冷备份移植到另一台Solaris机器上
  • 如何将excel数据导入oracle中
  • Oracle10.2g安装记录
  • 数据库监控工具ForOraclev1.2
  • oracle双机群集系统

Oracle指导阅读排行

  • Oracle系统表查询
  • 实例:Oracle导出EXCEL文件
  • Oracle企业管理器(OEM 2.1)使用...
  • 实例:Oracle导出EXCEL文件
  • Tomcat+SQLServer连接池配置
  • 服务器和客户机是怎样连接的
  • 入门基础:连接常见错误及解决方法
  • ORACLE数据库简介
  • 如何将excel数据导入oracle中
  • 如何取出某一用户的密码 再原样改...

Oracle认证阅读总排行

  • Oracle系统表查询
  • 实例:Oracle导出EXCEL文件
  • Oracle企业管理器(OEM 2.1)使用...
  • 在ORACLE的存储过程中如何做简单的...
  • 实例:Oracle导出EXCEL文件
  • AIX下自动启动Oracle数据库与监听...
  • Tomcat+SQLServer连接池配置
  • 服务器和客户机是怎样连接的
  • 入门基础:连接常见错误及解决方法
  • ORACLE数据库简介

广告位置

字母检索 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 回到顶部

关于我们 | 版权声明 | 免责条款 | 广告联系 | 软件发布 | 下载帮助 | 下载排行 | 网站地图 | 特别鸣谢 | 友情连接

copyright; 2005-2008 D9soft.com 第九软件网 版权所有