新博客文章链接,欢迎大家评论探讨

概述

  存储过程和存储函数是指存储在数据库中供所有用户程序调用的子程序叫存储过程、存储函数。

异同点:

  • 存储过程和存储函数的相同点:完成特定功能的程序。
  • 存储过程和存储函数的区别:是否用return语句返回值。

存储过程的创建和调用

第一个存储过程:打印 hello world

create or replace procedure sayhelloword
as
-- 说明部分,as一定要写
begin
dbms_output.put_line('Hello World');
end;
/

调用存储过程

  1. 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;
/

如何调试存储过程

  1. 调试存储过程最好放到Oracle数据库所在的系统或虚拟机上,解压SQL developer ,双击运行。
  2. 为了确保存储过程或函数是可调试的,右键“以编译并进行调试”,点击红色按钮“调试”
  3. 利用已写好的调用函数进行调试。
  4. 给调试账户授权
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存储过程和自定义函数的更多相关文章

  1. Oracle存储过程和自定义函数笔记

    学习地址:https://www.imooc.com/learn/370 存储过程和存储函数定义:指存储在数据库中供所有用户程序调用的子程序叫做存储过程 .存储函数. 相同点:完成特定功能的程序.区别 ...

  2. MySQL存储过程/存储过程与自定义函数的区别

    语法: 创建存储过程: CREATE [definer = {user|current_user}] PROCEDURE sp_name ([ proc_parameter [,proc_parame ...

  3. (转)MySQL存储过程/存储过程与自定义函数的区别

    转自:http://www.cnblogs.com/caoruiy/p/4486249.html 语法: 创建存储过程: CREATE [definer = {user|current_user}]  ...

  4. oracle存储过程和存储函数&触发器

    oracle存储过程和存储函数 指存储在数据库中供所有用户程序调用的子程序叫存储过程,存储函数 存储过程和存储函数的相同点:完成特定功能的程序 存储过程和存储函数的区别:是否用return语句返回值 ...

  5. 【存储过程】MySQL存储过程/存储过程与自定义函数的区别

    ---------------------------存储过程-------------------- 语法: 创建存储过程: CREATE [definer = {user|current_user ...

  6. MySQL存储过程和自定义函数、Navicat for mysql、创建存储过程和函数、调用存储过程和函数的区别

    1 MySQL存储过程和函数 过程和函数,它们被编译后保存在数据库中,称为持久性存储模块(Persistent Stored Module,PSM),可以反复调用,运行速度快. 1.1 存储过程 存储 ...

  7. SQL中存储过程和自定义函数的区别

    存储过程:     存储过程可以使得对数据库的管理.以及显示关于数据库及其用户信息的工作容易得多.存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理.存储过程存储在 ...

  8. SQL中存储过程和自定义函数的区别(转载)

    存储过程:     存储过程可以使得对数据库的管理.以及显示关于数据库及其用户信息的工作容易得多.存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理.存储过程存储在 ...

  9. Jpa 重写方言dialect 使用oracle / mysql 数据库自定义函数

    在使用criteria api进行查询时 criteriaBuilder只提供了一个部分标准的sql函数,但当我们需要使用oracle特有的行转列函数wm_concat或 mysql特有的行转列函数g ...

随机推荐

  1. netbeans 字体发虚

    今天更新了netbeans,重启后蛋疼了,字体发虚,搜索网络后有得到如下方案: 对Archlinux,去/usr/share/netbeans/etc,里面找到netbeans.conf,给下面一行参 ...

  2. zookeeper 笔记-ACL

    zookeeper中,znode的ACL是没有继承关系的,是独立控制的,zookeeper的acl可以从3个维度理解,一是scheme,二是user,三是permission,通常表示为scheme: ...

  3. Windows系统下Nginx的安装与配置

    Nginx是lgor Sysoev在2004年的时候为俄罗斯访问量第二大的rambler.ru站点设计开发的,发布至今,凭借开源的力量,已经接近成熟与完善.其功能丰富,可作为HTTP服务器,也可作为反 ...

  4. 读书笔记之《深入理解Java虚拟机》不完全学习总结

    写在前面: 之所以称作不完全总结,因为我其实没有完完全全地看完此书,但是涵盖了大部分重要章节:同时以下总结是我自己认为很重要知识,细枝末节处难免遗漏,还请详细参考原著. 转载请注明原文出处:http: ...

  5. eval函数的坑

    开发工作中遇到这样一种情形,需要执行用户输入的php代码串,于是决定使用eval函数.coding大概示例如下: function getStr($str) { return strlen($str) ...

  6. LeetCode 277. Find the Celebrity (找到明星)$

    Suppose you are at a party with n people (labeled from 0 to n - 1) and among them, there may exist o ...

  7. 微信小程序之页面跳转路径问题

    错误如下: 业务需求:在movie页面点击进入detail页面. 在遍历跳转路径的时候,写绝对路径了 只需改一下就好了 教程参考地址:http://blog.csdn.net/reylen/artic ...

  8. Line belt

    Problem Description In a two-dimensional plane there are two line belts, there are two segments AB a ...

  9. Windows Message Queue

    Windows Message Queue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...

  10. 2016 ICPC总结

    2016 ICPC总结 九月份开学,开始知识点的补充,刚开始的几周都在刷acmsteps,十月开始进行专题性的学习,首先进行的数据结构,给自己定的计划,十一月前看完数据结构,刚开始的时候看的都是以前的 ...