標籤:exception ora 函數 data blog ade delete 檔案 miss
因為項目需要,有一個已經寫好的Java程式,想要在Oracle某個表的觸發器中調用,以使得每次資料更新時,調用這個JAVA程式,來修改後台某個資料。
現將過程記錄如下:
1。編寫JAVA程式
[java] view plain copy
- public class Main {
- public static void modify(String statTime)
- {
- String datas = "/var/spool/cron/oracle";
- File data = new File(datas);
- StringBuffer backup = null;
- try {
- StringBuffer content = new StringBuffer();
- backup = new StringBuffer();
- BufferedReader san = new BufferedReader(new FileReader(data));
- String line = null;
- while((line=san.readLine())!=null)
- {
- backup.append(line);
- backup.append("/n");
- }
- content.append("15 ");
- content.append(statTime.trim());
- content.append(" * * * /home/oracle/task.sh");
- content.append("/n");
-
- content.append("13 ");
- content.append(statTime.trim());
- content.append("* * * /home/oracle/tj_task/task2.sh");
- content.append("/n");
-
- FileWriter writer = new FileWriter(data,false);
- writer.write(content.toString());
- writer.flush();
-
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- try
- {
- FileWriter writer = new FileWriter(data,false);
- writer.write(backup.toString());
- writer.flush();
- }catch(Exception ex)
- {
- ex.printStackTrace();
- }
- }
- }
- }
注意,這裡寫JAVA程式不需要遵循標準的JAVA程式,一定要有main入口函數,相反,這裡的函數一般不要取名為main,除非格式是標準的main 函數格式,剛開始的時候我就犯了這個錯誤,一直找不到原因,後來經CSDN上的人點撥後,才發現是我把上面函數名寫成了main,後來換個名字就好了。還有,這個函數一定是要靜態。
2。把JAVA程式LOAD進oracle
在$ORACLE_HOME/bin目錄下有個LOADJAVA命令,使用這個命令將剛寫好的JAVA程式LOAD進資料庫。
loadjava -user test/[email protected] -o -v -f -r Main.java
如果成功的話,會列印出來資訊提示成功,若程式有編譯錯誤的話,也會提示你錯誤的地方。
3。修改許可權
因為我的這個JAVA程式裡涉及到對檔案的讀寫操作,所以要先修改許可權。
首先以管理員身份登入進資料庫
sqlplus / as sysdba
然後執行
begin
dbms_java.grant_permission(‘TEST‘,‘SYS:java.io.FilePermission‘,‘/var/spool/cron/oracle‘,‘read,write,execute,delete‘);
end;
/
執行完畢後,在資料庫裡執行上述JAVA程式時,就擁有讀寫該檔案的許可權了。
4。建立預存程序
進入到資料庫,我是在SQLPLUS命令列
create or replace procedure Modify(name varchar2) as language Java name ‘Main.modify(java.lang.String)‘;
/
會提示建立預存程序成功。
5。增加trigger
我是在TOAD裡直接針對某個表增加trigger,所以我唯寫出關鍵區段的代碼
begin
if :old.name = ‘time‘ then
Modify(:new.value);
end if;
end;
至此,在ORACLE的trigger裡調用JAVA程式就完成了,後來的實驗證明,每當更新這個表時,都確實執行了該JAVA程式,完成了對檔案的讀寫。
在ORACLE觸發器裡調用JAVA程式