1.PL/SQL介绍:

PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL)。PL/SQL是Oracle数据库对SQL语句的扩展。在普通SQL语句的使用上增加了编程语言的特点,所以PL/SQL把数据操作和查询语句组织在PL/SQL代码的过程性单元中,通过逻辑判断、循环等操作实现复杂的功能或者计算。

2.PL/SQL基本结构:

PL/SQL程序的基本单元是语句块,所有的PL/SQL程序都是由语句块构成的,语句块之间可以相互嵌套,每个语句块完成特定的功能。
一个完整的PL/SQL语句块由3个部分组成。
(1)声明部分:以关键字declare开始,以begin结束。主要用于声明变量,常量,数据类型,游标,异常处理名称和本地子程序定义等。
(2)执行部分:是PL/SQL语句块的功能实现部分,以关键字begin开始,以exception或end结束(如果语句中没有异常处理部分,则以关键字end结束)。该部分通过变量赋值,流程控制,数据查询,数据操纵,数据定义,事务控制,游标处理等操作实现语句块的功能。
(3)异常处理部分:以关键字exception开始,以end结束。该部分用于处理该语句块执行过程中产生的异常。
注意:执行部分是必须的,而声明部分和异常部分是可选的。

PL/SQL语句块分为命名块和匿名块:
命名块包含过程/函数/包,命令存储存在数据库中,通过名称调用
匿名块以declare 或begin开头,不存在数据库中,每次调用都需要重新书写

DECLARE
--声明变量部分——所有变量,常量,游标,子程序,和其他元素
--变量分为普通变量(数据库类型)和特殊变量(引用类型和记录类型)
BEGIN
--程序主体,可执行命令
--执行程序时变量也可以进行赋值
END;

实例:查询并输出109号员工的名字:

declarename varchar(20);   --声明了一个name变量
beginselect employee_name into name from employees  --将employees中的employee_name变量值赋给namewhere employee_id=109;dbms_output.put_line(name);
exception
when no_data_found thendbms_output.put_line('There is not such an employee');
end;

注意:上述代码从数据库中查出来的employee_name无法直接在代码块中输出,所以我们必须将从数据库中查出来的employee_name写入提前声明的变量name中;

另外,语句dbms_output.put_line(name)就是输出变量name的值,但是,在使用输出语句之前,必须设置环境变量serveroutput设置为on。

set serveroutput on;

数据类型相关的特殊属性:

此外,在PL/SQL中有两个与数据类型相关的特殊属性:%type与%rowtype。如果要定义一个类型某个变量的数据类型或数据库表中某个列的数据类型一致的变量,则可以利用%type来实现。如果要定义一个与数据库中某个表结构一致的记录类型的变量,则可以使用%rowtype来实现的。

字符集:

PL/SQL的字符集不区分大小写;

注释:

单行注释可以在一行的任何地方以两个"-"开始,直到改行结尾;多行注释以/* 开始,以*/ 结束,可以跨越多行!

3.变量类型:

3.1普通变量:

declare --姓名v_name varchar(20) :='root';--定义变量时可以赋值--工资v_sal NUMBER; --定义变量--工作地点  v_local varchar(20);
BEGIN
--执行程序
--执行程序时变量也可以进行赋值
--赋值方式1
v_sal:=55;
--赋值方式 2
SELECT  '北京' INTO v_local FROM  dual; --dual是虚表
dbms_output.put_line('姓名,'||v_name||',工资:'||v_sal||',地址:'||v_local);
end;

实例: 2中“实例”部分可参考。

3.2特殊变量类型

3.2.1引用类型

declare
--emp.ename类型引用给v_ename
v_ename emp.ename%TYPE;
--emp.sal类型引用给v_esal
v_esal emp.sal%TYPE;
begin
SELECT ename,sal INTO v_ename,v_esal FROM  emp WHERE emp.empno='7521' ;
dbms_output.put_line('姓名'||v_ename||'工资'||v_esal);
end;

实例:查询109号员工的工资以及140号员工的员工名和工资,并输出。

declaresal employees.salary%type;emp employees%rowtype;
beginselect salary into sal from employees where employee_id=109;select * into emp from employees where employee_id=140;dbms_output.put_line(sal);dbms_output.put_line(emp.employee_name||''||emp.salary);
emd;

3.2.2记录型 

declare
v_emp emp%rowtype;--表中行类型引用进来,为记录变量
begin
SELECT *  INTO v_emp FROM emp WHERE empno='7521';
--注意添加是整个表类型 ,错误写法 SELECT empno,sal INTO v_emp FROM emp WHERE empno='7521';
dbms_output.put_line('7521姓名'||v_emp.empno||'薪资'||v_emp.sal);
--获得记录变量的字段的方法
end;

实例:利用记录类型和记录类型变量,查询并输出109号员工的员工名与工资。

declaretype t_emp is record (name char(10),sal number(8,2));--记录类型v_emp t_emp;  --记录类型变量
beginselect employee_name,salary into v_emp from employeeswhere employee_id=109;dbms_output.put_line(v_emp.name||''||v_emp.sal);
end;

3.3常量

1.declare和begin之间的常量必须初始化赋值,否则会报错

2.常量不能在执行部分里赋值(即begin和end之间不能赋值常量)

declare
V1 constant number  :=100 ; --常量
begin
dbms_output.put_line(v1);
end;

4.变量的作用域:

由于pl/sql语句块可以进行嵌套,即父块可以包含子块,子块可以包含子子块;
正是由于pl/sql中存在这种多层结构,我们有必要搞清楚变量的作用域。
1.父块声明的变量可以被子块引用

-- 父块
declare
v1 number :=1 ;
begin
--子块declarev2 number :=2;begindbms_output.put_line(v1) ;--子块中引用父块声明的变量结果为1dbms_output.put_line(v2) ;  结果为2end;
end;

2.子块声明的变量不可以被父块引用

-- 父块
declare
v1 number :=1 ;
begin
--子块declarev2 number :=2;begindbms_output.put_line(v1) ;--子块中引用父块声明的变量      end;
--父块中引用子块的声明的变量会报错dbms_output.put_line(v2) ;
end;

3.兄弟之间的变量不可以引用

-- 父块
declare
v1 number :=1 ;
begin
--子块1declarev2 number :=2;begindbms_output.put_line(v1) ;--子块中引用父块声明的变量  结果为1dbms_output.put_line(v2) ;    --结果为2end;
--子块2declarev3 number :=3;begindbms_output.put_line(v1) ;   --结果为1dbms_output.put_line(v2) ;   -----子块2引用子块1的变量报错dbms_output.put_line(v3) ;    --结果为3end;
end;
--子块1作为子块2的兄弟,子块2不能引用子块1的变量

4.父块标签

4.1当父块和子块同时声明一个变量名,父块标签不显示

-- 父块
declare
v1 number :=5 ;
begin
--子块1declarev1 number :=2;begindbms_output.put_line(v1) ;--子块中引用父块声明的变量  结果为2end;
end;

4.2 当父块和子块同时声明一个变量名有父块标签

-- 父块
<<parent_block>>
declare
v1 number :=5 ;
begin
--子块1declarev1 number :=2;
begin
--使用标签引用父块变量dbms_output.put_line( parent_block.v1) ;--子块中引用父块声明的变量  结果为5end;
end;

5.PL/SQL中常见符号解释:

|| 字符串连接符
:= 赋值运算符
% 属性索引 使用%type可以使变量获得与字段相同的数据类型,用于不知道给什么类型才合适的变量
= 相等运算符

参考:

1.PL/SQL基本结构、变量类型、赋值方式、符号、执行等基本认识_小胖墩@小老虎的博客-CSDN博客

2.PLSQL的结构_将军米的博客-CSDN博客_plsql目录结构

PL/SQL程序结构相关推荐

  1. Oracle数据库之PL/SQL程序基础设计

    一.PL/SQL块结构 前边我们已经介绍了PL/SQL块的结构,再来回顾一下: DECLARE /** 声明部分--定义常量.变量.复杂数据类型.游标.用户自定义异常*/ BEGIN /** 执行部分 ...

  2. PL/SQL程序基础1

    PL/SQL程序基础1 一.实验目标 1.针对数据库应用领域的数据需求,设计出基于Oracle数据库的解决方案的能力: 2.承担Oracle数据库系统的实施.运行与维护等基本工作的能力. 二.实验项目 ...

  3. ORA-00980与PL/SQL程序编译出错

        今天碰到一个有意思的问题.     为了降低统计分析数据库的计算和磁盘空间压力.我们使用了将远程数据库中数据通过DBLINK和SYNONYM的形式来缓解当前统计数据库所面临的问题.工作实施的比 ...

  4. PL/SQL程序基础2

    PL/SQL程序基础2 一.实验目标 二.实验项目 三.实验错误解决方案 一.实验目标 掌握较复杂的PL/SQL编程方法.具备如下能力: 针对数据库应用领域的数据需求,设计出基于Oracle数据库的解 ...

  5. PL / SQL在线编译器–在线运行Oracle PL / SQL程序

    In this tutorial you will learn about pl/sql online compiler that will let you run pl/sql programs o ...

  6. c语言 字符串字符反向储存_反向字符串的PL / SQL程序

    c语言 字符串字符反向储存 Here you will get pl/sql program to reverse a string. 在这里,您将获得pl / sql程序来反转字符串. The su ...

  7. 【PL/SQL】学习笔记 (1)一个简单的PL/SQL程序

    PL/SQL语言特点:在SQL语言中增加了过程处理语句(分支,循环等),使SQL语言具有过程处理能力.   将SQL语言的强大的数据操纵能力和过程语言的数据处理能力结合起来. 程序结构: set SE ...

  8. 结束下面sql块_oracle: PL/SQL基本结构,语法,变量

    PL/SQL是基于块结构,不论是命名块还是匿名块都由3个部分组成 定义部分:定义常量,变量,游标,基础及复杂数据类型 执行部分:包含要执行的PL/SQL语句,sql语句,实现应用模块功能 异常处理部分 ...

  9. 四、PL/SQL程序控制语句

    文章目录 一.条件控制 IF 语句 1.1 IF语句 1.2 NULL 条件 二.条件控制 CASE语句 三.搜索式CASE语句 四.NULLIF 函数 五.COALESCE函数 六.迭代控制 6.1 ...

最新文章

  1. CodeForces - 261B Maxim and Restaurant
  2. DSP平台实现图像识别算法总体来说不如嵌入式?
  3. CSS3 总结(一)
  4. 并发工具类【线程安全相关的类】
  5. 【fedora12】vlc-2.0.0编译
  6. SQL导出数据到EXCEL的问题
  7. oracle11gr2架构图,Oracle 11g R2 体系结构
  8. iOS平台软件开发工具(一)-新建的工程使用CocoaPods工具集成第三方框架
  9. Web 3.0项目Aluna.Social宣布将ALN代币将分发给2600多个早期采用者
  10. 独立使用zuul网关分发不同服务的请求、权限控制,非SpringCloud
  11. 文献按时间排序_论文参考文献详解~
  12. mysql 8.0安装_MySQL5.7升级到8.0过程详解
  13. 《大数据之路:阿里巴巴大数据实践》-第2篇 数据模型篇 -第9章 阿里巴巴数据整合及管理体系
  14. 《2小时品牌素养》读后感
  15. 求两函数交点c语言,怎样求两个函数关系式的交点坐标
  16. 加强化工企业危化品管理的几点建议
  17. 在Linux环境下怎么编译Android源码?
  18. Metis异常检测算法率值检测和量值检测源码刨析
  19. 创新案例分享 | 统计数据管理与挖掘分析平台助力民生统计
  20. ios 结构体跟枚举变量的区别_IOS结构体、联合、枚举

热门文章

  1. Linux下启停McAfee防病毒软件
  2. 11.15-判断一个数是否为质数
  3. git乌龟拉取代码出现See git help gc for manual housekeeping..
  4. Android自定义快速设置
  5. 交互媒体技术大作业 - 桌面台球
  6. 日本最受欢迎人工智能竟是女子高中生
  7. ConcurrentHashMap 详解
  8. python中leap是什么意思_leap)是什么意思
  9. 还在手动发早安吗?教你用java实现每日给女友微信发送早安
  10. 2021年是做安卓开发人员的绝佳时机,知乎上已获万赞