Oracle横竖转换通用函数

Sql函数

CREATE OR REPLACE FUNCTION test_conv(p_table_name   IN VARCHAR2,
								    p_columns      IN VARCHAR2,
								    p_where_clause IN VARCHAR2)
  RETURN fnd_horizontal_to_vertical_tbl IS
  l_return_tbl   fnd_horizontal_to_vertical_tbl := fnd_horizontal_to_vertical_tbl();
  l_where_clause VARCHAR2(2000) := ltrim(p_where_clause);
  l_char_value   VARCHAR2(400);

BEGIN
  IF upper(l_where_clause) LIKE 'WHERE'
  THEN
    l_where_clause := SUBSTR(l_where_clause, 6);
  END IF;

  FOR c IN (SELECT c.column_value FROM TABLE(str2varlist(p_columns)) c)
  LOOP
    EXECUTE IMMEDIATE 'select ' || c.column_value || ' from ' || p_table_name ||
			    '  where 1=1 and ' || l_where_clause
	INTO l_char_value;

    l_return_tbl.EXTEND();
    l_return_tbl(l_return_tbl.COUNT) := fnd_horizontal_to_vertical_rec(c.column_value,
											     l_char_value);
  END LOOP;
  RETURN l_return_tbl;
END test_conv;


  
  create or replace type fnd_horizontal_to_vertical_rec as object(
  col_name varchar2(100),
  COL_VALUE varchar2(100)
  );
  create or replace type fnd_horizontal_to_vertical_tbl as table of fnd_horizontal_to_vertical_rec;
  

测试表格

  create table test
(
       id    varchar2(10),
			 name  varchar2(10),
			 mfg_001  number,
			 mfg_002  number,
			 mfg_003  number,
			 mfg_004 number
)

insert into test (ID, NAME, MFG_001, MFG_002, MFG_003, MFG_004)
values ('1', '²âÊÔ', 12, 324, 324, 24);
commit;

调用

select  * from table(test_conv('test a', 'NAME,MFG_001,MFG_002,MFG_003,MFG_004','a.id=1'));

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值