---------------------------------------------------------------建表
----------------判断表是否存在
declare num number;
begin
select count(1) into num from user_tables where table_name='TEST';
if num>0 then
execute immediate 'drop table TEST';
end if;
end;
----------------建表
CREATE TABLE TEST(
WL VARCHAR2(10),
XYSL INTEGER,
XYCK VARCHAR2(10),
XCLCK VARCHAR2(10),
XCLCKSL INTEGER,
PC INTEGER
);
----------------第一部分测试数据
INSERT INTO TEST VALUES('A1', 2, 'C1', 'C1' , 20, 123);
INSERT INTO TEST VALUES('A1', 2, 'C1', 'C2' , 30, 111);
INSERT INTO TEST VALUES('A1', 2, 'C1', 'C2' , 20, 222);
INSERT INTO TEST VALUES('A1', 2, 'C1', 'C3' , 10, 211);
INSERT INTO TEST VALUES('A2', 3, 'C4', 'C1' , 40, 321);
INSERT INTO TEST VALUES('A2', 3, 'C4', 'C4' , 50, 222);
INSERT INTO TEST VALUES('A2', 3, 'C4', 'C4' , 60, 333);
INSERT INTO TEST VALUES('A2', 3, 'C4', 'C5' , 70, 223);
COMMIT;
--select * from test;
---------------------------------------------------------------行转列的存储过程
CREATE OR REPLACE PROCEDURE P_TEST IS
V_SQL VARCHAR2(2000);
CURSOR CURSOR_1 IS SELECT DISTINCT T.XCLCK FROM TEST T ORDER BY XCLCK;
BEGIN
V_SQL := 'SELECT WL,XYSL,XYCK';
FOR V_XCLCK IN CURSOR_1
LOOP
V_SQL := V_SQL || ',' || 'SUM(DECODE(XCLCK,''' || V_XCLCK.XCLCK ||
''',XCLCKSL,0)) AS ' || V_XCLCK.XCLCK;
END LOOP;
V_SQL := V_SQL || ' FROM TEST GROUP BY WL,XYSL,XYCK ORDER BY WL,XYSL,XYCK';
--DBMS_OUTPUT.PUT_LINE(V_SQL);
V_SQL := 'CREATE OR REPLACE VIEW RESULT AS '|| V_SQL;
--DBMS_OUTPUT.PUT_LINE(V_SQL);
EXECUTE IMMEDIATE V_SQL;
END;
----------------------------------------------------------------结果
----------------执行存储过程,生成视图
BEGIN
P_TEST;
END;
----------------结果
SELECT * FROM RESULT T;
WL XYSL XYCK C1 C2 C3 C4 C5
---------- --------------------------------------- ---------- ---------- ---------- ---------- ---------- ----------
A1 2 C1 20 50 10 0 0
A2 3 C4 40 0 0 110 70
----------------第二部分测试数据
INSERT INTO TEST VALUES('A1', 2, 'C1', 'C6' , 20, 124);
INSERT INTO TEST VALUES('A2', 2, 'C1', 'C7' , 30, 121);
INSERT INTO TEST VALUES('A3', 2, 'C1', 'C8' , 20, 322);
COMMIT;
----------------报告存储过程,生成视图
BEGIN
P_TEST;
END;
----------------结果
SELECT * FROM RESULT T;
WL XYSL XYCK C1 C2 C3 C4 C5 C6 C7 C8
----- ----- -------- ------- -------- ---------- ---------- ---------- ---------- ---------- ----------
A1 2 C1 20 50 10 0 0 20 0 0
A2 2 C1 0 0 0 0 0 0 30 0
A2 3 C4 40 0 0 110 70 0 0 0
A3 2 C1 0 0 0 0 0 0 0 20
--------------- 删除实体
DROP VIEW RESULT;
DROP PROCEDURE P_TEST;
DROP TABLE TEST;
分享到:
相关推荐
其中,"行转列(不定列)"是数据库查询中的一种常见需求,尤其是在数据分析和报表生成时。本篇文章将详细探讨Oracle如何实现行转列为列的过程,以及在面对不确定列数时的解决方案。 在传统的SQL查询中,数据通常是...
在Oracle数据库中,行转列(也称为数据透视)和列转行(unpivot)是SQL查询中用于数据转换的高级功能。从Oracle 11g版本开始,引入了PIVOT和UNPIVOT关键字,以支持显式的查询转换,即从行数据转换为列数据,或从列...
oracle中实现列转行实例,有表的创建,数据的插入,查询的sql
描述中提到的“动态行转不定列”和“自动转换”暗示了这是一个处理不固定数量列的解决方案,而“列数限制为oracle限制”意味着这个方法考虑到了Oracle对最大列数的规定。 Oracle提供了几种方法来实现行转列,其中最...
行转列是指将数据库表中的多行转换为一列。这种操作可以使用 AGGREGATE FUNCTION 语句来实现。 示例代码: ```sql SELECT id, MAX(decode(cn, 'c1', cv, NULL)) AS c1, MAX(decode(cn, 'c2', cv, NULL)) AS c2, ...
其次,对于不定列的行列转换,当列的数量不是预先确定的,可能需要借助PL/SQL编写自定义函数。例如,如果我们有一个表,包含两个列c1和c2,我们要将c1相同的行合并为一列,可以用以下PL/SQL函数: ```sql CREATE OR...
- **预处理数据**:在升级时区前,先将所有TSTZ类型的列转换为不带时区的TIMESTAMP类型,然后在升级后再转换回来。 - **使用兼容模式**:在导入数据时,可以指定`TIMESTAMP WITH TIME ZONE`的处理方式,使其与源...
- 定长字符型列应使用CHAR类型,不定长字符型列则使用VARCHAR2类型。 - 对于固定长度的列,使用CHAR类型可以提高查询速度。 - 不定长度的列使用VARCHAR2类型,以避免处理空格所带来的效率问题。 - 日期字段应...
- **伪列**:ROWID和ROWNUM,用于标识行的位置和编号,但并不实际存储在表中。 ### 序列、视图与索引 - **序列(SEQUENCE)**:自动产生唯一的序列号,常用于自增主键。 - **视图(VIEW)**:虚拟表,基于一个或多...
数据库DATABASE、表TABLE、列COLUMN、行ROW、关键字PRIMARY KEY、索引INDEX 二、 数据类型: LONG RAM:超长大型数据(照片、图形、描述等不定长数据)。 DATE:包含日期和时间。 INTEGER:有符号全长二进制整数(31...
对于经常被UPDATE且更新列占用较大空间的表,应设置较高的PCTFREE值,以减少行迁移。 - 对于可能出现热点块的表,也需要较大的PCTFREE值,以降低热点现象。 2. **事务参数**: - `initrans`参数设定初始事务槽的...
check 检查约束,使列的值符合一定的标准范围 unqiue 唯一性约束 foreign key 外部键约束 29、查看创建视图的select语句 SQL>set view_name,text_length from user_views; SQL>set long 2000; 说明:可以根据...
* ROWID:是数据库中每行的唯一标识符,ROWID在磁盘上需要10个字节的存储空间,并使用18个字符来显示。 Composite Datatypes包括: * PL/SQL TABLES:用于存储表格数据。 PLSQL基础知识点包括变量声明、数据类型...
数据库基础知识试题.pdf 本资源是一个数据库基础知识试题集合,涵盖了数据库的基本概念、SQL语句、...19. ORACLE中char类型与varchar2类型的区别:char类型是定长字符数据类型,varchar2类型是不定长字符数据类型。
* 在 Oracle 中,char 类型与 varchar2 类型的区别是 char 为定长字符数据类型,而 varchar2 为不定长字符数据类型。 数据 normalization * 数据 normalization 是一种数据库设计技术,旨在减少数据冗余和依赖性。...
定长字符型列应使用`CHAR`类型,而不定长字符型列则应使用`VARCHAR2`类型。使用`CHAR`类型可以提高查询速度,但要注意处理不定长字符串时可能导致的效率问题和处理不便。此外,日期字段应当定义为`DATE`类型,若需要...
第二范式要求每一行数据只与一个列相关,即不存在部分依赖;第三范式则规定每个属性都直接依赖于主键,避免传递依赖。 2. **自增表与InnoDB和MyISAM表的区别**:InnoDB表在删除数据并重启后,自增ID会丢失,因为...
* 表(Table):存储数据的基本单元,由行和列组成。 * 视图(View):查询结果集的序列。 * 序列(Sequence):产生主键的索引。 * 索引(Index):提高查询效率的数据结构。 二、数据库对象的命名规则 数据库...