PL/SQL程序结构

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号员工的名字:

declare
  name varchar(20);   --声明了一个name变量
begin
  select employee_name into name from employees  --将employees中的employee_name变量值赋给name
  where employee_id=109;
  dbms_output.put_line(name);
exception
when no_data_found then
  dbms_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号员工的员工名和工资,并输出。

declare
  sal employees.salary%type;
  emp employees%rowtype;
begin
  select 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号员工的员工名与工资。

declare
    type t_emp is record (name char(10),sal number(8,2));
    v_emp t_emp;
begin
    select employee_name,salary into v_emp from employees
    where 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
--子块
    declare
    v2 number :=2;
    begin
      dbms_output.put_line(v1) ;--子块中引用父块声明的变量结果为1
      dbms_output.put_line(v2) ;  结果为2
    end;
end;

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

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

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

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

4.父块标签

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

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

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

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

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

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

参考:

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

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

 

你可能感兴趣的:(sql,oracle,数据库)