pl/sql programming 03 语言基础
PL/SQL 块结构
最小的有意义的代码单元叫做 块(block). 一个块是一组代码, 这个块给出了执行边界, 也为变量声明和异常处理提供了作用范围, pl/sql 准许我们创建匿名块和命名块, 命名块包括 包, 过程, 函数, 触发器或者对象类型.
一个Pl/SQL 块应该包含4个单元
header // 块头, 可选的 ( 只有命名块才会有这个单元, 比如 create function 等等
IS
declaration section // 声明单元, 可选, 注意, 这里不需要在使用 declare 关键字了.
BEGIN
execution section // 执行单元 , 这个单元是必须的
EXCEPTION
exception section // 异常处理单元, 可选
END;
例如:
PROCEDURE get_happy(ename_in IN VARCHAR2) // 块头
IS
l_hiredate DATE; // 声明单元
BEGIN
l_hiredate := SYSDATE - 2; // 执行单元
INSERT INTO employee (emp_name, hiredate)
VALUES (ename_in, l_hiredate);
EXCEPTION
WHEN DUP_VAL_IN_INDEX THEN
DBMS_OUTPUT.PUT_LINE (‘Cannot insert.’);
END;
嵌套块
procedure calc_totals
is
year_total number;
begin
year_total := 0;
/* 嵌套块的开始 */
declare -- 嵌套块内的声明部分就需要使用 declare 来声明了, 因为内部实际上市一个匿名块, 匿名块需要使用 declare
month_total number;
begin
month_total := year_total / 12;
end set_month_total;
/* 嵌套块结束 */
end;
嵌套块: 还被叫做闭包块, 子块.
1. 作用域, 要规范变量名, 要写全称, 例如:
在 PL/SQL中, 变量, 异常, 模块 和一些其他的结构都是属于声明它们的块局部的. 即作用范围是, 当前块内部. 所以在外层快定义的变量, 在内层块可以访问.
1: /* Formatted on 2013/11/20 14:46 (Formatter Plus v4.8.6) */
2: PACKAGE scope_demo
3: IS
4: g_global NUMBER;
5:
6: PROCEDURE set_global (number_in IN NUMBER);
7: END scope_demo;
8:
9: PACKAGE BODY scope_demo
10: IS
11: PROCEDURE set_global(number_in IN NUMBER)
12: IS
13: l_salary NUMBER := 10000;
14: l_count PLS_INTEGER;
15: BEGIN
16: <<local_block>>
17: DECLARE
18: l_inner NUMBER;
19: BEGIN
20: SELECT COUNT(*)
21: INTO set_global.l_count
22: FROM emplyees e
23: WHERE e.department_id = local_block.l_inner
24: AND e.salary > set_global.l_salary;
25: END local_block;
26:
27: scope_demo.g_global := set_global.number_in;
28: END set_global;
这个包, 有点类似 OBJECT-C, 在包声明部分声明的内容为全局变量, 任何对 scope_demo 包有 execute 授权的模式的任何代码块都可以使用这个变量, scope_demo.g_global,
而 l_salary 这个变量只能在set_global过程内部使用, l_inner 这个变量只能被局部或者潜逃块内使用. 规范sql语句中所有对变量和列的引用
PACKAGE BODY scope_demo
IS
PROCEDURE set_global (number_in IN NUMBER)
IS
l_salary NUMBER := 10000;
l_count PLS_INTEGER;
BEGIN
<<local_block>>
DECLARE
l_inner PLS_INTEGER;
BEGIN
SELECT COUNT(*)
INTO set_global.l_count
FROM employees e
WHERE e.department_id = local_block.l_inner
AND e.salary > set_global.l_salary;
END local_block;
scope_demo.g_global := set_global.number_in;
END set_global;
END scope_demo;
可以看到, 就是在引用一些变量 等内容时, 要写全称. 特别是外部块和内部块同名时.
通过上边例子的限定符, 避免Bug.
可见性
- 一个在当前块声明的标示符
- 一个在包含点前块的块中声明的标示符(即嵌套块内层能看到外层声明的变量)
- 属于你所有的一个单独的数据库对象(表, 视图, 序列等) 或者pl/sql对象(过程, 函数, 类型)
- 一个你能看到的数据库别名, 而且你对别名指向的数据库对象或者 pl/sql 对象有适当的权限.
- 一个循环体中的索引变量(但这个变量的作用域只在循环体内)
2. 单引号问题
q + 分隔符的办法
单行注释 --
多行注释 /**/ PRAGMA
这个词, 暗示一个契约, 一个动作, 在PL/SQL中提供了以下几个内容:
AUTONOMOUS_TRANSACTION , 当前块对数据库所做的修改的提交或回滚不影响主事务或者外层事务.
EXCEPTION_INIT 把一个特殊的错误号和我们在程序中声明的异常标示符关联起来
RESTRICT_REFERENCES 告诉编译器一个包程序的纯度级别.
SERIALLY_REUSABLE 包级别的数据在引用间不能保留
例如
DECLARE
no_such_sequence EXCEPTION;
PRAGMA EXCEPTION_INIT (no_such_sequence, -2289);
BEGIN
WHEN no_such_sequence
THEN
q$error_manager.raise_error('Sequence not defined');
END;
3. 标签
<<inner>>, <<outer>> 等等.
作用:
一个代码块, 有一个标签, 可以提高代码的可读性
另外, 在变量名前指明标签, 可以规范代码变量.
在代码块中, 可以方便操作, 例如 exit outer_loop, 虽然你在内层循环, 但是因为你写的是 exit outer_loop, 所以就可以退出外层循环.
pl/sql programming 03 语言基础的更多相关文章
- Oracle实践--PL/SQL表分区的基础
PL/SQL基础入门之表分区 PL/SQL:过程语言(Procedure Language)和结构化语言(Structured Query Language)结合而成的编程语言.是对SQL的扩展.支 ...
- PL/SQL 训练03 --异常
--程序员在开发的时候,经常天真的认为这个世界是完美的,用户如同自己般聪明,总能按照自己设想的方式--操作系统输入数据.但残酷的事实告诉我们,这是不可能的事情,用户总会跟我们相反的方式操作系统--于是 ...
- Python进阶----数据库的基础,关系型数据库与非关系型数据库(No SQL:not only sql),mysql数据库语言基础(增删改查,权限设定)
day37 一丶Python进阶----数据库的基础,mysql数据库语言基础(增删改查,权限设定) 什么是数据库: 简称:DataBase ---->DB 数据库即存放数据的仓库, ...
- pl/sql programming 15 数据提取
数据提取 -- 游标 游标只是一个指向某个结果集的指针. 声明游标: cursor employee_cur IS select * from employees; 打开游标: open employ ...
- pl/sql programming 06 异常处理
如果 PLSQL发生了错误, 无论是系统错误还是应用错误, 都会抛出一个异常, 当前 PL/SQL 块中执行单元会暂停处理, 如果当前块有一个异常处理单元的话, 控制会转移到当前块的异常处理单元来处理 ...
- pl/sql programming 02 创建并运行plsql代码
/* * chap 02 * ------------------------------------------------- */ create or replace function wordc ...
- PL/SQL学习笔记_01_基础
PL/SQL语句可以在Oracle客户端的 SQL窗口或者 command 窗口中运行 在SQL窗口中运行步骤同 SQL语句 在command 窗口中运行的步骤如下: 1)File—new com ...
- PL/SQL第三章 基础查询语句
--查询所有列 select * from tab_name|view_name; SELECT * FROM emp; SELECT * FROM (SELECT * FROM emp); --查询 ...
- PL/SQL学习笔记_01_基础:变量、流程控制
PL/SQL语句可以在Oracle客户端的 SQL窗口或者 command 窗口中运行 在SQL窗口中运行步骤同 SQL语句 在command 窗口中运行的步骤如下: 1)File—new com ...
随机推荐
- 一个perfect 的解决 阴影拉伸的方法 shadow map strech
因为在场景中做了,有的物体产生阴影比如人物,有的物体不产生阴影比如地面,这样在地面凹下去的地方,悬崖,池塘边,就会有阴影的拉伸. 实际上, 没办法上传图片.... L是光源 A 点(人物身上)产生阴影 ...
- Hibernate联合主键映射
1.联合主键的映射规则 1) 类中的每个主键属性都对应到数据表中的每个主键列. Hibernate要求具有联合主键的实体类实现Serializable接口,并且重写hashCode与equals方法, ...
- 两种高性能I/O设计模式(Reactor/Proactor)的比较
原文出处: Alex Libman 译文出处:潘孙友 欢迎分享原创到伯乐头条 综述 这篇文章探讨并比较两种用于TCP服务器的高性能设计模式. 除了介绍现有的解决方案,还提出了一种更具伸缩性,只 ...
- Java递归列出目录下全部文件
Java递归列出目录下全部文件 /** * 列出指定目录的全部内容 * */ import java.io.*; class hello{ public static void main(String ...
- 禁止触屏滑动touchmove方法介绍
在移动端页面开发中,有时需要禁止用户滑动屏幕,搜索了好久才找到移动终端的touch事件,touchstar,touchmove,touchend. 阻止滚动 一些移动设备有缺省的touchmove行为 ...
- HDOJ 1220 Cube
CubeTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- Docker 面临的安全隐患,我们该如何应对
[编者按]对比虚拟机,Docker 在体量等方面拥有显著的优势.然而,当 DevOps 享受 Docker 带来扩展性.资源利用率和弹性提升的同时,其所面临的安全隐患同样值得重视,近日 Chris T ...
- C#&java重学笔记(面向对象)
C#部分 1.C#有一个internal关键字,指字段可以同一个程序集中访问,出了程序集不行.还有一个protected internal(没有先后之分)修饰词,指只能在同一个程序集中的子类访问 2. ...
- [STL]heap和priority_queue
一.heap 在STL中,priority_queue(优先权队列)的底层机制是最大堆,因此有必要先来了解一下heap.heap采用完全二叉树的结构,当然不是真正的binary tree,因为对于完全 ...
- java集合之ArrayList的实现原理
1. ArrayList概述: ArrayList是List接口的可变数组的实现.实现了所有可选列表操作,并允许包括 null 在内的所有元素.除了实现 List 接口外,此类还提供一些方法来操作内部 ...
