存储过程 --- 2 --- 结合代码案例

来源:互联网 发布:量化投资python为工具 编辑:程序博客网 时间:2024/06/04 01:23

--1.无参数存储过程

--对应的存储过程
create or replace procedure sequence_proc1 AS
 RES_ORDER_NO VARCHAR2(22);
begin
 --delete dept where deptno='11';
 --select * from dept where deptno='11';
 --任意表中插入一个数据或增加改变一个数字,调用后用于验证存储过程运行了
 insert into dept(deptno) values('11');
 commit;
 SELECT TO_CHAR(SYSDATE, 'YYMMDD') into RES_ORDER_NO FROM DUAL;
dbms_output.put_line(RES_ORDER_NO);
END;
--删除存储过程
drop procedure sequence_proc1 ;
--编写 PL/SQL块验证过程:查看存储过程的运行->在PL/SQL工具中窗口中的输出页面查看输出结果
begin
sequence_proc1;

end;

public void storedProcedureTest1() throws SQLException, ClassNotFoundException {    //JDBC调用存储过程: CallableStatement在Java里面调用存储过程,写法那是相当的固定:    Class.forName("oracle.jdbc.driver.OracleDriver");    Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@User-PC:1521:XE","scott","tiger");    //sequence_proc1是要调用的存储过程的名字    CallableStatement cstmt = conn.prepareCall("{call sequence_proc1}");    //执行    cstmt.execute();    //用完后关闭,后开先关    if(cstmt != null){    cstmt.close();    }    if(conn != null){        conn.close();    }}
--2.有参数返回的存储过程
--对应的存储过程
create or replace procedure sequence_proc2(RES_ORDER_NO OUT VARCHAR2) AS
 RES_ORDER_NO1 VARCHAR2(22);
begin
 SELECT TO_CHAR(SYSDATE, 'YYMMDD') as RES_ORDER_NO1 into RES_ORDER_NO FROM DUAL;
END;
--删除存储过程
drop procedure sequence_proc2 ;
--编写 PL/SQL块验证过程:查看存储过程的运行->在PL/SQL工具中窗口中的输出页面查看输出结果
declare
RES_ORDER_NO varchar2(20);
begin
sequence_proc2(
RES_ORDER_NO);
Dbms_output.put_line('出库日期:'||RES_ORDER_NO);
end;

public void storedProcedureTest2() throws SQLException, ClassNotFoundException {    //JDBC调用存储过程: CallableStatement在Java里面调用存储过程,写法那是相当的固定:    Class.forName("oracle.jdbc.driver.OracleDriver");    Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@User-PC:1521:XE","scott","tiger");    //sequence_proc2是要调用的存储过程的名字,存储过程的1个参数,用1个?号占位符代替*其余地方写法固定    CallableStatement cstmt = conn.prepareCall("{call sequence_proc2(?)}");    /**     * 告诉JDBC,这些个参数,哪些是输出参数,输出参数的类型用java.sql.Types来指定     * 下面的意思是,     * 第1个?是输出参数,类型是VARCHAR的     * Types后面具体写什么类型,得看你的存储过程参数怎么定义的     * */    cstmt.registerOutParameter(1, Types.VARCHAR);    //执行    cstmt.execute();    //把第1个参数的值当成String类型拿出来        String dateString = cstmt.getString(1);        System.out.println(dateString);    //用完后关闭,后开先关        if(cstmt != null){    cstmt.close();    }    if(conn != null){        conn.close();    }}
--3.仅有输入参数的存储过程
--对应的存储过程
create or replace procedure sequence_proc3(RES_ORDER_NO IN dept.dname%TYPE) AS
 DEPTNO VARCHAR2(14);
begin
 --delete dept where deptno='11';
 --select * from dept where deptno='10';
 --任意表中插入一个数据或改变一个值,调用后用于验证存储过程运行了
 UPDATE DEPT SET DNAME=RES_ORDER_NO WHERE DEPTNO='10';
 commit;
dbms_output.put_line(RES_ORDER_NO);
END;
--删除存储过程
drop procedure sequence_proc3 ;
--编写 PL/SQL块验证过程:查看存储过程的运行->在PL/SQL工具中窗口中的输出页面查看输出结果
declare
RES_ORDER_NO varchar2(20);
begin
 RES_ORDER_NO:='XIAOFENG';
 sequence_proc3(RES_ORDER_NO);
end;

public void storedProcedureTest3() throws SQLException, ClassNotFoundException {    //JDBC调用存储过程: CallableStatement在Java里面调用存储过程,写法那是相当的固定:    Class.forName("oracle.jdbc.driver.OracleDriver");    Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@User-PC:1521:XE","scott","tiger");    //sequence_proc3是要调用的存储过程的名字,存储过程的1个参数,用1个?号占位符代替*其余地方写法固定    CallableStatement cstmt = conn.prepareCall("{call sequence_proc3(?)}");    /**     * 在我这里第1个?是输入参数     * 下面是设置他们的值,第一个设为"iloveyou"     */    cstmt.setString(1, "iloveyou");    //执行    cstmt.execute();    //用完别忘给人家关了,后开的先关    if(cstmt != null){    cstmt.close();    }    if(conn != null){        conn.close();    }}
--4.既有输入参数又有输出参数的存储过程
create or replace procedure sequence_proc4(param1 IN number,param2 IN number,param3  out number,param4 IN OUT dept.dname%TYPE) AS
begin
 param3 := param1 + param2 ;
 --delete dept where deptno='11';
 --select * from dept where deptno='10';
 --任意表中插入一个数据或改变一个值,调用后用于验证存储过程运行
 UPDATE DEPT SET DNAME=param4 WHERE DEPTNO=param3;
 commit;
  dbms_output.put_line(param3);
  dbms_output.put_line(param4);
 EXCEPTION
 WHEN OTHERS THEN
   param3 := 01;
   param4  := '失败!';
   ROLLBACK;
END;
--删除存储过程
drop procedure sequence_proc4 ;
--编写 PL/SQL块验证过程:查看存储过程的运行->在PL/SQL工具中窗口中的输出页面查看输出结果
declare
param1 number;
param2 number;
param3 number;
param4 VARCHAR2(14);
begin
 param1:=0;
 param2:=10;
 param4:='abccc';
 sequence_proc4(param1,param2,param3,param4);
end;

public void storedProcedureTest4() throws SQLException, ClassNotFoundException {    //JDBC调用存储过程: CallableStatement在Java里面调用存储过程,写法那是相当的固定:    Class.forName("oracle.jdbc.driver.OracleDriver");    Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@User-PC:1521:XE","scott","tiger");    //sequence_proc4是要调用的存储过程的名字,存储过程的4个参数,用4个?号占位符代替*其余地方写法固定    CallableStatement cstmt = conn.prepareCall("{call sequence_proc4(?,?,?,?)}");    /**     * 告诉JDBC,这些个参数,哪些是输出参数,输出参数的类型用java.sql.Types来指定     * 下面的意思是,     * 第3个?和第4个?是输出参数,类型是INTEGER与VARCHAR     * Types后面具体写什么类型,得看你的存储过程参数怎么定义的     * */    cstmt.registerOutParameter(3, Types.INTEGER);    cstmt.registerOutParameter(4, Types.VARCHAR);    /**     * 在我这里第1个?和第2个?是输入参数,第3个是输出参数,第4个既输入又输出     * 下面是设置他们的值,第一个设为0,第二个设为00,第4个设置为"iloveyou"     * 没设第3个,因为它是输出参数*/    cstmt.setInt(1, 0);    cstmt.setInt(2, 10);    cstmt.setString(4, "iloveyouiloveyouiloveyouiloveyouiloveyouiloveyou");    //执行    cstmt.execute();    //把第3个参数的值当成int类型拿出来    int three = cstmt.getInt(3);    //把第4个参数的值当成int类型拿出来    String four = cstmt.getString(4);    System.out.println("修改了id为" + three + "的姓名,修改为了:" + four);    //用完别忘给人家关了,后开的先关    if(cstmt != null){    cstmt.close();    }    if(conn != null){        conn.close();    }}

希望对你有帮助,祝你有一个好心情,加油!

若有错误、不全、可优化的点,欢迎纠正与补充;转载请注明出处!

1 0
原创粉丝点击