案例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();
}
}
}

pl/sql编程2-综合的更多相关文章

  1. ORACLE PL/SQL编程详解

    ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设 ...

  2. Oracle数据库编程:PL/SQL编程基础

    2.PL/SQL编程基础: PL/SQL块:        declare        定义部分        begin        执行部分        exception        异 ...

  3. pl/sql编程

    body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...

  4. [强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)

    原文:[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!) [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天 ...

  5. ORACLE PL/SQL编程之八:把触发器说透

    原文:ORACLE PL/SQL编程之八:把触发器说透 ORACLE PL/SQL编程之八: 把触发器说透 大家一定要评论呀,感谢!光发表就花了我将近一个下午. 本篇主要内容如下: 8.1 触发器类型 ...

  6. [推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼、百战不殆)

    原文:[推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼.百战不殆) [推荐]ORACLE PL/SQL编程之五: 异常错误处理(知已知彼.百战不殆) 继上三篇:ORACLE PL/S ...

  7. ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)

    原文:ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) ORACLE PL/SQL编程之六: 把过程与函数说透(穷追猛打,把根儿都拔起!)   继上篇:ORACLE P ...

  8. [推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆)

    原文:[推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆) [推荐]ORACLE PL/SQL编程详解之三: PL/SQL流程控制语句(不给规则,不成方圆) ...

  9. [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到)

    原文:[推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) [推荐]ORACLE PL/SQL编程之四: 把游标说透(不怕做不到,只怕想不到) 继上两篇:ORACLE PL ...

  10. 【强烈强烈推荐】《ORACLE PL/SQL编程详解》全原创(共八篇)--系列文章导航

    原文:[强烈强烈推荐]<ORACLE PL/SQL编程详解>全原创(共八篇)--系列文章导航 <ORACLE PL/SQL编程详解> 系列文章目录导航 ——通过知识共享树立个人 ...

随机推荐

  1. VxWorks中logMsg与printf的区别

    printf( ) - write a formatted string to the standard output stream (ANSI). logMsg( ) does not actual ...

  2. FreeRTOS 低功耗之停机模式

    以下转载自安富莱电子: http://forum.armfly.com/forum.php STM32F103 如何进入停机模式在 FreeRTOS 系统中,让 STM32 进入停机模式比较容易,调用 ...

  3. Message Delivery Semantics

    4.6 Message Delivery Semantics Now that we understand a little about how producers and consumers wor ...

  4. 【WPF/MVVM】把鼠标事件写到Controller层

    要使用Mouse Event,最快捷的方法便是前台控件直接绑定事件,然后再后台代码中实现. 在MVVM中,View层的后台代码无法调用Contrller层的函数.(反过来可以Controller –& ...

  5. Spring使用facotry-method创建单例Bean总结<转>

       阅读目录 1 最原始的实现单例模式的方法(存在线程不安全): 2 通过关键字Synchronized强制线程同步 3 通过静态内部类进行单例 通过spring的factory-method来创建 ...

  6. Drupal的目录结构

    ①.includes 文件夹 存放Drupal程序头文件. Drupal的一些函数和变量的定义,均可在此文件夹下的文件中找到.这 些文件都是以.inc结尾的. ②.misc文件夹 Drupal所用的其 ...

  7. json_decode() expects parameter 1 to be string, object given

    $data = Weann\Socialite\Facades\Socialite::driver('wechat')->user();//是字符串 $data=json_encode($dat ...

  8. 15款很棒的 JavaScript 开发工具

    在开发中,借助得力的工具可以事半功倍.今天,我爱互联网向大家分享最新收集的15款非常有用的 javascript 开发工具. TestSwarm: Continious & Distribut ...

  9. OpenMediaVault的OwnCloud扩展不支持NTFS格式硬盘

    来源https://forum.openmediavault.org/index.php/Thread/15510-OwnCloud-Operation-not-supported-setfacl/ ...

  10. android 编译 app

    有些编写的app需要放到android的源码中进行编译.放置的路径packages/apps/ 编译方法,参考 http://blog.csdn.net/luoshengyang/article/de ...