好久都没有写过Oracle存储过程了,一般写查询语句比较多,自己就试着写了一下插入、删除、修改记录的存储过程。
插入:
CREATE OR REPLACE Procedure p_insert_t_stu --存储过程名称 ( p_stuid in Number, p_stuname in Nvarchar2, p_stusex in Nvarchar2, p_stuadd in Nvarchar2 ) as BEGIN insert into t_stu values (p_stuid,p_stuname,p_stusex,p_stuadd); commit; end;
删除:
CREATE OR REPLACE Procedure p_delete_t_stu --存储过程名称( p_stuid in Number, p_msg Out Nvarchar2) Isflag Integer := 1;v_stuid Number; Begin Select flag Into v_stuid From t_stu Where stuid=p_stuid;Delete t_stuWherestuid=p_stuid; commit;If flag=1 Then Begin p_msg:='删除成功'; End; End If;Exception When Others Then p_msg:=Sqlerrm || ',' || '删除失败'; END;
修改:
CREATE OR REPLACE Procedure p_update_t_stu --存储过程名称 ( p_stuid in Number, p_stuname in Nvarchar2, p_stusex in Nvarchar2, p_stuadd in Nvarchar2 ) as BEGIN Update t_stu Set stuname=p_stuname,stusex=p_stusex,stuadd=p_stuadd Where stuid=p_stuid; commit; end;
有进要通过jdbc调用存储过程,来说一下怎样来实现? 在我见过的有两种情况: 1)返回一个结果集(ResultSet)。 2)返回一个特定的值。 下面来详细的说明。 1)返回一个结果集(ResultSet),这种类似通常的处理结果集 如果事先就有一个类似如下的procedure
CREATE PROCEDURE getShipQuantity @jsid int AS SELECT jf_js_id,SUM(jf_ship_quantity) AS shipqty FROM tjobsheet_finish f WHERE (jf_js_id=@jsid) GROUP BY jf_js_id
那么我们将通过如下的代码来调用
String sql = "{ call getShipQuantity(?) }"; Connection con = getSession().connection();//通过hibernate得到的连接 ResultSet rs = null; BigDecimal shipQuantity = new BigDecimal(0); try{ CallableStatement cs = con.prepareCall(sql); cs.setInt(1,jsoId);//设置输入参数 rs = cs.executeQuery();//返回结果集 if(rs.next()){ shipQuantity = new BigDecimal(rs.getDouble(2)); } logger.debug("shipQuantity --------------------- "+shipQuantity); }catch(Exception e){ logger.debug(e); }
2)返回一个特定的值。也就是说,在procedure的定义中已经用output输出参数了。请看下面的proceduer
create procedure getSingleWgt @@singleWgt numeric(8,3) output,@jsnum varchar(11) = '0000-0480' as declare @stwgt numeric(8,3) select @stwgt = sum(b.stwgt) from js as a inner join jsactdtl as b on a.jsnum = b.jsnum where a.completion = 1 and b.stflag = 22 and a.jsnum = @jsnum select @@singleWgt = (@stwgt/orderedqty) from js where jsnum = @jsnum 那么我们将通过如下的代码来调用String sql = "{ call getSingleWgt(?,?) }"; Connection con = getSession().connection();//得到connection try{ CallableStatement cs = con.prepareCall(sql);//通过它来执行sql cs.registerOutParameter(1,java.sql.Types.FLOAT);//注册输出参数 cs.setString(2,shipment.getJsnum());//指出输入参数 if(cs.execute()){//执行 float output = cs.getFloat(1);//返回值 } }catch(Exception e){ logger.debug(e); }
