Oracle存储过程和自定义函数笔记
学习地址:https://www.imooc.com/learn/370
存储过程和存储函数定义:指存储在数据库中供所有用户程序调用的子程序叫做存储过程
、存储函数。
相同点:完成特定功能的程序。
区别:是否用return语句返回值。
语法:
create [or replace] procedure 过程名(参数列表)
as
plsql程序体
create or replace procedure sayhelloworld
as
--说明部分
begin
dbms_output.put_line('Hello World');
end;
调用存储过程:
1.exec sayhelloworld();
2.begin
sayhelloworld();
sayhelloworld();
end;
1 exec 存储过程名();2 begin 存储过程名();end /
创建带参数的存储过程:
-- 给指定的员工涨100块钱的工资,并且打印涨前后涨后的薪水 eno:员工号
create or replace procedure raisesalary(eno in number) -- in 这是一个输入参数
as
-- 定义一个变量保存涨前的薪水
psal emp.sal%type;
begin
-- 得到员工涨前的薪水
select sal into psal from emp where empno=eno;
-- 给该员工涨100块钱
update emp set sal=sal+100 where empno=eno;
-- 一般,这里不需要 commit ! 也不需要 rollback
-- 注意:一般不在存储过程或者存储函数中,commit 和 rollback
-- 打印
dbms_output.put_line('涨前:'||psal||',涨后:'||(psal+100));
end;
/
-- 调用:
begin
raisesalary(7839);
raisesalary(7566);
end;
/
一般不在存储过程中提交或者回滚,大多时间是在调用一次或者多次的时候提交或者回滚
,这样会防止出现意外情况。
创建存储函数的语法:
示例:根据员工号,查询员工年收入。
create or replace function queryempincom(eno in numbr)
return number
as
--定义变量保存员工的薪水和奖金
psal emp.sal%type;
pcomm emp.comm%type;
begin
--得到该员工的月薪和奖金
select sal,comm into pasl,pcomm from emp where empno=eno;
--直接返回年收入
return psal*12+nvl(pcomm,0);
end;
存储过程和存储函数都可以通过Out指定一个或多个输出参数。我们可以利用out参数,在
过程和函数中实现返回多个值。
存储过程可以通过out参数返回值。
什么时候用存储过程、存储函数?
一般原则:如果只有一个返回值,用存储函数;否则,用存储过程。
示例:
create or replace procedure queryempinfor(eno in number,pename out varchar2,
psal out number,pjob out varchar2)
as
begin
-- 得到该员工的姓名、月薪和职位
select ename,sal,empjob into pename,psal,pjob from emp where empno=eno;
end;
使用JDBC连接数据库:
public class JDBCUtile{
private static String driver="orable.jdbc.OracleDriver";
private static String url="jdbc:oracle:thin:@192.168.56.101:1521:orcl";
private static String user="scott";
private static String password="tiger";
// 注册数据库的驱动
static{
try{
Class.forName(driver);
// --> DriverManager.registerDriver(driver);
}catch(ClassNotFoundException e){
throw new ExceptionInInitializerError(e);
}
} // 获取数据库连接
public static Connection getConnection(){
try{
return DriverManager.getConnection(url,user,password);
}catch(SQLException e){e.printStackTrace(); }
return null;
} // 释放数据库的资源
public static void release(Connection conn,Statement st,ResultSet rs){
if(rs != null){try{ rs.close();}catch(SQLException e){e.printStackTrace();}finally{rs=null;}}
if(st != null){try{st.close();}catch(SQLException e){e.printStackTrace();}finally{st=null;}}
if(conn != null){try{conn.close();}catch(SQLException e){e.printStackTrace();}finally{conn=null;}}
}
}
在应用程序中访问存储过程和存储函数
使用CallachleStatement接口
public void testProcedure(){
//{call <procedure-name>[(<arg1>,<arg2>,...)]}
String sql="call queryempinform(?,?,?,?)";
Connection conn=null;
CallableStatement call=null;
try{
// 得到一个连接
conn=JDBCUtils.getConnection();
// 通过连接创建出statement
call=conn.prepareCall(sql);
// 对于in参数,需赋值,对于out参数,需要申明
call.setInt(1, 7839); // 设置第一个?为 7839
call.registerOutParameter(2, OracleTypes.VARCHAR);
call.registerOutParameter(3, OracleTypes.NUMBER);
call.registerOutParameter(4, OracleTypes.VARCHAR);
// 执行调用
call.execute();
// 取出结果
String name=call.getString(2);
double sal=call.getDouble(3);
String job=call.getString(4);
System.out.println(name+"\t"+sal+"\t"+job);
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCUtils.release(conn,call,null);
}
}
在out参数中使用光标:
包头:
CREATE OR REPLACE PACKAGE MYPACKAGE AS
type empcursor is ref cursor;
procedure queryEmpList(dno in number,empList out empcursor);
END MYPACKAGE;
包体(需要实现包头中声明的所有方法,包括存储函数、存储方法):
CREATE OR REPLACE PACKAGE BODY MYPACKAGE AS
procedure queryEmpList(dno in number,empList out empcursor) AS
BEGIN
--打开光标
open empList for select * from emp where deptno=dno;
END queryEmpList;
END MYPACKAGE;
-- 使用desc查看程序包的结构
desc MYPACKAGE
所有存储函数的功能都可以有存储过程来代替,为什么在oracle数据库中依然保留存储函数?
原因:数据库版本升级所造成,版本升级最基本的要求就是要向前向下兼容,在oracle数据库最早的版本中是有存储过程和存储函数的区别。如果新版本不支持存储函数,那么老的数据库中若存在存储函数就可能运行出错。
Oracle存储过程和自定义函数笔记的更多相关文章
- Oracle存储过程和自定义函数
新博客文章链接,欢迎大家评论探讨 概述 存储过程和存储函数是指存储在数据库中供所有用户程序调用的子程序叫存储过程.存储函数. 异同点: 存储过程和存储函数的相同点:完成特定功能的程序. 存储过程和存储 ...
- MySQL存储过程/存储过程与自定义函数的区别
语法: 创建存储过程: CREATE [definer = {user|current_user}] PROCEDURE sp_name ([ proc_parameter [,proc_parame ...
- (转)MySQL存储过程/存储过程与自定义函数的区别
转自:http://www.cnblogs.com/caoruiy/p/4486249.html 语法: 创建存储过程: CREATE [definer = {user|current_user}] ...
- oracle存储过程和存储函数&触发器
oracle存储过程和存储函数 指存储在数据库中供所有用户程序调用的子程序叫存储过程,存储函数 存储过程和存储函数的相同点:完成特定功能的程序 存储过程和存储函数的区别:是否用return语句返回值 ...
- 【存储过程】MySQL存储过程/存储过程与自定义函数的区别
---------------------------存储过程-------------------- 语法: 创建存储过程: CREATE [definer = {user|current_user ...
- MySQL存储过程和自定义函数、Navicat for mysql、创建存储过程和函数、调用存储过程和函数的区别
1 MySQL存储过程和函数 过程和函数,它们被编译后保存在数据库中,称为持久性存储模块(Persistent Stored Module,PSM),可以反复调用,运行速度快. 1.1 存储过程 存储 ...
- SQL中存储过程和自定义函数的区别
存储过程: 存储过程可以使得对数据库的管理.以及显示关于数据库及其用户信息的工作容易得多.存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理.存储过程存储在 ...
- SQL中存储过程和自定义函数的区别(转载)
存储过程: 存储过程可以使得对数据库的管理.以及显示关于数据库及其用户信息的工作容易得多.存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理.存储过程存储在 ...
- Jpa 重写方言dialect 使用oracle / mysql 数据库自定义函数
在使用criteria api进行查询时 criteriaBuilder只提供了一个部分标准的sql函数,但当我们需要使用oracle特有的行转列函数wm_concat或 mysql特有的行转列函数g ...
随机推荐
- JavaWeb基础知识总结
JavaWeb基础知识总结. 1.web服务器与HTTP协议 Web服务器 l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. l Internet上供 ...
- 【err】VIDEOIO ERROR: V4L: index 0 is not correct!Unable to connect to camera
前言 新到手一块板子,程序编译成功之后,运行出现错误,不能连接到摄像头. 问题 VIDEOIO ERROR: V4L: index is not correct! Unable to connect ...
- 特征选择之Chi卡方检验
特征选择之Chi卡方检验 卡方值越大,说明对原假设的偏离越大,选择的过程也变成了为每个词计算它与类别Ci的卡方值,从大到小排个序(此时开方值越大越相关),取前k个就可以. 针对英文纯文本的实验结果表明 ...
- Oracle使用笔记(一)
目录 一.创建表: 二.编辑表数据: 三.Oracle基本数据类型: (一) 字符串类型 1.1:CHAR类型 CHAR(size [BYTE | CHAR]) 1.2: NCHAR类型 1.3 VA ...
- POJ3090 Visible Lattice Points (数论:欧拉函数模板)
题目链接:传送门 思路: 所有gcd(x, y) = 1的数对都满足题意,然后还有(1, 0) 和 (0, 1). #include <iostream> #include <cst ...
- redis和memcache的区别(总结)
1.Redis和Memcache都是将数据存放在内存中,都是内存数据库.不过memcache还可用于缓存其他东西,例如图片.视频等等: 2.Redis不仅仅支持简单的k/v类型的数据,同时还提供lis ...
- HPU第四次积分赛-L:A Winged Steed(完全背包)
A Winged Steed 描述 有n种千里马,每一种都有若干匹,第i种马的颜值ai,价格di.现有m个牧马人要去挑选千里马,每一位牧马人对马的颜值都有要求:{所选马的颜值总和} ⩾Ai.现在 ...
- 动手动脑-Java的继承与多态
一. class Grandparent { public Grandparent() { System.out.println("GrandParent Created."); ...
- MyBatis-Plus使用教程
单机版 安装环境 上传压缩包到/usr/local/software/下 解压安装包,进入解压目录的bin目录下,启动命令: ./solr start -force 默认端口是8983,请求虚拟机, ...
- MySQL数据库-表内容操作
1.表内容增加 insert into 表 (列名,列名...) values (值,值,值...); 添加表内容添加一条数据 insert into 表 (列名,列名...) values (值,值 ...