PL/SQL规范、块、过程、函数、包、触发器
1.pl/sql规范
标识符号的命名规范
- 定义变量,用 v- 作为前缀 v-sal
2)定义常亮, 用 c- 作为前缀 c-rate - 定义游标,用 _cursor作为后缀 emp_cursor
- 定义例外,用 e_ 作为前缀 e_error
2.块(block)机构示意图
pl/sql 块有三部分构成,定义部分,执行部分,例外处理部分
declear
/*定义部分 --- 定义常量、变量、游标、例外、复杂属于类型*/
begin
/*执行部分 -- 要执行的pl/sql 语句 和 sql语句*/
exception
/*例外处理部分 --- 处理运行的各种错误*/
end;
其中执行部分是必须的,定义部分和例外处理部分是可选的.
实例1-只包含执行部分的pl/sql块
set serveroutput on; // on 和 off 打开与关闭内容是否输出
begin
dbms_output.put_line('hello world');
end;
dbms_output 是oracle提供的包,包里面包含一些过程,如put_line
实例2 - 包含定义部分和执行部分的pl/sql块
declare
v_name varchar2(5); --定义字符串变量
begin
select ename into v-ename form emp where empno=&no;
dbms_output.put_line('雇员名:' || v_name);
end;
/
&no 表示控制台输入,
into v_ename 将查出来的 ename 赋值给 v_ename
|| 类似于字符串拼接
declare
v_ename varchar2(5);
v_sal number(7,2);
begin
--执行部分
select ename,sal into v_ename,v_sal from emp where empno = &aa;
--在控制台显示
dbms_outln.put_line('用户名是:'||v_ename || '工资:' || v_sal);
end;
/
实例3-包含定义部分和执行部分和例外处理部分
为避免pl/sql程序的运行错误,提高健壮性,应该对可能的错误进行处理
(1) 比如在实例2中,如果输入了不存在的雇员号,应当做例外处理
(2) 有时候出现异常,希望用另外的逻辑处理
oracle 事先定义了一些异常,no_data_found 就是找不到数据的例外
declare
v_ename varchar2(5);
v_sal number(7, 2);
begin
--执行部分
select ename, sal into v_ename, v_sal from emp where empno = &aa;
--在控制台显示
dbms_outln.put_line('用户名是:' || v_ename || '工资:' || v_sal);
--异常处理
exception
when no_data_found then
dbms_output.put_line('编号输入有误');
end;
/
3.过程
-- 案例4
create procedure sp_pro3(spName, varchar, newSal number) is
begin
-- 执行部分,根据用户名修改工资
update emp set sal = newSal where ename == spName;
end;
/
-- 调用存储过程 exec 或者 call
exec sp_pro3('jack',9899);
4.函数
用于返回特定的数据,当建立函数时,在函数头部必须包含return子句,而在函数体内必须包含return 语句返回的数据
--输入雇员姓名,返回该雇员的信息
create function sp_fun2(spName varchar2) return number is
yearSal number(7, 2); -- 七位数两位小数
begin
-- 执行部分
select sal * 12 + nvl(comm, 0) * 12 into yearSal from emp where ename = spName;
return yearSal;
end;
/
在sqlplus 中调用函数:
sql>val income number
sql>call sp_cun2('jack') into:income
sql>print income
5.包
(1) 使用 create package 来创建包
create package sp_package is
procedure update_sal(name varchar2, newsal number);
function annual_income(name varchar2) return number;
end;
/
包的规范只包含了过程和函数的说明,但是没有过程和函数实现。
包体用于实现包规范
在pl/sql packages 里查看
(2) 建立包体使用 create package body 命令
-- 给 包sp_package 实现包体
create package body sp_package is
procedure update_sal(name varchar2, newsal number) is
begin
update emp set sal = newsal where ename = name;
end;
function annual_income(name varchar2) return number is
annual_salary number;
begin
select * sal * 12 + nvl(comm, 0)
into annual_salary
from emp
where ename = name;
return annual_salary;
end;
end;
然后就可以调用了:
sql> exec sp_paackage.update_sal('jack',200);
当调用包的过程或是函数时,在过程和函数前需要带有包名,如果要访问其他方案的包,还需要在包名前加方案名。
如:
SQL> call sp_package.update_sal('jack',200)
6.触发器
触发器是指隐含的执行的存储过程。当定义触发器时,必须要指定触发的事件和触发的操作,常用的触发事件包括insert,update,delete语句,而触发的操作实际就是一个 pl/sql块.
可以使用 create trigger
来建立触发器。
可以用来维护数据库的安全和一致性。
PL/SQL规范、块、过程、函数、包、触发器的更多相关文章
- Oracle基础(五)pl/sql进阶(分页过程)
编写分页过程 通过pl/sql实现分页过程,再该过程中由简单到难一步步深入,目的在于通过该案例熟悉pl/sql的各种存储过程,包,游标.怎样在java中调用等内容的学习. 1.无返回值 ...
- SQLPLUS执行PL/SQL语句块
1.首先登录Oracle HR schema: 2.对于PL/SQL程序,分号表示语句的结束:而使用 "." 号表示整个语句块的结束,也可以省略.按回车键后,该语句块不会执行,即 ...
- 同样的一句SQL语句在pl/sql 代码块中count 没有数据,但是直接用SQl 执行却可以count 得到结果
pl/sql 代码块: SELECT count(distinct t2.so_nbr) INTO v_count2 FROM KFGL_YW_STEP_qd t2 WHERE t2.partitio ...
- PL/SQL编程-块编程
(1). 简单分类 |————过程(存储过程) | ...
- PL/SQL之存储过程和函数
1.创建存储过程 .1语法: CREATE[OR REPLACE] PROCEDURE [schema.] procedure_name[(argument[{IN|OUT|IN OUT}] data ...
- oracle 中使用 pl/sql代码块
1.写匿名块,输入三角形三个表的长度.在控制台打印三角形的面积. declare -- (p=(a+b+c)/2) --声明三角形的面积 三条边 的 v_a number (10,2):=&n ...
- oracle pl/sql远程连接过程
之前没用过oracle,现在公司用到就记录下安装过程吧.安装PL/SQL工具,安装oracle11G工具.打开PL/SQL 进行配置.
- pl/sql基础知识—过程快速入门
n 过程 过程用于执行特定的操作,当建立过程时,既可以指定输入参数(in),也可以指定输出参数(out),通过在过程中使用输入参数,可以将数据传递到执行部分:通过使用输出参数可以将执行部分的数据传递 ...
- PL/SQL学习笔记之函数
一:函数 函数与过程的最大不同就是,函数有返回值.适用于需要返回结果的场景. 二:创建函数 CREATE [OR REPLACE] FUNCTION function_name [(parameter ...
随机推荐
- matlab矩阵中如何去掉重复的行;如何找到相同的行,并找到其位置
找到了2个函数:unique和ismember 1. 去掉其中的重复行:unique 例子: IDX = [,,; ,,; ,,; ,,; ,,; ,,]; classNo = unique(IDX, ...
- Java入门系列-08-选择结构
这篇文章为你搞懂2个问题 if-else选择结构的使用? switch 的使用? 前面我们学习的代码都是直上直下的执行,还不会"拐弯",这篇文章带大家来看一下会"拐弯&q ...
- JS异步执行之setTimeout 0的妙用
最近在工作中遇到一些问题,大致是关于js执行问题的.由于没搞清执行顺序,导致出现了一些奇怪的bug. 所以这里整理一些有关异步执行的知识(冰山一角角)... 大家都知道js是单线程的,执行起来是顺序的 ...
- 深入理解JavaScript系列(14):作用域链(Scope Chain)
前言 在第12章关于变量对象的描述中,我们已经知道一个执行上下文 的数据(变量.函数声明和函数的形参)作为属性存储在变量对象中. 同时我们也知道变量对象在每次进入上下文时创建,并填入初始值,值的更新出 ...
- MySql存储引擎MyISAM和InnoDB的区别
1.MySQL默认采用的是MyISAM. 2.MyISAM不支持事务,而InnoDB支持.InnoDB的AUTOCOMMIT默认是打开的,即每条SQL语句会默认被封装成一个事务,自动提交,这样会影响速 ...
- 详解 UWP (通用 Windows 平台) 中的两种 HttpClient API
UWP (通用 Windows 平台) 应用开发者在构建通过 HTTP 与 Web 服务或服务器断点交互的应用时,有多种 API 可以选择.要在一个托管 UWP 应用中实现 HTTP 客户端角色,最常 ...
- JavaScript数组常用操作总结
我们在日常开发过程中,使用到原生 JavaScript的时候,有时候会频繁的对数组进行操作,今天我把工作以来,经常用到的有关 JavaScript数组的方法总结一下,方便日后工作的时候查找使用! 一. ...
- 写一个安全的Java单例
单例模式可能是我们平常工作中最常用的一种设计模式了.单例模式解决的问题也很常见,即如何创建一个唯一的对象.但想安全的创建它其实并不容易,还需要一些思考和对JVM的了解. 1.首先,课本上告诉我,单例这 ...
- linux基础-linux和unix的区别
有时候我们对天天使用的Linux指令,只知道怎么用,却分不清概念用法区别,我觉得很有必要整理整理大家熟视无睹的一些linux概念区别. 首先说说unix和linux的区别: linux和unix的最大 ...
- PAT 1062 Talent and Virtue
#include <cstdio> #include <cstdlib> #include <cstring> #include <vector> #i ...