<code>create</code> <code>or</code> <code>replace</code> <code>procedure</code> <code>row_to_col(tabname </code><code>in</code> <code>varchar2,</code>
<code> </code><code>group_col </code><code>in</code> <code>varchar2,</code>
<code> </code><code>column_col </code><code>in</code> <code>varchar2,</code>
<code> </code><code>value_col </code><code>in</code> <code>varchar2,</code>
<code> </code><code>Aggregate_func </code><code>in</code> <code>varchar2 </code><code>default</code> <code>'max'</code><code>,</code>
<code> </code><code>colorder </code><code>in</code> <code>varchar2 </code><code>default</code> <code>null</code><code>,</code>
<code> </code><code>roworder </code><code>in</code> <code>varchar2 </code><code>default</code> <code>null</code><code>,</code>
<code> </code><code>when_value_null </code><code>in</code> <code>varchar2 </code><code>default</code> <code>null</code><code>,</code>
<code> </code><code>viewname </code><code>in</code> <code>varchar2 </code><code>default</code> <code>'v_tmp'</code><code>)</code>
<code>Authid </code><code>Current_User</code>
<code>as</code>
<code> </code><code>sqlstr varchar2(2000):=</code><code>'create or replace view '</code><code>||viewname||</code><code>' as select '</code><code>||group_col||</code><code>' '</code><code>;</code>
<code> </code><code>c1 sys_refcursor;</code>
<code> </code><code>v1 varchar2(100);</code>
<code>begin</code>
<code> </code><code>open</code> <code>c1 </code><code>for</code> <code>'select distinct '</code><code>||column_col||</code><code>' from '</code><code>||tabname||</code><code>case</code> <code>when</code> <code>colorder </code><code>is</code> <code>not</code> <code>null</code> <code>then</code> <code>' order by '</code><code>||colorder </code><code>end</code><code>;</code>
<code> </code><code>loop</code>
<code> </code><code>fetch</code> <code>c1 </code><code>into</code> <code>v1;</code>
<code> </code><code>exit </code><code>when</code> <code>c1%notfound;</code>
<code> </code><code>sqlstr:=sqlstr||chr(10)||</code><code>','</code><code>||</code><code>case</code> <code>when</code> <code>when_value_null </code><code>is</code> <code>not</code> <code>null</code> <code>then</code> <code>'nvl('</code> <code>end</code><code>||</code>
<code> </code><code>Aggregate_func||</code><code>'(decode(to_char('</code><code>||column_col||</code><code>'),'</code><code>''</code><code>||v1||</code><code>''</code><code>','</code><code>||value_col||</code><code>'))'</code><code>||</code>
<code> </code><code>case</code> <code>when</code> <code>when_value_null </code><code>is</code> <code>not</code> <code>null</code> <code>then</code> <code>chr(44) ||when_value_null||chr(41) </code><code>end</code><code>||</code><code>'"'</code><code>||v1||</code><code>'"'</code><code>;</code>
<code> </code><code>end</code> <code>loop;</code>
<code> </code><code>close</code> <code>c1;</code>
<code> </code><code>sqlstr:=sqlstr||</code><code>' from '</code><code>||tabname||</code><code>' group by '</code><code>||group_col||</code><code>case</code> <code>when</code> <code>roworder </code><code>is</code> <code>not</code> <code>null</code> <code>then</code> <code>' order by '</code><code>||roworder </code><code>end</code><code>;</code>
<code> </code><code>execute</code> <code>immediate sqlstr;</code>
<code>end</code> <code>row_to_col;</code>
这里修改了传入参数名,使其更容易理解。继续使用了创建视图这个方法,当然也可以改成用游标传出。
参数:
tabname 需要进行行转列操作的表名;
group_col 查询结果要按某列或某些列分组的字段名;
column_col 要从行转成列的字段;
value_col 需要聚合的值字段;
Aggregate_func 选用的聚合函数,可选,默认为max;
colorder 行转列后列的排序,可选;
roworder 行转列后记录的排序,可选;
when_value_null 若value_col字段的值聚合后为空,则转换成该值,可选;
viewname 创建的视图名称,可选,默认为v_tmp。