1. 程式人生 > >oracle 提供的package對開發者的支持[重要](七)

oracle 提供的package對開發者的支持[重要](七)

讀寫 沒有 stat 顯示 alt creat replace 權限 eat

1.dbms_alert -- 消息傳輸的包
2.dbms_lock -- 鎖的處理 oracle lock management service
3.dbms_session -- session級別的命令
4.dbms_output -- 輸出結果
5.htp -- 數據庫緩存中寫html - 創建簡單的web頁面
6.utl_file --與操作系統文本文件交互
7.utl_mail -- 收發郵件
8.dbms_scheduler -- 定期執行pl/sql代碼 - job

oracle自帶的腳本存放路徑:
D:\oracle11g\app\Administrator\product\11.2.0\dbhome_1\RDBMS\ADMIN

-- dbms_output 從數據庫緩存中取數據
1.put , put_line
2.get ,get_line
3.開啟顯示 :SET serveroutput ON;


-- utl_file

-- 讀寫文件

1 f:=fopen(dir,FILE,r); -- 讀文件
2 get_line(f,buf,LEN); -- 讀一行
3 fclose(f) -- 關閉文件
4 put(f,buf)
5 put_line(f,buf) -- 寫入文件
6 f:=fopen(dir,FILE,w); -- 只寫的方式寫文件
7 f:=fopen(dir,FILE,a); -- 追加寫方式

-- utl_file 讀寫文件的錯誤

1 invalid_path
2 invalid_mode
3 invalid_filehandle
4 invalid_operation
5 read_error
6 write_error
7 internal_error

-- 通用錯誤

1 NO_data_found
2 value_error

----utl_file 操作文件的例子
--- 準備工作

1 / AS SYSDBA; -- 需要dba權限
2 CREATE DIRECTORY my_dir AS C:\dir; -- 創建目錄
3 GRANT READ,WRITE ON
DIRECTORY my_dir TO PUBLIC -- 授權目錄 4 SHOW parameter utl_file_dir; --查看系統變量 (沒有) 5 ALTER SYSTEM SET utl_file_dir = C:\dir SCOPE=SPFILE; -- 更改系統參數 6 [SCOPE = SPFILE/memory/BOTH] 7 SHUTDOWN IMMEDIATE; -- 關閉數據庫 8 startup -- 啟動數據庫 9 SHOW parameter utl_file_dir; --查看系統變量 (已經生效)

-- 建立存儲過程

 1 CREATE OR REPLACE PROCEDURE sal_status(
 2    dir IN VARCHAR2,
 3    filename IN VARCHAR2
 4 ) IS
 5 FILE utl_file.file_type;
 6   CURSOR empc IS SELECT last_name,salary,department_id FROM employees ORDER BY  department_id; -- 表中記錄
 7   newdeptno employees.department_id%TYPE; --新的部門號
 8   olddeptno employees.department_id%TYPE := 0; --舊的部門號
 9 BEGIN
10   FILE := utl_file.fopen(dir,filename ,w); -- 打開文件
11   utl_file.put_line(file,report:generated on  || SYSDATE); -- 寫入內容
12   utl_file.new_line(FILE); -- 新建一行
13   FOR emp_rec IN empc LOOP  -- 循環員工記錄
14     IF emp_rec.department_id <> olddeptno THEN   -- 記錄部門值<>舊部門
15       utl_file.put_line(FILE,department: || emp_rec.department_id);  --新追加一行
16     END IF;
17     utl_file.put_line(FILE,employee: || emp_rec.last_name ||  earns : || emp_rec.salary); -- 追加日誌
18     olddeptno := emp_rec.department_id; --舊部門值更新
19   END LOOP;
20   utl_file.put_line(FILE,xxxend ofreportxxx);
21   utl_file.fclose(FILE);
22   EXCEPTION
23     WHEN utl_file.invalid_filehandle THEN
24      raise_application_error(-20001,invalid file);
25     WHEN utl_file.write_error THEN
26      raise_application_error(-20002,unable to be write);
27 END sal_status;

-- 運行問題

execute sal_status(MY_DIR,salreport.txt);


-- 報錯

1 SQL> execute sal_status(MY_DIR,salreport.txt);
2 begin sal_status(MY_DIR,salreport.txt); end;
3 ORA-29283: invalid file operation
4 ORA-06512: at "SYS.UTL_FILE", line 536
5 ORA-29283: invalid file operation
6 ORA-06512: at "HR.SAL_STATUS", line 10
7 ORA-06512: at line 1


-- 原因

C:\dir 的dir目錄需手動創建,oracle並不檢查文件夾是否已經存在.

oracle 提供的package對開發者的支持[重要](七)