UTL_FILE 保存在本地机器中 [英] UTL_FILE saving in local machine

查看:72
本文介绍了UTL_FILE 保存在本地机器中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

你好,我想在我的本地机器上保存所有的功能、程序、包.我尝试使用 SPOOL 但使用 spool 我不确定获取文件名并保存它.所以我尝试使用 UTL_FILE .. 但问题是我的数据库在 UNIX 中,我想保存在我的 Windows 本地机器中.我收到下面提到的错误

费勒贝里赫特 -ORA-29283: Ungültiger DateivorgangORA-06512:在SYS.UTL_FILE"中,Zeile 536ORA-29283: Ungültiger DateivorgangORA-06512:在 Zeile 2429283. 00000 - 无效的文件操作 %s"*原因:试图从一个文件或目录中读取不存在,或者文件或目录访问被拒绝操作系统.*操作:验证文件系统上的文件和目录访问权限,如果正在读取,请验证该文件是否存在.

下面是我的代码.

CREATE DIRECTORY FUNC_DIR AS 'C:\Workspace\BE\DB\Funktionen\';
CREATE DIRECTORY PROC_DIR AS 'C:\Workspace\BE\DB\Prozeduren';
CREATE DIRECTORY PACK_DIR AS 'C:\Workspace\BE\DB\Package\';
CREATE DIRECTORY PACBO_DIR AS 'C:\Workspace\BE\DB\Package_Body';
GRANT READ,WRITE ON DIRECTORY FUNC_DIR TO PUBLIC;
GRANT READ,WRITE ON DIRECTORY PROC_DIR TO PUBLIC;
GRANT READ,WRITE ON DIRECTORY PACK_DIR TO PUBLIC;
GRANT READ,WRITE ON DIRECTORY PACBO_DIR TO PUBLIC;

DECLARE
fileHandler UTL_FILE.FILE_TYPE; 
filename VARCHAR2(60); 
filetext VARCHAR2(32766); 
filetype VARCHAR2(20);


BEGIN 
FOR a IN (SELECT distinct name,type INTO filename,filetype 
FROM all_source 
WHERE type IN 
('FUNCTION','PROCEDURE','PACKAGE','PACKAGE_BODY') 
AND OWNER='HR')
LOOP
filetype := a.object_type;
filename := a.object_name;  
IF (filetype = 'FUNCTION') THEN
fileHandler := UTL_FILE.FOPEN('FUNC_DIR', filename||'.sql', 'W'); 
ELSIF filetype = 'PROCEDURE' THEN
fileHandler := UTL_FILE.FOPEN('PROC_DIR', filename||'.sql', 'W'); 
ELSIF filetype = 'PACKAGE' THEN
fileHandler := UTL_FILE.FOPEN('PACK_DIR', filename||'.sql', 'W');  
ELSIF filetype = 'PACKAGE_BODY' THEN
fileHandler := UTL_FILE.FOPEN('PACBO_DIR', filename||'.sql', 'W'); 

FOR b IN (SELECT text INTO filetext FROM all_source WHERE TYPE IN('FUNCTION')AND OWNER = 'HR' AND 
NAME = (filename))
LOOP
filetext := b.text;
UTL_FILE.PUTF(fileHandler, filetext); 
END LOOP;
UTL_FILE.FCLOSE(fileHandler); 

ELSE
DBMS_OUTPUT.PUT_LINE('OBJECT TYPE DOES NOT MATCH');
END IF;
END LOOP;
EXCEPTION
WHEN utl_file.invalid_path THEN
raise_application_error(-20000, 'ERROR: Invalid PATH FOR file.');
END;
/

推荐答案

您可以在 PLSQL 中使用 dbms_output.put_line 和 SPOOL 来获得结果.例如,如下所示.这会在 file_name.txt 文件中打印 ename、sal.

You can use dbms_output.put_line in your PLSQL together with SPOOL to get the result. For example like the below.This prints ename, sal in the file_name.txt file.

    set serveroutput on  
    Spool e:\file_name.txt  
    Begin  
      for c in (Select ename, sal from emp)  
      loop  
        dbms_output.put_line(c.ename || ',' || c.sal);  
      end loop;  
    End;  
    /  
    spool off

对于您的示例,您可以使用以下内容

for your example, you can use the below

    set serveroutput on  
    Spool C:\Workspace\BE\DB\Funktionen\Function1.sql
    BEGIN 
    FOR a IN (SELECT distinct name,type 
    FROM all_source 
    WHERE type IN 
    ('FUNCTION')
    AND OWNER='HR')
    LOOP
    FOR b IN (SELECT text FROM all_source WHERE TYPE IN('FUNCTION')AND OWNER = 'HR' AND 
    NAME = (a.name))
    LOOP
    dbms_output.enable;
    dbms_output.put_line(b.text);

    END LOOP;
    END LOOP;
    EXCEPTION
    WHEN others THEN
    dbms_output.put_line( 'ERROR: Invalid PATH FOR file.'||sqlerrm);
    END;
    /  
    spool off

您可以生成一个包含所有函数的 plsql 的主文件,您可以为所有函数运行该文件

You can generate one master file which has plsql for all the functions individually which you can run for all the functions

        set serveroutput on
    spool C:\Workspace\BE\DB\Funktionen\function12.sql
    begin
    FOR a IN (SELECT distinct name,type 
        FROM all_source 
        WHERE type IN 
        ('FUNCTION')
        AND OWNER='HR')
        loop
     dbms_output.enable  ; 
    dbms_output.put_line('set serveroutput on  
        Spool C:\Workspace\BE\DB\Funktionen\'||a.name||'.sql
        BEGIN 
        FOR a1 IN (SELECT distinct name,type 
        FROM all_source 
        WHERE type IN 
        (''FUNCTION'')
        AND OWNER=''HR'' and name='''||a.name||''')
        LOOP
        FOR b IN (SELECT text FROM all_source WHERE TYPE IN(''FUNCTION'')AND OWNER = ''HR'' AND 
        NAME = '''||a.name||'''))
        LOOP
        dbms_output.enable;
        dbms_output.put_line(b.text);

        END LOOP;
        END LOOP;
        EXCEPTION
        WHEN others THEN
        dbms_output.put_line( ''ERROR: Invalid PATH FOR file.''||sqlerrm);
        END;'
        );
        END LOOP;
        END;
        /
    spool off

这篇关于UTL_FILE 保存在本地机器中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆