第一步:创建目录和赋权限
CREATE OR REPLACE DIRECTORY dir_export AS 'd:\oracle'; 
GRANT read,write ON directory dir_export TO scott; 第二步:建立导出存储过程:--********************************************************************* 
--*** 
--***执行导出文本文件的存储过程:p_exp 
--***p_tname:要导出的表明;p_query:where条件,根据这个条件导出,如果为null,则全表导出 
--*** 
--*** 
--********************************************************************* create or replace procedure p_exp(p_tname varchar2)
as
  v_line  varchar2(2000);                      --记录的数据
  v_sql    varchar2(2000);                      --动态sql变量
  v_fname  varchar2(40);                        --导出数据的文件名字
  cursor cursor_column                          --游标:通过数据字典查找出表有哪些字段
        is select column_name,data_type
        from user_tab_columns where table_name=upper(p_tname);   --获取表字段
  type type_cursor is ref cursor ;
  mycursor type_cursor;        
  outf utl_file.file_type;     --导出文件类型begin
  v_fname:=p_tname||'.csv';    --导出的文件名和类型
  for col in cursor_column loop
  --判断字段类型,生成对应的数据格式
    if col.data_type='DATE' then
          v_sql:=v_sql||'to_char('||col.column_name||',''yyyy-mm-dd-hh24:mi:ss'')'||''',''';
    else
          v_sql:=v_sql||col.column_name||'||'',''||';
    end if;
  end loop;
  v_sql:=rtrim(v_sql,'||'',''||'); --把拼接字段最后的拼接字符去除
  v_sql:='select '||v_sql||' from '||p_tname;
  dbms_output.put_line(v_sql);
  outf:=utl_file.fopen('DIR_EXPORT',v_fname,'w'); --打开文件夹,创建文件
  open mycursor for v_sql;
  loop
    fetch mycursor into v_line;
    exit when mycursor%notfound;
    --dbms_output.put_line(v_line); --控制台打印每条记录
    utl_file.put_line(outf,v_line);  --将每条记录写入文件
  end loop;
  utl_file.fclose(outf);   --关闭文件读写流
  dbms_output.put_line('导出成功');
end;第三步:执行存储过程:
SQL> execute p_exp('dba_users');
 
第四步:报错信息:
 
ORA-00923: 未找到要求的 FROM 关键字
ORA-06512: 在 "SYS.P_EXP", line 27
ORA-06512: 在 line 2
 
请问这个存储过程是哪里出了问题,总执行不成功.谢谢各位大虾.

解决方案 »

  1.   

    dbms_output.put_line(v_sql);
    你在控制台打印出来的SQL语句是否正确,查看是否缺‘和,号构造语句有问题。。
      

  2.   

    估计是你动态SQL拼接有错,你再仔细检查下。或者调试下,在过程中将SQL输入到一个中间表,然后看看是否正确、
      

  3.   

    估计是多了或者少了一个'号 
    在控制台打出v_sql看看另外,用for循环读取各个字段的那一堆代码,可以用wm_contact代替,那样简单很多,还可以减少出错的几率