`
oboaix
  • 浏览: 274317 次
社区版块
存档分类
最新评论

Oracle 行自动转动态列一种实现

 
阅读更多



      环境(Oracle Database 10g Enterprise Edition Release 10.2.0.1.0)

     工作中碰到如此问题,业务特殊需求,如何实现动态的行转换成动态的列,源数据如,

11行数据:

col 

a

b

c

d

e

f

g

h

i

j

k

转成自定义的列表数据,如转成四列(变成了三行四列,四列可以做到动态设置):

col1   col2  col3  col4

a        b      c       d

e        f       g       h

i         j        k

针对Oracle 10g特殊管道函数pipe row(),这里提供一种实现方式,以资学习记录。

按照顺序创建SQL脚本、模拟数据。

---create custom object
CREATE or replace TYPE unit_type AS OBJECT
       ( unit1     VARCHAR2(50)
        ,unit2     VARCHAR2(50)
        ,unit3     VARCHAR2(50)
        ,unit4     VARCHAR2(50)
       );

---create table object by type Object
CREATE TYPE unit AS TABLE OF unit_type;

---create table
create table t_unit (unitname varchar2(50));

---insert into data
begin
insert into t_unit (UNITNAME) values ('a');
insert into t_unit (UNITNAME) values ('b');
insert into t_unit (UNITNAME) values ('c');
insert into t_unit (UNITNAME) values ('d');
insert into t_unit (UNITNAME) values ('e');
insert into t_unit (UNITNAME) values ('f');
insert into t_unit (UNITNAME) values ('g');
insert into t_unit (UNITNAME) values ('h');
insert into t_unit (UNITNAME) values ('i');
insert into t_unit (UNITNAME) values ('j');
insert into t_unit (UNITNAME) values ('k');
insert into t_unit (UNITNAME) values ('l');
insert into t_unit (UNITNAME) values ('m');
insert into t_unit (UNITNAME) values ('n');
insert into t_unit (UNITNAME) values ('o');
insert into t_unit (UNITNAME) values ('p');
insert into t_unit (UNITNAME) values ('r');
insert into t_unit (UNITNAME) values ('s');
insert into t_unit (UNITNAME) values ('t');
insert into t_unit (UNITNAME) values ('u');
insert into t_unit (UNITNAME) values ('v');
insert into t_unit (UNITNAME) values ('w');
insert into t_unit (UNITNAME) values ('x');
insert into t_unit (UNITNAME) values ('y');
insert into t_unit (UNITNAME) values ('z');
insert into t_unit (UNITNAME) values ('q');
insert into t_unit (UNITNAME) values ('1');
insert into t_unit (UNITNAME) values ('2');
insert into t_unit (UNITNAME) values ('3');
insert into t_unit (UNITNAME) values ('4');
commit;
end;

---check data
select * from t_unit;

---create pipe function ,  important step
create or replace function autolinefeed     
 return unit PIPELINED    
 as  
  temp_str varchar2(32767):='';   
  temp_index number:=0;     
  temp_count number:=0;
  temp_sum number:=0;
  temp_unit1 varchar2(50);
  temp_unit2 varchar2(50);
  temp_unit3 varchar2(50);
  temp_unit4 varchar2(50);
 begin     
      select count(*) into temp_sum from t_unit;
      if temp_sum<=0 then
        pipe row(null);
        return;
      end if;
      for v_unit in (select * from t_unit) loop
        temp_count:=(temp_count+1);
        if (mod(temp_count,4)=1) then
          temp_unit1 :=v_unit.unitname;
        elsif (mod(temp_count,4)=2) then
          temp_unit2 :=v_unit.unitname;
        elsif (mod(temp_count,4)=3) then
          temp_unit3 :=v_unit.unitname;
        else
          temp_unit4 :=v_unit.unitname;
        end if;
        if (mod(temp_count,4)=0) then
          pipe row(unit_type(temp_unit1,temp_unit2,temp_unit3,temp_unit4));   
        else
          if (temp_sum=temp_count) then 
             if (mod(temp_count,4)=1) then
               pipe row(unit_type(temp_unit1,'','',''));
             elsif (mod(temp_count,4)=2) then
               pipe row(unit_type(temp_unit1,temp_unit2,'',''));
             elsif (mod(temp_count,4)=3) then
               pipe row(unit_type(temp_unit1,temp_unit2,temp_unit3,''));
             else
               pipe row(unit_type(temp_unit1,temp_unit2,temp_unit3,temp_unit4));  
             end if;
          end if;
        end if;
      end loop;
      exception   
       when others then  
       pipe row(null);    
 end;   
 
--data effect
SQL> select * from table(autolinefeed);

UNIT1      UNIT2      UNIT3      UNIT4
---------- ---------- ---------- ----------
a          b          c          d
e          f           g          h
i           j           k          l
m         n          o          p
r           s          t          u
v          w         x          y
z          q          1          2
3          4

已选择8行。

 

图片效果:

 

  • 大小: 30.5 KB
分享到:
评论

相关推荐

    Oracle的列转行问题

    列转行(Pivot)和行转列(Unpivot)是两种基本操作,可以将数据按照不同的维度进行组织。传统的列转行方法通常涉及`DECODE`或`CASE`函数与聚合函数如`MAX`或`MIN`的结合,但这些方法可能在处理大量数据时对性能造成...

    如何为oracle中的表增加自动增长列.pdf

    此外,Oracle数据库从12c版本开始支持IDENTITY属性,这是一种更为简便的方法来实现自动增长列,可以直接在列定义时指定。IDENTITY属性可以确保列的值是唯一的,并且在插入新记录时会自动递增。使用IDENTITY属性的...

    oracle数据库字段值自动加1

    在 Oracle 数据库中,触发器是一种特殊的数据库对象,用于在特定事件发生时执行特定操作。在本示例中,我们创建一个名为 TR_EXCELFILE_LINE 的触发器,用于在插入数据时自动将 F_ID 字段值加 1。 创建触发器的 SQL ...

    rowtocol.rar_RowToCol_oracle 动态列

    描述中提到的“动态行转不定列”和“自动转换”暗示了这是一个处理不固定数量列的解决方案,而“列数限制为oracle限制”意味着这个方法考虑到了Oracle对最大列数的规定。 Oracle提供了几种方法来实现行转列,其中最...

    oracle自动增长列

    ### Oracle自动增长列知识点 在Oracle数据库中,实现自动增长列的功能主要依赖于`SEQUENCE`对象。通过创建一个序列(SEQUENCE),可以方便地为表中的某列自动生成唯一的值,这对于主键或者需要唯一标识符的场景非常...

    oracle 触发器方式实现行ID自增加

    当需要自动为新插入的行生成唯一的ID时,触发器是一种常用的技术手段。本文将深入探讨如何使用Oracle触发器来实现行ID的自增加。 首先,我们得了解什么是触发器。在Oracle中,触发器是一种数据库对象,它可以在特定...

    oracle(blob转换为clob)

    这一步骤对于将BLOB转换为CLOB至关重要,因为CLOB本质上是一种字符数据类型,而不能直接与二进制数据交互。通过使用`UTL_RAW.CAST_TO_VARCHAR2`,我们可以将BLOB数据转换为中间的VARCHAR2格式,然后进一步转换为CLOB...

    oracle数据库主键自动生成

    下面将详细介绍 Oracle 数据库主键自动生成的实现方法和相关知识点。 序列(Sequence) 序列是一种数据库对象,它可以生成一系列唯一的数字值,常用来生成主键值。在 Oracle 数据库中,可以使用以下语句创建一个...

    oracle数据库伪列简单介绍

    在Oracle数据库中,存在一种特殊的数据类型被称为“伪列”,这些伪列虽然看起来像是表中的列,但实际上它们并不存储任何数据,而是由数据库动态生成的。本文将重点介绍两种常用的伪列——rownum和rowid,并探讨它们...

    oracle触发器实现二维码

    触发器是一种数据库对象,它可以在特定的数据库操作(如INSERT、UPDATE或DELETE)发生时自动执行预定义的SQL语句或PL/SQL代码块。在这个场景中,我们讨论的是如何利用Oracle触发器来实现二维码的生成与存储。 首先...

    oracle的伪列与分页

    在Oracle数据库中,伪列(Pseudocolumn)并非真正意义上的列,而是一种特殊的数据库对象,它看起来像表中的一个列,但实际上并不存储数据。Oracle提供了一些内置的伪列供用户使用,如`ROWID`和`ROWNUM`等,这些伪列...

    oracle设定自增长列

    在Oracle数据库中,实现自增长列的功能是一种常见的需求,尤其在设计主键或者唯一标识符时。这通常用于确保每条记录都有一个唯一的、连续的编号。在给定的文件中,通过创建表、序列和触发器的方式实现了这一功能。...

    oracle自动建立表分区脚本

    "Oracle自动建立表分区脚本"提供了一种高效的方法来实现这一目标,尤其适用于处理大量数据的企业级应用。 1. **表分区的基本概念**:表分区是将一个大表逻辑上划分为多个较小的部分,每个部分称为一个分区。每个...

    在hibernate中实现oracle的自动增长

    序列(sequence)是一种独立的对象,可以用于生成连续的整数值,常用于为主键提供唯一的值。 #### 创建序列(sequence) 在Oracle中创建一个序列(sequence)非常简单,只需要执行一条SQL语句即可。例如,为`DEPARTMENT`...

    oracle行操作

    触发器是一种在特定事件(如INSERT、UPDATE、DELETE)发生时自动执行的数据库对象,常用于实现业务规则或审计功能。 10. **游标**: 游标允许程序逐行处理查询结果,常在PL/SQL中使用,对于处理大量数据或需要...

    oracle设置主键自动增长

    序列是一种用于生成一系列数值的对象,可以用于自动为主键生成唯一的值。 ```sql CREATE SEQUENCE emp_sequence INCREMENT BY 1 -- 每次增加的值 START WITH 1 -- 起始值 NOMAXVALUE -- 最大值,这里表示没有上限 ...

    通过 Oracle Advanced Security 实现 Oracle Database 12c 中的加密和编辑

    Oracle Advanced Security 是 Oracle Database 12c 中的一种安全解决方案,旨在保护数据库免受非法访问和数据泄露的威胁。通过 Oracle Advanced Security,可以实现加密和编辑,以保护敏感数据免受恶意攻击。 ...

    oracle实现属性的自增

    序列是 Oracle 中的一种机制,可以生成连续的数字序列。序列可以用来生成唯一的标识符、自动增长的数字等。 知识点三: 创建序列 创建序列的语法是:CREATE SEQUENCE 序列名称 [MINVALUE 最小值] [MAXVALUE 最大值...

    C++实现oracle操作

    在IT行业中,C++是一种强大的编程语言,常用于构建高性能的应用程序,而Oracle则是一款广泛使用的商业级关系型数据库管理系统。将C++与Oracle结合,可以实现高效且灵活的数据库操作。本文将深入探讨如何使用C++进行...

Global site tag (gtag.js) - Google Analytics