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

概述

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

异同点:

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

存储过程的创建和调用

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

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

调用存储过程

  1. exec sayhelloworld()
  1. -- 调用两次
  2. begin
  3. sayhelloworld();
  4. sayhelloworld();
  5. end;
  6. /

oracle 带参数的存储过程

  1. -- 创建一个带参数的存储过程
  2. -- 给指定的员工涨100块钱的工资,并且打印涨前后涨后的薪水
  3. create or replace procedure raisesalary(eno in number) -- in 这是一个输入参数
  4. as
  5. -- 定义一个变量保存涨前的薪水
  6. psal emp.sal%type;
  7. begin
  8. -- 得到员工涨前的薪水
  9. select sal into psal from emp where empno=eno;
  10. -- 给该员工涨100块钱
  11. update emp set sal=sal+100 where empno=eno;
  12. -- 一般,这里不需要 commit 也不需要 rollback
  13. -- 注意:一般不在存储过程或者存储函数中,commit rollback
  14. -- 打印
  15. dbms_output.put_line('涨前:'||psal||',涨后:'||(psal+100));
  16. end;
  17. /
  18. -- 调用:
  19. begin
  20. raisesalary(7839);
  21. raisesalary(7566);
  22. end;
  23. /

如何调试存储过程

  1. 调试存储过程最好放到Oracle数据库所在的系统或虚拟机上,解压SQL developer ,双击运行。
  2. 为了确保存储过程或函数是可调试的,右键“以编译并进行调试”,点击红色按钮“调试”
  3. 利用已写好的调用函数进行调试。
  4. 给调试账户授权
  1. grant DEBUG CONNECT SESSION ,DEBUG ANY PROCEDURE to scott;

存储函数

函数的定义

  是一个命名的存储程序,可带参数,并返回一个计算值。必须有return 子句,用于返回函数值。

创建存储函数语法

  1. create or replace function 函数名(参数列表)
  2. return 函数值类型
  3. as
  4. begin
  5. PLSQL子程序体;
  6. end;

注意 表达式中某个字段为空时,表达式返回值为空。为防止含有表达式的返回值错误,在可能为空的字段上加上NVL(字段名,0)。

  1. --查询某个员工的年收入
  2. create or replace function queryemp_income(eno in number)
  3. return number
  4. as
  5. --定义变量接收薪水和奖金
  6. p_sal emp.sal%type;
  7. p_comm emp.comm%type;
  8. begin
  9. select sal,comm into p_sal,p_comm from emp where empno=eno;
  10. --nvl为遇空函数,如果p_comm为空则返回0
  11. return nvl(p_comm,0)+p_sal*12;
  12. end;
  13. /

out 参数

  存储过程和存储函数都可以有多个输入(in)和输出参数(out),都可以通过out参数实现返回多个值。

  1. -- out参数:查询某个员工姓名、月薪和职位
  2. -- 原则: 如果只有一个返回值,用存储函数;否则,就用存储过程。
  3. create or replace procedure queryempinfor(eno in number,pename out varchar2,
  4. psal out number,pjob out varchar2)
  5. as
  6. begin
  7. -- 得到该员工的姓名、月薪和职位
  8. select ename,sal,empjob into pename,psal,pjob from emp where empno=eno;
  9. end;
  10. /

在 out 参数中访问光标

申明包结构

  • 包头(申明)
  • 包体(实现)

案例

  1. -- 查询某个部门中所有员工的所有信息 //ref(reference引用) cursor(光标)
  2. #包头
  3. create or replace package mypackage as
  4. type empcursor is ref cursor;
  5. procedure queryEmpList(dno in number,empList out empcursor);
  6. end mypackage;
  7. #包体
  8. create or replace package body mypackage as
  9. procedure queryEmpList(dno in number,empList out empcursor) as
  10. begin
  11. open empList for select * from emp where deptno=dno;
  12. end queryEmpList;
  13. end mypackage;
  14. ***********包体需要实现包头中声明的所有方法*********************

在应用程序中访问

  在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. LINUX 笔记-free命令

    free命令可以显示Linux系统中空闲的.已用的物理内存及swap内存,及被内核使用的buffer. focus@ubuntu:~$ free -h total used free shared b ...

  2. LINUX 笔记-wget命令

    使用wget下载单个文件 命令:wget http://www.minjieren.com/wordpress-3.1-zh_CN.zip 使用wget -c断点续传 命令:wget -c http: ...

  3. 求原码、补码,反码(C语言源代码)

    #include <stdio.h> #define N 8 //这里你要求是8位 int main(int argc, const char * argv[]) { int binary ...

  4. Asp.net MVC4高级编程学习笔记-模型学习第四课基架与模型绑定20171027

    MVC模型 一.构建基架. MVC中的基架可以为应用程序提供CURD各种功能生成所需要的样板代码.在添加控制器的时候可以选择相应的模板以及实体对象来生成相应的模板代码. 首先定义一个模型类如下所示: ...

  5. 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 ...

  6. Jenkins集成taffy进行自动化测试并输出测试报告

    本文主要介绍Jenkins集成taffy/nose框架进行自动化测试并输出测试报告方法. 0. 测试环境 Jenkis主节点部署在CentOS系统上,子节点为Win10 64位系统(即我们本机运行自动 ...

  7. Muduo阅读笔记---入门(一)

    第一步:下载源码和文档 下载muduo项目的源码.<muduo-manual.pdf>文档,以及<Linux多线程服务端编程:使用muduo C++网络库.pdf>,这些是前期 ...

  8. (2017浙江省赛E)Seven Segment Display

    Seven Segment Display Time Limit: 2 Seconds      Memory Limit: 65536 KB A seven segment display, or ...

  9. ACM课程总结

    当我还是一个被P哥哥忽悠来的无知少年时,以为编程只有C语言那么点东西,半个学期学完C语言的我以为天下无敌了,谁知自从有了杭电练习题之后,才发现自己简直就是渣渣--咳咳进入正题: STL篇: 成长为一名 ...

  10. poj 1155 TELE(树形DP)

    TELE Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4863   Accepted: 2673 Description ...