Oracle存储过程

    技术2025-12-23  4

    好久都没有写过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); }

    最新回复(0)