- 浏览: 764622 次
- 性别:
- 来自: 南京
文章分类
- 全部博客 (663)
- Eclipse&MyEclipse (40)
- PHP (3)
- Java (72)
- CSS (3)
- MySQL (35)
- Oracle (68)
- Red Hat Linux (23)
- Tomcat (26)
- Oracle10gAS (1)
- Spring (28)
- MyBatis&iBatis (13)
- JS (47)
- JQuery (23)
- Editplus (2)
- 其他 (4)
- Html (15)
- SQL (5)
- Ant (2)
- Hadoop (2)
- Servlet (9)
- Windows (11)
- Flex (1)
- CentOS Linux (7)
- Microsoft SQL Server (2)
- DB2 (3)
- Mysql char 与 varchar 区别 (0)
- excel (5)
- jsp (8)
- FreeMarker (1)
- EasyUI (5)
- WebShpere MQ (1)
- Maven2 (6)
- 浏览器缓存 (2)
- visio (1)
- XML (2)
- 物联网 (1)
- Maven (3)
- JSTL (2)
- HTTP (1)
- Fourinone (1)
- IP知识 (1)
- MyBatis (1)
- 项目管理 (2)
- office2003+2007 (1)
- DOS (1)
- JProfiler (1)
- Thinpad T440p (1)
- ActiveMQ (10)
- MongoDB (5)
- Vert.x3 (1)
- Ngnix (3)
- Spark (2)
- BigData (1)
- 性能概念公式 (1)
- RocketMQ (3)
- IT名词术语 (1)
- Java编程工具 (1)
- RabbitMQ (2)
- MetaMQ (1)
- 架构 (6)
- KafkaMQ (7)
- Redis (4)
- OAuth (1)
- Gradle (1)
- CentOS (5)
- Microsoft_Toolkit (1)
- git (5)
- IntelliJ Idea (4)
- Nginx (3)
- docker (12)
- VMware (2)
- 算法 (1)
- JDBCPool (1)
- spring-cloud (7)
- netbean (1)
- 微信小程序 (2)
- CURL (2)
- Java生成二维码 (1)
- 区块链 (2)
- 机器学习 (1)
- SpringBoot (3)
- Android (9)
- 微服务架构 (1)
- Kubernetes (2)
- OpenProject (0)
- 测试 (1)
- https (1)
- 开源许可证 (1)
- ServiceMesh (2)
- NET (0)
- .NET (1)
- TEST (1)
- iOS (2)
- thymeleaf (4)
- lombok (1)
- 浏览器设置 (1)
- 富文本编辑器 (1)
- 搜索引擎 (1)
- IT常识 (1)
- UML (0)
- Axure (1)
- appstore无法联网 (0)
- apk无法安装 (1)
- SQLServer (2)
- 卸载弹窗软件 (1)
- jenkins (1)
- TortoiseGit (1)
- eureka (1)
- ajax (1)
- spyder (0)
最新评论
简要记录存储过程语法与Java程序的调用方式
一 存储过程
首先,我们建立一个简单的表进行存储过程的测试
create table xuesheng(id integer, xing_ming varchar2(25), yu_wen number, shu_xue number); insert into xuesheng values(1,'zhangsan',80,90) insert into xuesheng values(2,'lisi',85,87)
1)无返回值的存储过程
create or replace procedure xs_proc_no is begin insert into xuesheng values (3, 'wangwu', 90, 90); commit; end xs_proc_no;
2)有单个数据值返回的存储过程
create or replace procedure xs_proc(temp_name in varchar2, temp_num out number) is num_1 number; num_2 number; begin select yu_wen, shu_xue into num_1, num_2 from xuesheng where xing_ming = temp_name; --dbms_output.put_line(num_1 + num_2); temp_num := num_1 + num_2; end;
其中,以上两种与sql server基本类似,而对于返回数据集时,上述方法则不能满足我们的要求。在Oracle中,一般使用ref cursor来返回数据集。示例代码如下:
3)有返回值的存储过程(列表返回)
首先,建立我们自己的包。并定义包中的一个自定义ref cursor
create or replace package mypackage as type my_cursor is ref cursor; end mypackage;
在定义了ref cursor后,可以书写我们的程序代码
create or replace procedure xs_proc_list(shuxue in number, p_cursor out mypackage.my_cursor) is begin open p_cursor for select * from xuesheng where shu_xue > shuxue; end xs_proc_list;
二、程序调用
在本节中,我们使用java语言调用存储过程。其中,关键是使用CallableStatement这个对象,代码如下:
String oracleDriverName = "oracle.jdbc.driver.OracleDriver" ;
|
|
// 以下使用的Test就是Oracle里的表空间
|
String oracleUrlToConnect = "jdbc:oracle:thin:@127.0.0.1:1521:orcl" ;
|
Connection myConnection = null ;
|
try {
|
Class.forName(oracleDriverName);
|
} catch (ClassNotFoundException ex) {
|
ex.printStackTrace();
|
}
|
try {
|
myConnection = DriverManager.getConnection(oracleUrlToConnect,
|
"xxxx" , "xxxx" ); //此处为数据库用户名与密码
|
|
} catch (Exception ex) {
|
ex.printStackTrace();
|
}
|
try {
|
|
CallableStatement proc= null ;
|
proc=myConnection.prepareCall( "{call xs_proc(?,?)}" );
|
proc.setString( 1 , "zhangsan" );
|
proc.registerOutParameter( 2 , Types.NUMERIC);
|
proc.execute();
|
String teststring=proc.getString( 2 );
|
System.out.println(teststring);
|
|
} catch (Exception ex) {
|
ex.printStackTrace();
|
} |
对于列表返回值的存储过程,在上述代码中做简单修改。如下
CallableStatement proc=null; proc=myConnection.prepareCall("{call getdcsj(?,?,?,?,?)}"); proc.setString(1, strDate); proc.setString(2, jzbh); proc.registerOutParameter(3, Types.NUMERIC); proc.registerOutParameter(4, OracleTypes.CURSOR); proc.registerOutParameter(5, OracleTypes.CURSOR); proc.execute(); ResultSet rs=null; int total_number=proc.getInt(3); rs=(ResultSet)proc.getObject(4);
上述存储过程修改完毕。另外,一个复杂的工程项目中的例子:查询一段数据中间隔不超过十分钟且连续超过100条的数据。即上述代码所调用的getdcsj存储过程
create or replace procedure getDcsj(var_flag in varchar2,
|
var_jzbh in varchar2,
|
number_total out number,
|
var_cursor_a out mypackage.my_cursor,
|
var_cursor_b out mypackage.my_cursor) is |
total number;
|
cursor cur is |
select sj, flag
|
from d_dcsj
|
where jzbh = var_jzbh
|
order by sj desc |
for update ;
|
last_time date ;
|
begin |
for cur1 in cur loop
|
if last_time is null or cur1.sj >= last_time - 10 / 60 / 24 then |
update d_dcsj set flag = var_flag where current of cur;
|
last_time := cur1.sj;
|
else |
select count (*) into total from d_dcsj where flag = var_flag;
|
dbms_output.put_line(total);
|
if total < 100 then |
update d_dcsj set flag = null where flag = var_flag;
|
last_time := null ;
|
update d_dcsj set flag = var_flag where current of cur;
|
else |
open var_cursor_a for |
select *
|
from d_dcsj
|
where flag = var_flag
|
and jzbh = var_jzbh
|
and zh = 'A' |
order by sj desc ;
|
number_total := total;
|
open var_cursor_b for |
select *
|
from d_dcsj
|
where flag = var_flag
|
and jzbh = var_jzbh
|
and zh = 'B' |
order by sj desc ;
|
number_total := total;
|
exit;
|
end if;
|
end if;
|
end loop;
|
select count (*) into total from d_dcsj where flag = var_flag;
|
dbms_output.put_line(total);
|
if total < 100 then |
open var_cursor_a for |
select * from d_dcsj where zh = 'C' ;
|
open var_cursor_b for |
select * from d_dcsj where zh = 'C' ;
|
else |
open var_cursor_a for |
select *
|
from d_dcsj
|
where flag = var_flag
|
and jzbh = var_jzbh
|
and zh = 'A' |
order by sj desc ;
|
number_total := total;
|
open var_cursor_b for |
select *
|
from d_dcsj
|
where flag = var_flag
|
and jzbh = var_jzbh
|
and zh = 'B' |
order by sj desc ;
|
number_total := total;
|
end if;
|
commit ;
|
end ;
|
/ |
-------------------------------------------------------------------------------------
1. 创建存储过程
create or replace procedure p_get_suporg(org_name varchar2, suporg_name out varchar2)
as
temp_suporg_name varchar2(500);
begin
select s1.suporg into temp_suporg_name from sys_org s1 where s1.orgname = org_name;
suporg_name := temp_suporg_name;
end;
2.PL/Sql调用存储过程
文件 -> 新建 -> 命令窗口 执行如命令
set serveroutput on;
/
/
declare
temp_company_name varchar2(500);
begin
p_get_company_name('test‘, temp_company_name);
dbms_output.put_line(temp_company_name);
end;
/
temp_company_name varchar2(500);
begin
p_get_company_name('test‘, temp_company_name);
dbms_output.put_line(temp_company_name);
end;
/
发表评论
-
为Orcle 创建 对标Mysql FIND_IN_SET功能的函数
2021-08-09 14:22 930-- 字段存储 以某个字 ... -
ORACLE存储过程,循环语法和游标(转)
2021-05-19 10:08 1196原作者 https://www.cnblogs.com/lg ... -
Oracle中exists替代in语句(转)
2021-05-13 13:55 713大家都知道exists的速度要比in的速度快,也知道ex ... -
各种数据库对表名长度的限制(转)
2016-05-11 15:07 2177数据库表名默认允许长度限制: SQLSERVER ... -
JDBC连接Oracle数据库(转)
2016-03-23 17:57 738Java程序访问Oracle数据库集群与非集群的不 ... -
Oracle数据库的驱动包ojdbc*.jar之间的差别(转)
2016-03-23 17:44 970classes12.jar,ojdbc14.jar,o ... -
Oracle 删除数据文件基本命令(转)
2016-03-09 17:56 1141在我们详细介绍之前,我们必须说清楚一点:Oracle不提供 ... -
Oracle 常用命令(转)
2016-03-09 12:03 434查看当前用户的缺省表空间 SQL>select u ... -
Oracle数据泵导入导出案例(转)
2016-02-18 11:13 533Oracle数据泵导入导出案例 O ... -
如何启动或关闭oracle的归档(ARCHIVELOG)模式 (转)
2016-02-17 13:35 692参考文献: http://www.eygle.com/arc ... -
电子商务平台的战略(转)
2016-02-02 15:42 629一、战略 战略,是一种从全局考虑谋划实现全局目标的规划!实现 ... -
Oracle数据泵IMPDP导入(转)
2016-02-01 16:22 859EXPDP导入 一:导入前 ... -
oracle数据泵备份(Expdp命令)[转]
2016-01-29 09:04 1071Oracle备份方式主要分为数据泵导出备份、热备份与冷备份三种 ... -
oracle 查看用户、权限、角色命令 (转)
2016-01-28 14:25 782a 查看用户、权限、角色的适用命令 1.查看所有用户: s ... -
ORA-12505, TNS:listener does not currently know of SID given in connect desc (转)
2016-01-26 13:42 960出现以上的问题是无法识别SID,解决方法如下: 1 ... -
Oracle Interval-Partition 解决Range分区大难题 (转)
2016-01-09 14:35 1096上篇博客《oracle分区》中讲了oracle的几种分区,并 ... -
Oracle 11g组合分区(转)
2016-01-06 16:52 1071一、实验目的 采用List-Range分区 ... -
oracle查看表、表字段和常用的一些命令 (转)
2016-01-06 15:05 807获取表: select table_nam ... -
sqlplus登录\连接命令、sqlplus命令的使用大全(转)
2016-01-05 18:05 2678我们通常所说的DML、DDL、DCL语句都是sql*plus ... -
Oracle11新特性——分区表功能增强 (转)
2015-12-24 09:46 736oracle11g分区表功能有所加强,新增了虚拟列分区、系统 ...
相关推荐
14. **PL/SQL与Java集成**:通过PL/SQL调用Java存储过程,实现两种技术的融合。 通过"Oracle Database 12c PL/SQL开发指南"中的实例源代码,读者可以亲手实践上述各种概念和技术,从而更深入地理解和掌握PL/SQL的...
7. **存储过程和函数**:存储过程是一组可重用的PL/SQL代码,可以在数据库中保存并按需调用,而函数则返回一个值。它们可以接受参数,提高代码复用性和性能。 8. **触发器**:触发器是在特定数据库事件(如INSERT、...
Oracle 10g PL/SQL 是Oracle数据库系统中用于创建和管理存储过程、函数、触发器等数据库对象的编程语言。本教程旨在为初学者提供一个全面的学习平台,同时也为经验丰富的开发者提供参考资料。PL/SQL是Oracle特有的...
### Oracle 9i PL/SQL程序设计笔记精要 #### PL/SQL基础知识概览 **标题与描述**:本文档围绕“Oracle 9i PL/SQL程序设计笔记”这一核心主题,深入探讨了PL/SQL语言的基础知识及其在Oracle 9i数据库环境中的应用。...
ORACLE PL/SQL是从入门到精通的专业知识,涵盖了数据库开发与管理的多个方面,包括触发器、过程、函数、软件包、异常处理、游标、循环、分支、变量使用、数据库安装等关键知识点。 触发器是数据库中用来保证数据...
2. **存储过程和函数**:这些是PL/SQL的核心组成部分,它们封装了一系列操作,可以被多次调用,提高代码复用性。书中可能包含各种示例,如自定义计算函数、处理业务逻辑的存储过程等。 3. **触发器**:当数据库中的...
1. **PL/SQL简介**:PL/SQL是Oracle数据库的内置编程语言,用于创建存储过程、函数、触发器和包。它的语法基于SQL,但增加了流程控制、异常处理和数据类型等特性。 2. **变量和数据类型**:PL/SQL支持多种数据类型...
- **PL/SQL简介**:PL/SQL(Procedural Language for SQL)是Oracle数据库的一种内嵌式过程化语言,用于增强SQL的功能。它允许在SQL查询的基础上添加控制流语句、变量定义、错误处理等特性。 - **环境搭建与配置**:...
12. **数据库对象的DDL操作**:学习如何在PL/SQL中创建、修改和删除数据库对象,如表、视图、索引和存储过程。 13. **PL/SQL与SQL的集成**:了解如何在PL/SQL中嵌入SQL语句,以及SQL语句如何与PL/SQL逻辑相互配合。...
PL/SQL是Oracle数据库中用于创建存储过程、函数、触发器、包等数据库对象的主要工具。第4版特别关注了在Oracle 11g环境下的新特性,如性能优化、错误处理和并发控制等。 1. **基础语法**:PL/SQL的基础包括声明变量...
4. **存储过程和函数**:存储过程是一组预先编译的PL/SQL语句,可以在需要时调用,减少网络通信,提高性能。函数与存储过程类似,但必须返回一个值。它们可以用于封装复杂的业务逻辑,增强代码复用性。 5. **异常...
PL/SQL是Oracle数据库特有的编程语言,它结合了SQL的查询能力与过程式编程语言的功能,使得数据库管理、数据处理和业务逻辑实现更为高效。本书针对那些希望提升PL/SQL编程技能,设计和开发复杂数据库解决方案的...
PL/SQL是Oracle数据库系统中的一个关键组成部分,它是一种过程化语言,专为数据库操作设计。这个"PL/SQL最新中文手册"显然是一份详细解释PL/SQL 7.0版本的指南,对于学习和精通Oracle数据库编程至关重要。以下是手册...
Oracle PL/SQL是一种强大的编程语言,它将SQL与过程编程语言的特性相结合,为数据库开发提供了丰富的功能。在Oracle数据库环境中,PL/SQL是开发高效、可靠和可维护的数据库应用程序的关键工具。以下是对"Oracle PL/...
1. **编程能力**:PL/SQL允许编写包含控制结构(如循环、条件语句)和异常处理的程序块,这些块可以存储在数据库中并按需调用,提高了数据库应用的灵活性和复杂性。 2. **数据处理**:通过PL/SQL,用户可以直接对...
Oracle 11g PL/SQL提供了丰富的功能集,包括数据类型、变量、常量、表达式、流程控制语句、异常处理机制以及存储过程和函数。 ### 2. 数据类型 PL/SQL支持多种数据类型,包括数值型、字符型、日期时间型、布尔型、...
PL/SQL,全称Procedural Language/Structured Query Language,是Oracle数据库提供的一种过程化编程语言,它结合了SQL的查询功能和传统编程语言的控制结构,使得数据库管理和应用程序开发更为高效和灵活。...
8. **存储过程与函数**:PL/SQL中的存储过程和函数是数据库中的可重用代码块,可以提高性能和安全性。它们可能在多个PDF文件中被提及,详细阐述了如何创建、调用和优化这些程序单元。 9. **触发器**:触发器是在...
Web PL/SQL报表制作过程是一种将数据库数据转化为用户友好、可编辑的HTML报表的方法,它结合了HTML语言和PL/SQL编程,使得开发者能够创建直观且实用的在线报表。以下是对这一过程的详细说明: 1. **制作报表模板**...
这篇“Oracle经典资料及PL/SQL使用指南”的英文版,将帮助学习者深入理解Oracle数据库的基础概念以及PL/SQL的高级用法。 一、Oracle数据库基础 1. 数据库架构:Oracle数据库采用多层架构,包括物理存储层、逻辑...