Oracle存储过程和自定义函数
概述
存储过程和存储函数是指存储在数据库中供所有用户程序调用的子程序叫存储过程、存储函数。
异同点:
- 存储过程和存储函数的相同点:完成特定功能的程序。
- 存储过程和存储函数的区别:是否用return语句返回值。
存储过程的创建和调用
第一个存储过程:打印 hello world
create or replace procedure sayhelloword
as
-- 说明部分,as一定要写
begin
dbms_output.put_line('Hello World');
end;
/
调用存储过程
exec sayhelloworld()
-- 调用两次
begin
sayhelloworld();
sayhelloworld();
end;
/
oracle 带参数的存储过程
-- 创建一个带参数的存储过程
-- 给指定的员工涨100块钱的工资,并且打印涨前后涨后的薪水
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;
/
如何调试存储过程
- 调试存储过程最好放到Oracle数据库所在的系统或虚拟机上,解压SQL developer ,双击运行。
- 为了确保存储过程或函数是可调试的,右键“以编译并进行调试”,点击红色按钮“调试”
- 利用已写好的调用函数进行调试。
- 给调试账户授权
grant DEBUG CONNECT SESSION ,DEBUG ANY PROCEDURE to scott;
存储函数
函数的定义
是一个命名的存储程序,可带参数,并返回一个计算值。必须有return 子句,用于返回函数值。
创建存储函数语法
create or replace function 函数名(参数列表)
return 函数值类型
as
begin
PLSQL子程序体;
end;
注意 表达式中某个字段为空时,表达式返回值为空。为防止含有表达式的返回值错误,在可能为空的字段上加上NVL(字段名,0)。
--查询某个员工的年收入
create or replace function queryemp_income(eno in number)
return number
as
--定义变量接收薪水和奖金
p_sal emp.sal%type;
p_comm emp.comm%type;
begin
select sal,comm into p_sal,p_comm from emp where empno=eno;
--nvl为遇空函数,如果p_comm为空则返回0
return nvl(p_comm,0)+p_sal*12;
end;
/
out 参数
存储过程和存储函数都可以有多个输入(in)和输出参数(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;
/
在 out 参数中访问光标
申明包结构
- 包头(申明)
- 包体(实现)
案例
-- 查询某个部门中所有员工的所有信息 //ref(reference引用) cursor(光标)
#包头
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;
***********包体需要实现包头中声明的所有方法*********************
在应用程序中访问
在java应用程序中访问存储过程和存储函数以及访问包下的存储过程,可以查看java API文档。
Reference:
Oracle存储过程和自定义函数的更多相关文章
- Oracle存储过程和自定义函数笔记
学习地址:https://www.imooc.com/learn/370 存储过程和存储函数定义:指存储在数据库中供所有用户程序调用的子程序叫做存储过程 .存储函数. 相同点:完成特定功能的程序.区别 ...
- 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 ...
随机推荐
- inotify-tools + php脚本实现Linux服务器文件监控并邮件提醒
需求简介: 由于服务器被挂马,经常被写入涉敏感的html网页,领导时常被网监请去喝茶,呵呵你懂的.所以有两个需求,一是找出服务器的木马后门和修复代码漏洞,二是监控服务器涉及增删改查的文件. 第一个 ...
- C语言位操作
#include <stdio.h> void print(int); int main(void) { int flag = 0xffe4; print(flag); printf(&q ...
- 【NOIP2015提高组】Day2 T2 子串
题目描述 有两个仅包含小写英文字母的字符串 A 和 B.现在要从字符串 A 中取出 k 个互不重叠的非空子串,然后把这 k 个子串按照其在字符串 A 中出现的顺序依次连接起来得到一 个新的字符串,请问 ...
- [Python] 文科生零基础学编程系列三——数据运算符的基本类别
上一篇:[Python] 文科生零基础学编程系列二--数据类型.变量.常量的基础概念 下一篇: ※ 程序的执行过程,就是对数据进行运算的过程. 不同的数据类型,可以进行不同的运算, 按照数据运算类型的 ...
- gridContro使用随记
gridControl设置列宽自动适应内容:绑定数据后调用如下代码即可设置.gridControl1.DataSource = m_pTablegridView1.BestFitColumns(); ...
- LeetCode 572. Subtree of Another Tree (是否是另一个树的子树)
Given two non-empty binary trees s and t, check whether tree t has exactly the same structure and no ...
- LeetCode 342. Power of Four (4的次方)
Given an integer (signed 32 bits), write a function to check whether it is a power of 4. Example:Giv ...
- javascript的一些算法的实用小技巧
一.交换两个数字的值 我们交换两个数字的值想到的方法一般就是用一个新的变变量,让他把一个数存起来,然后在交换两个数字的值,看下面这种. var a = 1, b = 2; //交换两个数字的值 var ...
- oracle赋值问题(将同一表中某一字段赋值给另外一个字段的语句)
将同一表中某一字段赋值给另外一个字段的语句update jxc_ckmx ckmx1 set ckmx1.ddsl = (select ckmx2.sl from jxc_ckmx ckmx2 whe ...
- SQL基本查询_单表查询(实验二)
SQL基本查询_单表查询(实验二) 查询目标表结构及数据 emp empno ename job hiedate sal comn deptno 1007 马明 内勤 1992-6-12 4000 2 ...