CREATE OR REPLACE PROCEDURE tabtotxt IS
testjiao_handle UTL_FILE.file_type;
BEGIN
  testjiao_handle := UTL_FILE.FOPEN('DIR_DUMP','testjiao.txt','w');
    FOR x IN (SELECT * FROM emp) LOOP
      UTL_FILE.PUT_LINE(testjiao_handle,x.empno || ',' || x.ename ||','|| x.job ||','|| x.mgr ||','|| x.sal ||',');
    END LOOP;
      UTL_FILE.FCLOSE(testjiao_handle);
EXCEPTION WHEN OTHERS THEN
  DBMS_OUTPUT.PUT_LINE(SUBSTR(SQLERRM,1,2000));
END;请教下
UTL_FILE.PUT_LINE(testjiao_handle,x.empno || ',' || x.ename ||','|| x.job ||','|| x.mgr ||','|| x.sal ||',');
x的字段都是写死了 请问下 如何动态实现(字段是循环拼接而成的)

解决方案 »

  1.   

    建议你在写游标的时候,就把数据直接拼接好for x in (select empno || ',' || ename from emp)因为游标可以使用动态sql,你可以自己拼接declare cur_test    sys_refcursor;
    open cur_test for 'select empno || '','' || ename from emp';
    其他的再按照游标循环去做
      

  2.   

    查询PL/SQL的动态SQL执行。再有你的这个存储过程,只操作一个表,为什么字段名要动态拼接,而且你存储过程又没传递参数进来。
      

  3.   


    您好!我想问下
    如果我定义一个变量abc
    abc := x.empno || ',' || x.ename ||','|| x.job ||','|| x.mgr ||','|| x.sal ||',' ;
    如何写 使下面两个写法执行得到同样的结果
    UTL_FILE.PUT_LINE(testjiao_handle,abc);
    UTL_FILE.PUT_LINE(testjiao_handle,x.empno || ',' || x.ename ||','|| x.job ||','|| x.mgr ||','|| x.sal ||',');
      

  4.   

    好的, 
    有一张表table_name ,只有一个字段tablename
    这个字段里存的都是表名
    我想要写个存储过程,导出每个表的数据到 文本文件(每个表导出一个文本文件)