2008年11月13日星期四

Oracle调用存储过程添加数据记录(包括唯一性判断)

继续我的文章之旅:
最近一直在Oracle打交道,当然我们也是一些调用采集并不涉及到内部机制。以前听老师说ICBC(爱存不存)后台数据整理,请了一洋鬼子Oracle专家,一小时上万刀!!!听了都让人心痒痒^_^。说完废话切入正题:在JAVA中调用Oracle存储过程往数据表中添加记录,同时在SQL语句中完成(Name)唯一性判断,若不存在相同Name就插入记录否则操作提示已存在相同记录。
整个原理比较简单,为了让需要的人(那些Rookies)知道个究竟我通过实例的方式来讲解。希望对你们有所帮助。
简单的例子,简单言语,让你简单的理解原理,Here we go…
首先你得书写你的SQL语句(具体代码我放在源码件中打包上传),先创建表Toy(用于插入数据使用),然后针对Toy表再创建Procedure(checkAddToy)用来实现想Toy表插入记录的功能,同时在SQL语句中进行Name(Toy表中的一属性)的唯一性判断。
因为要涉及到过程的使用,所以你对Procedure是什么?怎么运用?如何编写得有一定的了解,这个就不多说了SQL语言的基本知识大家网上自学吧。简单看看这个procedure吧:
create or replace procedure
( p_tid in toy.tid%type, //IN|OUT参数 需要和表中属性类型一致 不然Oracle
p_tname in toy.tname%type, //会报错,比较关键的是定义OUT参数 此参数为在java
p_address in toy.address%type, // 程序会被接收用于判断之用。
p_price in toy.price%type,
p_rebate in toy.rebate%type,
ResultNum out number)
is
id varchar2(10); //SQL内部变量
begin
ResultNum:=0;
select tid into id from toy where tname=p_tname; //这里用于判断是否已经存在相同name
if id is not null then
ResultNum:=1;
else
ResultNum:=2;
return;
end if;
exception
when no_data_found then //这里需要说明一下 本来应该在else里实现插入数据,
insert into toy(tid,tname,address,price,rebate) //可是每当不存在相同name时(即select tid into id from toy where tname=p_tname;此语句返回空值时)
values(p_tid,p_tname,p_address,p_price,p_rebate); //它总是返回异常。试了
dbms_output.put(''); //好几次 都没解决。于是将插入功能移到异常处理部分,同
//样可以实现。只是逻辑上不太讲的过去。哪位仁兄帮改下。。
end;
过程创建完毕,然后就是前台java程序的调用了,写一个简单的类,测试一下就OK 啦:
public class TestMain
{

static Connection conn = null;
static Statement stmt = null;
static ResultSet rs = null;
public static void main(String[] args) {
String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@10.10.40.15:1521:xt";
String user = "user17";
String passwd = "user17";
try
{
Class.forName(driver);
conn = DriverManager.getConnection(url, user, passwd);
//stmt = conn.createStatement();
String tid="F000010";
String tname="jummy";
String address="Shanghai";
int price=10;
float rebate=(float) 0.2;
CallableStatement proc;
try {
proc = conn.prepareCall("{call heckAddToy(?,?,?,?,?,?)}");
proc.setString(1,tid);
proc.setString(2, tname);
proc.setString(3,address);
proc.setInt(4,price);
proc.setFloat(5, rebate);
proc.registerOutParameter(6,OracleTypes.NUMBER);//这里就是获得过程的OUT参数
proc.execute();
int a1=proc.getInt(6);
if(a1==1){
System.out.print("插入失败");
}else{
System.out.print("插入成功");
} catch (SQLException e) {
e.printStackTrace();
}
简单看下输出结果:
if id is not null then
ResultNum:=1;过程中我们是声明不为空 就是存在已有Name时为1,否则为0.然后insert记录。
测试数据:F000010,jummy, Shanghai, 10, 0.2
Toy表结构:

插入F000010之前的数据:

插入之后(因为不存在TNAME=jummy的记录所以插入成功)

当你再插入一条NAME为jummy的记录时,控制台就提示 。整个过程是在SQL里完成。
后记:整个程序简单演示一遍如何创建存储过程以及如何使用,这个懂了以后碰到过程的问题估计也就差不多了。当然不同功能的过程编写还是需要花点功夫的。整个程序我会传在附件里,需要的可以下载参考。(Original Article @All rights reserved)

没有评论: