日期:2014-05-16  浏览次数:20815 次

存储过程动态列
比如有两张表结构如下:
KHH         ZXYZ         YZPF(得分)
001          123            2
002          111            3
003          112            1
004          113            2
...         ...    ...        ...    ....

另一张表:
ID      ZBMC 
123      年龄
111      文化程度
112      投资偏好
113      平仓情况

现在想实现一个存储过程的报表统计,没有选择某个字段则效果如下:
得分   年龄  文化程度   投资偏好  ...
0      2     0         0   ...
1      3     0         0   ...
2      0     1         0   ...
3      0     0         2   ...
如果只选择年龄其它的字段不会出现,效果如下:
得分   年龄  
0      2     
1      3     
2      0     
3      0     


------解决方案--------------------
这个 还算不上是动态列

if(选择全部)
 select * from ..
else
 select 选择值 from ..
------解决方案--------------------
可以先定义一个串变量,拼一个创建临时表的ddl语句,然后用 execute immediate 执行创建表
------解决方案--------------------

create table t1(khh varchar2(16),id int,yzpf int);
insert into t1 values ('001',123,2);
insert into t1 values ('002',111,3);
insert into t1 values ('003',112,1);
insert into t1 values ('004',113,2);
create table t2(id int,zbmc varchar2(16));
insert into t2 values(123,'年龄');
insert into t2 values(111,'文化程度');
insert into t2 values(112,'投资偏好');
insert into t2 values(113,'平仓情况');

declare
--下面的变量都可以作为参数传入PL中
--总字符串
v_str varchar2(40):='年龄,文化程度';
--需要分割的数量
v_str_num int :=2;
--各个子串的长度
length_str1 int :=2;
length_str2 int :=4;
begin
--用substr分割
--分割后的子串拼入下面的建表语句,建内存表也可以,并发比较好。
execute immediate 'create table temp1()';

end;

------解决方案--------------------
实在不行就用java搞吧,java截字符串还是比较简单的。
            ss = tempS