pl/sql编程2-综合

案例1,要求:可以向book表添加书,并通过Java程序调用该过程1.1 创建表

create table book(bookId number,bookName varchar2(20),publishHosuse varchar2(20));

1.2 编写过程,无返回值

create or replace procedure test_pro9(tbookId number,tbookName varchar2,tpublishHouse varchar2) is
begin
  insert into book values(tbookId,tbookName,tpublishHouse);
end;

在Java中调用

package com.oracle;
import java.sql.*;
public class TestPaging {
    public static void main(String args[]){
        try {
            //1.加载驱动
            Class.forName("oracle.jdbc.driver.OracleDriver");
            //2.得到链接
            Connection ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:mydev","scott","tiger");
            //3.创建CallableStaement
            CallableStatement cs=ct.prepareCall("{call test_pro9(?,?,?)}");
            //4.给问号赋值
            cs.setInt(1,1);
            cs.setString(2,"笑傲江湖");
            cs.setString(3,"人民出版社");
            //5.执行
            cs.execute();
            //6.关闭资源
            cs.close();
            ct.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

1.3创建存储过程,有返回值

--in 表示输入,默认就是in,out是输出
create
or replace procedure test_pro10(tId in number,tname out varchar2) is begin select bookName into tname from book where bookId=tId; end;

在Java中调用

package com.oracle;
import java.sql.*;
public class TestPaging {
    public static void main(String args[]){
        try {
            //1.加载驱动
            Class.forName("oracle.jdbc.driver.OracleDriver");
            //2.得到链接
            Connection ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:mydev","scott","tiger");
            //3.创建CallableStaement
            CallableStatement cs=ct.prepareCall("{call test_pro10(?,?)}");
            //4.给问号赋值
            cs.setInt(1,1);
            cs.registerOutParameter(2,oracle.jdbc.OracleTypes.VARCHAR);
            //5.执行
            cs.execute();
            String bookname=cs.getString(2);
            System.out.println("1号书的名字是:"+bookname);
            //6.关闭资源
            cs.close();
            ct.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

1.4创建存储过程,有返回值,并且是个结果集

--建立一个包
create or replace package test_pck2 as 
type test_cursor is ref cursor;
end test_pck2;

--建立一个存储过程
create procedure test_pro11(tNo in number,t_cursor out test_pck2.test_cursor) is 
begin
  open t_cursor for select * from myemp where deptno=tNo;
  end;

  

在Java中调用

package com.oracle;
import java.sql.*;
public class TestPaging {
    public static void main(String args[]){
        try {
            //1.加载驱动
            Class.forName("oracle.jdbc.driver.OracleDriver");
            //2.得到链接
            Connection ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:mydev","scott","tiger");
            //3.创建CallableStaement
            CallableStatement cs=ct.prepareCall("{call test_pro11(?,?)}");
            //4.给问号赋值
            cs.setInt(1,10);
            cs.registerOutParameter(2,oracle.jdbc.OracleTypes.CURSOR);
            //5.执行
            cs.execute();
            //6.得到结果集
            ResultSet rs=(ResultSet)cs.getObject(2);
            while(rs.next()){
                System.out.println(rs.getInt(1)+" "+rs.getString(1));
            }
            //7.关闭资源
            cs.close();
            ct.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

案列2,编写分页的过程

要求:输入表名,每页显示记录数,当前页,返回总记录数,总页数和返回结果集

--要求:输入表名,每页显示记录数,当前页,返回总记录数,总页数和返回结果集
--创建一个包,定义一个游标
create or replace package test_pck2 as
type test_cursor is ref cursor;
end test_pck2;


create or replace procedure test_pro12
(tableName in varchar2,  --表名
pageCount in number,      --每页记录数
pageNow in number,       --当前页
allRows out number,       --总记录数
allPages out number,       --总页数
p_cursor out test_pck2.test_cursor   --返回的结果集
) is 
--定义部分
--定义两个整数
v_begin number:=(pageNow-1)*pageCount+1;
v_end number:=pageNow*pageCount;
--定义SQL语句,字符串
v_sql varchar2(1000);
begin
  v_sql:='select * from (select a1.*,rownum rn from (select * from '||tableName||') a1 where rownum<='||v_end||') where rn>'||v_begin;
 --把游标和SQL关联起来 
  open p_cursor for v_sql;
  --计算allRows
 v_sql:='select count(*) from '||tableName; 
 execute immediate v_sql into allrows;
 --计算allPages,注意取模的函数的写法
   if mod(allRows,pageCount)=0 then
   allPages:=allRows/pageCount;
   else
   allPages:=allRows/pageCount+1;
   end if;
 --关闭游标
 --close p_cursor;
end;

使用Java测试

package com.oracle;
import java.sql.*;
public class TestPaging {
    public static void main(String args[]){
        try {
            //1.加载驱动
            Class.forName("oracle.jdbc.driver.OracleDriver");
            //2.得到链接
            Connection ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:mydev","scott","tiger");
            //3.创建CallableStaement
            CallableStatement cs=ct.prepareCall("{call test_pro12(?,?,?,?,?,?)}");
            //4.给问号赋值
            cs.setString(1,"emp");
            cs.setInt(2,5);
            cs.setInt(3,1);
            //注册总记录数
            cs.registerOutParameter(4,oracle.jdbc.OracleTypes.INTEGER);
            //注册总页数
            cs.registerOutParameter(5,oracle.jdbc.OracleTypes.INTEGER);
            //注册返回的结果集
            cs.registerOutParameter(6,oracle.jdbc.OracleTypes.CURSOR);
            //5.执行
            cs.execute();
            //取出总记录数
            int rowNum=cs.getInt(4);
            //取出总页数
            int allCount=cs.getInt(5);
            ResultSet rs=(ResultSet)cs.getObject(6);
            //取出结果
            System.out.println("总记录数: "+rowNum);
            System.out.println("总页数: "+allCount);
            while(rs.next()){
                System.out.println("编号:"+rs.getInt(1)+"名字: "+rs.getString(2));   //注意这里的数字1,2分表代表表中的1,2列
            }
            //7.关闭资源
            cs.close();
            ct.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
原文地址:https://www.cnblogs.com/zydev/p/5323788.html