Orcale 使用存储过程动态行转列

本文介绍了在Oracle11g中如何利用存储过程和游标实现动态行转列,详细展示了存储过程的语法、游标的使用,并给出了具体的SQL语句示例,以收款方式为例,实现了根据不同条件动态转换表格结构。
摘要由CSDN通过智能技术生成

Orcale11g 动态行转列

在一张表里有200多个收费项目需要行转列,本人太懒实在不想一个个敲,就想到了动态实现行转列。
1、使用了一丢丢的存储过程
2、开始行转列

一、介绍基本的存储过程使用方法

1、存储过程的语法

Create or replace procedure 存储过程名称(参数名称 {in|out|in out} datatype,参数名称 out sys_refcursor)
is|as
变量名称 datatype(lenth);
begin
body;
end;

其中各项参数介绍如下:
create or replace :创建或者更新,如果存在已有存储过程就更新。

{in|out|in out}:in 输入参数,out 输出参数,in out 可输入可输出。默认是in输入模式,在这里定义参数可以不用加数据长度。

sys_refcursor:Orcale 自带的输出游标,把结果集一把输出,不需遍历输出,个人感觉用来输出结果非常方便。

is|as:连接词。

datatype(lenth):数据类型(长度)eg: name varchar2(200)。

2、游标

接下来介绍3种游标
1、sys_refcursor:orcale自带的函数,可以一把输出结果集,不需遍历,不需要初始化赋值。

2、ref cursor:需要先说明 eg:type weak_ref_cursor is ref cursor;
CURSOR_1 weak_ref_cursor;不需要初始化赋值。

3、CURSOR:必须初始化赋值 eg:CURSOR CURSOR_1 IS SELECT NAME FROM SKFS WHERE CODE<10;
具体在行转列的实现展示。

二、开始实现行转列

1、通过收款方式进行动态行转列

这是原表:在这里插入图片描述
这是效果表:
在这里插入图片描述

2、具体实现

如果只需要知道怎么行转列,具体看这一块就可以了在这里插入图片描述
以下是全部SQL

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我明白。关于您的问题,以下是一个简单的示例存储过程,可以将一列中的值转换为行,并将结果存储在一个表中。 CREATE OR REPLACE PROCEDURE dynamic_pivot_procedure (IN_TABLE_NAME IN VARCHAR2, IN_ROW_COL_NAME IN VARCHAR2, IN_COL_COL_NAME IN VARCHAR2, OUT_TABLE_NAME IN VARCHAR2, OUT_COL_NAMES IN VARCHAR2) IS COL_NAMES_ARRAY DBMS_SQL.VARCHAR2_TABLE; DYNAMIC_SQL VARCHAR2(4000); BEGIN -- Extract column names from input parameter string SELECT REGEXP_SUBSTR(OUT_COL_NAMES, '[^,]+', 1, LEVEL) BULK COLLECT INTO COL_NAMES_ARRAY FROM DUAL CONNECT BY LEVEL <= LENGTH(REGEXP_REPLACE(OUT_COL_NAMES, '[^,]+')) + 1; -- Build dynamic SQL statement DYNAMIC_SQL := 'SELECT DISTINCT ' || IN_ROW_COL_NAME || ','; FOR I IN 1..COL_NAMES_ARRAY.COUNT LOOP DYNAMIC_SQL := DYNAMIC_SQL || ' MAX(CASE WHEN ' || IN_COL_COL_NAME || ' = ''' || COL_NAMES_ARRAY(I) || ''' THEN ' || IN_COL_COL_NAME || ' ELSE NULL END) AS ' || COL_NAMES_ARRAY(I) || ','; END LOOP; DYNAMIC_SQL := RTRIM(DYNAMIC_SQL, ',') || ' FROM ' || IN_TABLE_NAME || ' GROUP BY ' || IN_ROW_COL_NAME; -- Execute dynamic SQL statement EXECUTE IMMEDIATE 'CREATE TABLE ' || OUT_TABLE_NAME || ' AS (' || DYNAMIC_SQL || ')'; END dynamic_pivot_procedure; / 说明:该存储过程使用动态 SQL 生成一个包含转换后数据的表。您需要提供以下参数: 1. IN_TABLE_NAME:要转换为行的表名。 2. IN_ROW_COL_NAME:要用作每行标识符的列名。 3. IN_COL_COL_NAME:要转换为列的值所在的列名。 4. OUT_TABLE_NAME:用于存储转换后数据的表名。 5. OUT_COL_NAMES:用逗号分隔的转换后表的列名称。 该存储过程基于 Oracle使用 DBMS_SQL.VARCHAR2_TABLE动态 SQL 生成转换后的表。请根据您的实际要求进行修改,以便满足您的具体需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蜉蝣杂技

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值