定义一个游标: CURSOR ABC IS  SELECT A.*    FROM   A  现在不知道 表A 中有多少字段,请问如何操作能把游标中每一行中每个字段
的值以逗号为隔点赋值到一个字符串变量 STRROWVALUE中呢?

解决方案 »

  1.   

    你直接从A里面区是取不出来的,oracle把你的列名都存在User_Tab_Columns这个table里面,你可以通过table_name去取。
    Select * From User_Tab_Columns Where table_name='A'
      

  2.   

    无所谓的,先从User_Tab_Columns 里面count一把,然后循环一下就行了,多少个字段写法都一样
      

  3.   

    我怎么不太明白呢,那字段里面的值怎么取呢?User_Tab_Columns 好像只能知道字段名啊!
      

  4.   

    先从USER_TAB_COLUMNS中取出列SELECT * FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'A';
    然后通过循环将字段组合到一起
    SELECT COL_1|| ',' || COL_2|| ',' || COL_3 ... AA FROM A;
      

  5.   

    给个范例给你(以EMP表为例):DECLARE
        strColumns    varchar2(1000);
        strCol        varchar2(20);
        v_sql         varchar2(2000);
        strMergerVals varchar2(2000);
        tblName       varchar2(50);
        TYPE refCursor IS REF CURSOR;
        curFields   refCursor;
        curValues   refCursor;    
    BEGIN
        tblName := 'EMP';
        v_sql := 'select COLUMN_NAME from USER_TAB_COLUMNS where TABLE_NAME = :tblName';
        strColumns := '#';    OPEN curFields FOR v_sql USING tblName;    LOOP
           FETCH curFields INTO strCol;
           EXIT WHEN curFields%NOTFOUND;
           strColumns := strColumns || 'TO_CHAR(' || strCol || ') || ';
        END LOOP;    IF (strColumns <> '#') THEN
            strColumns := SUBSTR(strColumns, 2, LENGTH(strColumns) - 4);
        END IF;    CLOSE curFields;    DBMS_OUTPUT.PUT_LINE(strColumns);
        v_sql := 'select ' || strColumns || ' as MergeCols FROM ' || tblName;
        DBMS_OUTPUT.PUT_LINE(v_sql);
        DBMS_OUTPUT.PUT_LINE('==============================================');
        OPEN curValues FOR v_sql;    LOOP
            FETCH curValues INTO strMergerVals;
            EXIT WHEN curValues%NOTFOUND;
            DBMS_OUTPUT.PUT_LINE(strMergerVals);
        END LOOP;    CLOSE curValues;
    END;
    /
      

  6.   

    下面的加了一点异常处理
    DECLARE
        strColumns    varchar2(1000);
        strCol        varchar2(20);
        v_sql         varchar2(2000);
        strMergerVals varchar2(2000);
        tblName       varchar2(50);
        TYPE refCursor IS REF CURSOR;
        curFields   refCursor;
        curValues   refCursor;    
    BEGIN
        tblName := 'emp';
        v_sql := 'select COLUMN_NAME from USER_TAB_COLUMNS where TABLE_NAME = :tblName';
        strColumns := '#';    OPEN curFields FOR v_sql USING tblName;    LOOP
           FETCH curFields INTO strCol;
           EXIT WHEN curFields%NOTFOUND;
           strColumns := strColumns || 'TO_CHAR(' || strCol || ') || ';
        END LOOP;    IF (strColumns <> '#') THEN
            strColumns := SUBSTR(strColumns, 2, LENGTH(strColumns) - 4);
        /*新加的,找不到指定表时的处理*/
        ELSE
            DBMS_OUTPUT.PUT_LINE('指定表名' || tblName || '错误!');
            RETURN;
        /**************************/
        END IF;    CLOSE curFields;    DBMS_OUTPUT.PUT_LINE(strColumns);
        v_sql := 'select ' || strColumns || ' as MergeCols FROM ' || tblName;
        DBMS_OUTPUT.PUT_LINE(v_sql);
        DBMS_OUTPUT.PUT_LINE('==============================================');
        OPEN curValues FOR v_sql;    LOOP
            FETCH curValues INTO strMergerVals;
            EXIT WHEN curValues%NOTFOUND;
            DBMS_OUTPUT.PUT_LINE(strMergerVals);
        END LOOP;    CLOSE curValues;
    END;
    /
      

  7.   

    中间迦逗号的话把:
    strColumns := strColumns || 'TO_CHAR(' || strCol || ') || ';
    改成:
    strColumns := strColumns || 'TO_CHAR(' || strCol || ') || '','' || ';
    就可以了
      

  8.   

    你可能没有明白我的意思,我是要把表里面每个字段的值相连!
    比如  CLASS NAME   AGE ...
           01   ZHANG   19
    效果是 连成一个字符串"01,ZHANG,19",但是现在因为有很多个表都要这个操作,所以不能确定表的字段!
      

  9.   

    那你运行我写的PL/SQL没有呢?
    从EMP表中挑出来的值不是连在一起了吗?
      

  10.   

    仔细看看v_sql变量的用法你就会明白,把条件放在v_sql中
      

  11.   

    刚才在网上找到了一篇相关的文章,也不错,大家一起学习吧!
    http://yangtingkun.itpub.net/post/468/205331
      

  12.   

    V_BUFFER := REPLACE(V_BUFFER, '"', '""'); 加上一句就好了!