create function fmerg(id in number)
returns varchar2
as
str varchar(8000);
beginfor x in select * from tableA
loop
str:=str||to_char(substr)||',';
end loop;
return str;
End

解决方案 »

  1.   

    /*下面的例子变换一个表的行与列*/
    DECLARE
    TYPE phoneNum IS TABLE OF tb_phone_no%ROWTYPE INDEX BY BINARY_INTEGER; /*声明索引表类型*/
    selPart phoneNum; /*声明索引表类型变量*/
    loopCount INTEGER;
    colTotal INTEGER:=5; /*总计列数*/ CURSOR curSel IS /*声明游标*/
    SELECT phone_no,city_code,city_name,state,type 
    FROM tb_phone_no
    WHERE phone_no in ('1333241','1339414','1334237','1333222','1332230');BEGIN
    loopCount:=0;
    OPEN curSel; /*打开游标*/
    FETCH curSel INTO selPart(loopCount); /*从游标中检索数据行*/
    WHILE curSel%FOUND LOOP /*当不再能找到数据时,终止查询*/
    loopCount:=loopCount+1;
    FETCH curSel INTO selPart(loopCount);
    END LOOP;
    CLOSE curSel; /*关闭游标*/ DBMS_OUTPUT.PUT_LINE('正常显示:');
    loopCount:=selPart.FIRST;
    LOOP
    DBMS_OUTPUT.PUT_LINE(selPart(loopCount).phone_no ||
    ' ' || selPart(loopCount).city_code ||
    ' ' || selPart(loopCount).city_name ||
    ' ' || selPart(loopCount).state ||
    ' ' || selPart(loopCount).type);
    EXIT WHEN loopCount=selPart.LAST;
    loopCount:=selPart.NEXT(loopCount);
    END LOOP;
    DBMS_OUTPUT.PUT_LINE('------------------------------------------------');
    DBMS_OUTPUT.PUT_LINE('行列转换:'); FOR loopCount IN 0..colTotal-1 LOOP
    DBMS_OUTPUT.PUT(selPart(loopCount).phone_no || ' ');
    END LOOP;
    DBMS_OUTPUT.PUT_LINE('');
    FOR loopCount IN 0..colTotal-1 LOOP
    DBMS_OUTPUT.PUT(selPart(loopCount).city_code || ' ');
    END LOOP;
    DBMS_OUTPUT.PUT_LINE('');
    FOR loopCount IN 0..colTotal-1 LOOP
    DBMS_OUTPUT.PUT(selPart(loopCount).city_name || ' ');
    END LOOP;
    DBMS_OUTPUT.PUT_LINE('');
    FOR loopCount IN 0..colTotal-1 LOOP
    DBMS_OUTPUT.PUT(selPart(loopCount).state || ' ');
    END LOOP;
    DBMS_OUTPUT.PUT_LINE('');
    FOR loopCount IN 0..colTotal-1 LOOP
    DBMS_OUTPUT.PUT(selPart(loopCount).type || ' ');
    END LOOP;
    DBMS_OUTPUT.PUT_LINE('');
    END;
      

  2.   


    谢谢
    数据库不熟悉。
    最好能有简单的SQL语句就可以。比如就:
    表中只有1条纪录
    col1  col2  col3  col4
    1     2     3      4然后如何得到列1   列2
    col1  1
    col2  2
    col3  3
    col4  4
      

  3.   

    --列转行简单方法:
    SQL> SELECT * FROM TEST_TAB;COL_A           COL_B
    ---------- ----------
    A                   1
    A                   2
    B                   2
    B                   3
    C                   4
    D                   1
    D                  12
    D                 121
    D                  129 rows selectedSQL> SELECT SUM(DECODE(COL_A,'A',COL_B,0)) A,SUM(DECODE(COL_A,'B',COL_B,0)) B,
      2  SUM(DECODE(COL_A,'C',COL_B,0)) C,SUM(DECODE(COL_A,'D',COL_B,0)) D
      3  FROM TEST_TAB;         A          B          C          D
    ---------- ---------- ---------- ----------
             3          5          4        146--行转列我想的方法只有用过程了:)
      

  4.   

    比较接近的是如下的方式:
    SQL> select * from test_table;         A          B          C          D
    ---------- ---------- ---------- ----------
             3          5          4        146SQL> select decode(id,1,A,2,B,3,C,4,D) FROM
      2  (select * from (select * from test_table,(select rownum id from dual connect by rownum <= 4)));DECODE(ID,1,A,2,B,3,C,4,D)
    --------------------------
                             3
                             5
                             4
                           146但是楼主需要把列名:col1,col2也变成数据这就很难在一个SQL语句上实现了
    首先要查看数据表的栏位还看你对user_tab_columns这个视图是否有查询权限
      

  5.   

    权限是有如果不能解决。帮我弄个过程也行。
    我的表是col1   col2   col3   col4  col5  col6(该列值唯一)
    1       2     3       4    5     20061206
    6      7      8       9    9     20061208
    10     11    12      13   14     20061209输入一个参数(col6,如20061206),得到列1   列2
    col1  1
    col2  2
    col3  3
    col4  4
    col5  5
    col6  20061206
      

  6.   

    用过程的话就简单了:)楼主你自己做一下就可以
    建立临时表包含栏位(col_name,value1,value2,value3)
    insert into 临时表 (col_name) 
    select column_name from user_tab_columns where table_name ='your_table' ;下面的就简单了,一个一个栏位的比较UPDATE数值就可以
      

  7.   

    将行数据转换成列数据,使用动态sql和case when 可以解决问题,具体参看http://hi.baidu.com/zhao_e893/blog/item/1e18224eec57c8cad1c86a3f.html