虽然很多,,帖子,,但是我想在这里,,大家能总结一下。我也学习学习欢迎你的能力。

解决方案 »

  1.   

    11g有现成的函数pivot,列转行就用unpivot。
      

  2.   

    我以前用过动态SQL  把一个表的所有列名读出来拼接起来,然后用DBMS_SQL动态游标获取每一行每个字段的记录,然后把这些记录放进另一个表B。具体如下:
    如果只是要动态获取每一行的数据(比如每行的数据字段是用字符串拼接起来导致数量不一致时)的逐个字段的话,步骤可以是:
    通常运用DBMS_SQL的步骤:
    1. open cursor: 打开cursor
    2. parse cursor:解析你要执行的SQL语句
    3. define column:定义要解析的变量顺序(如果变量时字符串的话,那么还要有第四个字段,用于指定该字段字符串大小,不然会报错)
    4. execute:执行SQL语句
    5. Fetch rows然后column_value,来取值
    6. close cursor:在执行后关闭此cursor.工作示例:n_cur         number;   --定义一个变量,当做游标句柄dbms_sql.parse(n_cur, v_sql, dbms_sql.native);   --解析SQL语句到句柄for i in 1..n_NumKeys loop
            dbms_sql.define_column(n_cur,i,KeyStr_Array(i),200);   --动态指定哪个字段写到哪个变量,并且字符串大小为200
        end loop;
        n_sqlres := dbms_sql.execute(n_cur);    -- 执行
        loop
          if dbms_sql.fetch_rows(n_cur) > 0 then    -- 获取每行的数据
            for i in 1..n_NumKeys loop
                dbms_sql.column_value(n_cur,i,KeyStr_Array(i));  --每行逐个写到指定变量里,照目前来看,这个KeyStr_Array(i)和define_column里面的第三个是一样的,看来只是个规则……
            end loop;
          else
            exit;
          end if;
        end loop;dbms_sql.close(n_cur); --关闭动态游标