UTL_FILE保存在本地计算机中

时间:2020-03-27 08:55:18

标签: sql oracle plsql spool utl-file

你好, 我想将所有功能,过程,程序包保存在本地计算机中。我尝试使用SPOOL,但使用假脱机即时通讯不确定是否要获取文件名并保存。所以我尝试使用UTL_FILE。。但是问题是我的数据库在UNIX中,所以我想保存在Windows本地计算机中。我收到以下提到的错误

Fehlerbericht- ORA-29283:UngültigerDateivorgang ORA-06512:在Zeile 536的“ SYS.UTL_FILE”中 ORA-29283:UngültigerDateivorgang ORA-06512:在Zeile 24中 29283. 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;
/

2 个答案:

答案 0 :(得分:0)

UTL_FILE写入数据库服务器。要写入本地计算机,您需要在db服务器上挂载目录。这通常是个坏主意!

使用spool可以写到您的计算机上:

spool c:\path\to\your\folder\file.name
select ....

答案 1 :(得分:0)

您可以在PLSQL中将dbms_output.put_line与SPOOL一起使用以获取结果。例如下面这样。它将在file_name.txt文件中打印ename,sal。

    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

例如,您可以使用以下

    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,可以为所有功能运行

        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
相关问题