我需要在存储过程里面动态生成一个sql,这个sql union了几个表,需要把结果集里面字段的值循环拼接成一整个字符串,怎么做?
这个动态sql类似:
select field1,field2,field3 from table1 where xx=xx
union
select field1,field2,field3 from table2 where yy=yy
union
select field1,field2,field3 from table3 where zz=zz在存储过程里面用这样的写法好像不能实现:
OPEN cursor_d FOR m_querysql;
    LOOP
        FETCH cursor_d INTO tab;
        EXIT WHEN cursor_d %NOTFOUND;
        /*循环拼接的代码*/
    END LOOP;
CLOSE cursor_d;

解决方案 »

  1.   

    可以用union all, 看我的test codedeclare
        cur_x sys_refcursor;
        v_sql VARCHAR2(32767);
        v_deptno dept.deptno%type;
    begin
        v_sql := 'SELECT deptno FROM dept UNION ALL SELECT deptno from EMP';
        open cur_x for v_sql;
        loop
            FETCH cur_x INTO v_deptno;
            EXIT WHEN cur_x%notfound;
            dbms_output.put_line(v_deptno);
        end loop;
        close cur_x;
    end;
      

  2.   

    一定要字符串,可以用sys_connect_by_path ,结合树型
      

  3.   

    比如查询的数据为
    11 admin [email protected]
    12 zhang  [email protected]
    13 xiu      [email protected]
    然后拼接完了就是
    "11/admin/[email protected] 12/zhang/[email protected] 13/xiu/[email protected]"
      

  4.   

    说白了,就是不知道如何循环动态sql并且取得这个sql查询结果里面的字段的值
      

  5.   

    你这种的表都是固定的,所以你能够确定v_deptno,我的sql是动态拼接的,而且是union了几个表的结果,所以v_deptno我要怎么确定呢??
      

  6.   

    --客官请...
    SELECT REPLACE(WMSYS.WM_CONCAT(FIELDS),',',' ')
      FROM (  
            SELECT FIELD1||'/'||FIELD2||'/'||FIELD3 FIELDS FROM TABLE1 WHERE XX=XX 
            UNION 
            SELECT FIELD1||'/'||FIELD2||'/'||FIELD3 FIELDS FROM TABLE2 WHERE YY=YY 
            UNION 
            SELECT FIELD1||'/'||FIELD2||'/'||FIELD3 FIELDS FROM TABLE3 WHERE ZZ=ZZ
           )TT;