<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。