zoukankan      html  css  js  c++  java
  • 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();
            }
        }
    }
  • 相关阅读:
    SpringBoot整合阿里云OSS
    UVALive
    HDU 5794 A Simple Chess dp+Lucas
    数论
    UVALive
    UVALive
    HDU 5792 World is Exploding 树状数组+枚举
    UVALive
    UVALive
    UVALive
  • 原文地址:https://www.cnblogs.com/zydev/p/5323788.html
Copyright © 2011-2022 走看看