Oracle--plsql创建存储过程
发布日期:2021-09-11 05:53:05 浏览次数:9 分类:技术文章

本文共 2597 字,大约阅读时间需要 8 分钟。

子程序的介绍:

命名的 PL/SQL ,能够接受传递的参数,能够被调用。
子程序的类型

  过程:用于执行某项操作

  函数:用于执行某项操作并返回值

基于标准的PL/SQL块结构

  声明部分

  可执行部分

  异常部分(可选)

优点:

模块化

将程序分解为多个逻辑模块

可重用性

子程序在被执行之后,被存储在数据库中,可以在任意数目的

应用程序中使用

可维护性

  子程序简化了维护

提高性能

用户直接使用共享池中解析后的程序

存储过程:

命名的
PL/SQL
能够接受参数
能够被重复调用
用于执行某项操作
存储在数据库中

形式参数与实际参数

形式参数:在子程序说明的参数列表中声明的变量

  CREATEPROCEDURE raise_sal(

  p_idNUMBER,   p_amount NUMBER)

  ...

  ENDraise_sal;

实际参数:在子程序被调用的参数列表中引用的变量或表达式

  raise_sal(v_id,2000)

创建带参数的过程

参数模式IN 是默认的参数模式。换句话说,如果未指定一个参数的模式,该参数就被认为是一个 IN 参数。参数模式 OUT和 IN OUT 必须在参数的前面被明确指定。

一个IN 模式的形式参数不能被指定一个值,就是说,一个在过程体中的 IN 参数不能被修改。

一个OUT 或 IN OUT 参数在返回主叫环境之前必须被指定一个值。

IN参数可以在参数列表中被指定一个默认值。OUT 和 INOUT 参数不能被指定默认值。

默认情况下IN 参数是引用传递,而 OUT 和 IN OUT 参数是值传递。

create or replace procedure raise_sal (p_id in emp.empno%type, p_name out varchar2, p_sal out number) Is begin select sal,ename into p_sal,p_name from emp where empno = p_id; end raise_sal;

DECLARE v_sal emp.sal%type; v_name emp.ename%type; BEGIN raise_sal(7369,v_sal,v_name); dbms_output.put_line('雇员:'||v_name||'的薪水是 '||v_sal); END;

声明主机变量,执行raise_sal过程

VARIABLE g_sal NUMBER VARIABLE g_name VARCHAR2(25) EXEC raise_sal(7369,:g_name,:g_sal)

用 VARIABLE命令创建主机变量。

调用 raise_sal过程,提供这些主机变量作为 OUT 参数。

在 EXECUTE命令中引用主机变量时,注意冒号 (:) 的使用。 

传递参数的方法

位置:实际参数与形式参数排列的顺序相同
指定:实际参数联合其相应的形式参数以任意顺序排列
组合:实际参数的排列一些用位置,一些用指定 
CREATE OR REPLACE PROCEDURE raise_sal (p_id IN emp.empno%type default 7369, p_name OUT varchar2 , p_sal IN OUT number ) IS BEGIN UPDATE emp SET sal = sal + p_sal WHERE empno = p_id; SELECT sal,ename INTO p_sal,p_name FROM emp WHERE empno = p_id; END raise_sal;

异常处理:

当一个异常发生时,控制立即转向块的异常部分。如果异常被处理,块终止运行,并且控制转向主叫程序。

CREATE OR REPLACE PROCEDURE test1 IS v_deptno dept.deptno%type; BEGIN insert into dept values(60,'nuc','kitty'); select deptno into v_deptno from dept where deptno=99; EXCEPTION WHEN NO_DATA_FOUND THEN dbms_output.put_line('内部执行的异常'); END; CREATE OR REPLACE PROCEDURE test IS BEGIN insert into dept values(70,'micro','NEW YORK'); test1(); EXCEPTION WHEN NO_DATA_FOUND THEN dbms_output.put_line('外部执行的异常'); END;

删除存储在数据库中的过程

DROP PROCEDURE procedure_name 

权限授予:

为了能够在子程序中引用和访问不同方案中对象,必须被明确地授予 

 访问引用对象的权限,不能通过角色授权。

PLSQL对象信息存储:

通过以下方法查看PL/SQL对象的存储信息:

user_objects
user_source
desc object_name
show err
dbms_output

通过user_objects视图查看PL/SQL对象的信息;

通过user_source视图查看PL/SQL对象的程序文本;

desc查看对象的结构;

showerr查看对象在编译过程中出现的错误;

通过dbms_output包查看PL/SQL对象的调试信息;

USER_OBJECTS:

SELECT object_name, object_type,status FROM user_objects WHERE object_type in ('PROCEDURE','FUNCTION') ORDER BY object_name;

USER_SOURCE:

SELECT text FROM user_source WHERE name='GET_SAL' ORDER BY line;

USER_ERROR:

转载地址:https://blog.csdn.net/weixin_34406061/article/details/86073574 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:将光标定位于输入框最右侧的实现方式
下一篇:HDU 1025 Constructing Roads In JGShining's Kingdom(最长上升子序列的长度)

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年03月02日 17时17分16秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

java开发加入购物车功能_java web开发——购物车功能实现 2019-04-21
Java虚拟机不能满足_深入理解Java虚拟机--读书笔记1/3 2021-06-24
python 协程 asyncio_python – asyncio.as_completed是否会产生期货或协同程序? 2021-06-24
java设定xml文件的encoding_配置web-xml解决中文乱码问题,及各种乱码问题集结 2021-06-24
hanlp java api_java分词工具hanlp介绍 2021-06-24
nginx php 源码安装,Nginx1.12.2加php7.2.0的编译安装 2021-06-24
php 删除字节,php – 删除无效/不完整的多字节字符 2021-06-24
php 实现版本号对比,如何在PHP中实现比较版本号 2021-06-24
php sql 给数据库追加内容,php如何向数据库中的某串数据后追加内容【急】 2021-06-24
php微信小程序获取用户信息,微信小程序授权获取用户详细信息openid的实例详解... 2021-06-24
Java三元运算和if,Java三元运算符与<JDK8兼容性中的if / else 2021-06-24
graphql-php enum,php – 如何在不写长查询的情况下查询所有的GraphQL类型字段? 2019-04-21
php date 函数用法,php中date()日期时间函数使用方法 2019-04-21
php除法获取整数和余数,PHP除法取整和取余数 2019-04-21
java迷宫路径,Java中的迷宫路径查找器 2019-04-21
php substr cnblog,php中substr用法示例 2019-04-21
php链接怎么截取,PHP 截取网页中的固定种子链接 2019-04-21
iis运行不起来php报500,解决IIS上安装thinkphp6运行报500错误 2019-04-21
php ajax上传图片过大500错误,javascript – JQuery AJAX文件上传错误500 2019-04-21
matlab 图中的legend,matlab中legend加图示命令的使用 2019-04-21