oracle触发器 编写,用sqlj编写oracle触发器成功记^_^

【环境】:

winXP sp2

oracle 9.2.0.1.0

【辅助工具】:

JDeveloper904(写sqlj代码用)

由于第一次用sqlj,对oracle jvm和触发器都不是很了解,所以程序能执行成什么样子也不知道,只能一步一步的摸索……

【一些很失败的操作】:

1、用9i的OEM来创建java源,没有在命令行下用loadjava!

用JDeveloper写好了程序之后,直接用OEM创建“java源”,然后把代码粘贴进去,编译,通过……这样做看似可以运行,实际上有一些编译过程中的warning都没有显示,所以也不知道到底会不会有错误(影响不大,不过建议最好去命令行下去做),但是,这样创建很容易犯一个致命的错误,就是创建的时候很容易把java文件的包信息忽略,比如,偶的sqlj文件头是这样的:

package com.supermap.subo;

import sqlj.runtime.*;

import sqlj.runtime.ref.*;

import java.sql.*;

import oracle.sqlj.runtime.*;

import java.io.File;

#sql iterator Tuser(Long id , String name);

public class SqljTest

在OEM中创建“java源”的时候直接创建SqljTest,然后把代码复制进去,编译可以通过,但是在“java类”下面并没有相应的类生成!而且没有提示!

2、用OEM去创建PROCEDURE,create or replace procedure test (args varchar2) as language java name 'SqljTest.test(java.lang.String)';(这里也没有注意到要这样引用:'com.supermap.subo.SqljTest.test(java.lang.String)';也没有任何的错误提示,编译一直是Valid!)

3、用OEM创建触发器:create or replace trigger test after update of NAME on T_USER for each row CALL test2(:old.NAME) ,这么创建倒是没什么问题,不过总是提示ORA-00963:缺少表达式!后来证明用同样的语句到sqlplus下去创建,不会有错误!

【成功的操作】:

1、编写sqlj代码:

package com.supermap.subo;

import sqlj.runtime.*;

import sqlj.runtime.ref.*;

import java.sql.*;

import oracle.sqlj.runtime.*;

import java.io.File;

#sql iterator Tuser(Long id , String name);

public class SqljTest

{

public static void test(String args)

{

try

{

Oracle.connect("jdbc:oracle:thin:@localhost:1521:SOOBUR","SYSTEM","supermap");

Tuser u;

#sql

u = { SELECT ID,NAME FROM SOOBUR.T_USER WHERE ID = 1 };

while(u.next())

{

System.out.println(u.name());

if (u.name().equals("user_8762886"))

{

File fo = new File("c:/test.txt");

fo.createNewFile();

}

}

} catch (Exception ex)

{

ex.printStackTrace();

}

}

}

2、乖乖的到命令行下去loadjava:loadjava -user [username]/[pass]@SID -o -v -r ./SqljTest.sqlj

这回有提示了:

errors   : source com/supermap/subo/SqljTest

com/supermap/subo/SqljTest:18: Warning: 从 NUMERIC(38) 转换到列 java.lang.Long id 时, 可能会降低精度。

#sql

^

Info: 1 warnings

问题不大,这个时候再打开OEM看一下,“java源”显示的是com/supermap/subo/SqljTest名字明显的不一样了!“java类”下面也有了相应的目录结构和类!

3、登陆到sqlplus,create or replace procedure test (args varchar2) as language java name 'SqljTest.test(java.lang.String)';

4、create or replace trigger test after update of NAME on T_USER for each row CALL test2(:old.NAME)

5、然后随便update一条记录,成功!test.txt也创建成功(原来以为oracle的jvm可能会受限制,不能随便对其他目录进行读写,现在看来不是这样的^_^)!

【小节一下】 :

做试验的时候千万不要怕麻烦!一定要乖乖的到命令行下去一句一句的敲!尤其是像偶这样初学的xdjm们!好像用OEM可视化的操作很方便,其实很多错误都被忽略了,结果自然是不成功了!动辄半天时间耗进去,多不值得!而且oracle的错误提示实在是%#×)#……,比如:“ORA-00963:缺少表达式!”、“ORA-04088: 触发器 'SOOBUR.TEST' 执行过程中出错”等等……实在让人是摸不着头脑!

偶的运气还是不错的,试了小半天,终于成功了^_^!

写出来和大家共享,希望老鸟们多多指教,多多纠错,希望跟偶一样的菜鸟们吸取偶的教训^_^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值