PL/SQL编程基础

1. PL/SQL 块的基础结构

DECLARE

/*

* 定义部分 —— 定义常量、变量、复杂数据类型、游标、用户自定义异常

*/

BEGIN

/*

* 执行部分 ——PL/SQL 语句和 SQL 语句

*/

EXCEPTION

/*

* 异常处理部分 —— 处理运行错误

*/

END;

/* 块结束标记 */

 

2. 使用变量和常量

1 PL/SQL 块中可以使用变量和常量

a. 在声明部分声明,使用前必须先声明

b. 声明时必须指定数据类型,每行声明一个标识符

c. 在可执行部分的 SQL 语句和过程语句中使用

 

2 声明变量和常量的语法:

identifier [CONSTANT] datatype [NOT NULL]

[:= | DEFAULT expr];

 

3 给变量赋值有两种方法:

a. 使用赋值语句 :=

b. 使用 SELECT INTO 语句

例如:

DECLARE

v_name varchar2(10);

BEGIN

select dname  into v_name

from dept

where deptno = 90;

dbms_output.put_line('dname:'|| v_name);

EXCEPTION WHEN NO_DATA_FOUND THEN

dbms_output.put_line(' 没有该部门 ');

END;

 

3. PL/SQL 块的类型

1 匿名块

前面各个示例执行的都是没有名称的匿名块。

 

2 子程序

a. 过程:能够完成一系列的增删改查的动作的 方法

示例:更新指定姓名员工工资,姓名不区别不大小写。

create or replace procedure update_sal

(p_ename VARCHAR2, p_newsal NUMBER)

AS

BEGIN

UPDATE emp SET sal = P_newsal

WHERE lower(ename) = lower(P_ename);

commit;

END;

调用:

exec update_sal(‘scott’, 2000); --SQL*PLUS 中的命令

call update_sal(‘SCOTT’, 2000); --JAVA 中调用的语句

b. 函数:能够完成计算并返回计算结果,注意不能修改数据。

示例:计算一个数的两倍后并返回。

create or replace function f_add(a number )

return number

as

begin

return a*2;

end;

调用:

select f_add(2) from dual;

select f_add(deptno) from dept;

c. 触发器:当触发器所监控的表的数据发生改变 ( 增删改 ) 时自动执行的代码块。

d. 包:包用于逻辑 包含 相关的过程和函数,它由包头和包体两部分组成。

示例:将前面的函数 f_add 定义在包中并调用。

create or replace package my_bao is

function f_add(a number ) return number;

end;

/

create or replace package body my_bao is

function f_add(a number ) return number

as

begin

return a*2;

end;

end;

/

调用: select my_bao.f_add(2) from dual;

 

 

4.   标量变量

1 标量变量

a. 标量变量是指只能存入单个数值的变量。

b. 标量变量必须先定义后使用。

 

2 常用的标量类型

a. VARCHAR2(n) :该数据类型用于定义可变长度的字符串 n<=4000

b. CHAR(n) :该数据类型用于定义固定长度的字符串, n<=2000

c. NUMBER( 总位数 , 小数位 ) :定义整数或小数。

d. DATE :该数据类型用于定义日期和时间数据。

e. BOOLEAN :该数据用于定义布尔变量,其变量的值为 TRUE FALSE NULL 注意此类型只能在 PL/SQL 中使用,表列是没有此类型的。

f. %type :通常用于指定表的某个列的数据类型 , 可以理解为 的类型 ”( 小技巧: % ”)

示例:打印部门编号为 10 的部门名称。

 

declare

v_name dept.dname%type;

begin

select dept.dname into v_name

from dept

where deptno = 10;

dbms_output.put_line('dept = '||v_name);

end;

运行结果:

dept = ACCOUNTING

 

5. 复合变量

1 复合变量

a. 复合变量是指用于存放多个值的变量。

b. 在使用复合变量时,必须先用 TYPE 进行定义 新的数据类型 ,然后再用这些新的类型定义新的变量。

 

2 复合数据类型

a. 记录类型:可以简单理解为具有多个 属性 的变量。

DECLARE

TYPE emp_record_type IS RECORD   (

name emp.ename%TYPE,

salary emp.sal%TYPE);

emp emp_record_type;

BEGIN

SELECT ename,sal,job into emp

FROM emp WHERE empno=7788;

dbms_output.put_line(' 雇员名 :' || emp .name);

END;

b. 索引表类型

PL/SQL 索引表类似 Collection 接口,或者看成是一个 1 维数组也可以。

不连续

索引可为负数

动态增长

语法 :type xx is table of 类型 index by 整型

c. 嵌套表类型

d. 变长数组类型

e. 集合类型

 

 

6.   引用变量

1 引用变量

引用变量是指用于存放数据地址 ( 指针 ) 的变量。

 

2 好处

通过使用引用变量,可以使得应用程序共享相同对象,从而降低占用空间。

 

3 引用变量类型

a. REF CURSOR :引用游标类型

先定义游标变量,再定义该游标使用的 select 语句。具体将在后面游标讲解更深入讲解。

b. REF obj_type :引用对象类型

编写对象类型应用时,为了共享相同对象,可以使用 REF 引用对象类型, REF 实际是指向对象实例的指针。

 

7. LOB 变量

1 LOB 变量

LOB 变量是指用于存储大批量数据的变量。

 

2 分类

a. 内部 LOB :存储在数据库中,并且支持事务操作(提交、回退、保存点)。

CLOB :存储大批量字符数据 ( 指定字符集 )

NCLOB :存储大批量字符数据 ( 所有字符集 )

BLOB :存储大批量二进制数据

b. 外部 LOB :只有一种类型,该类型的数据被存储在操作系统文件中,并且不支持事务操作。

BFILE :存储指向操作系统文件的指针

 

8. 使用 SQL*Plus 绑定变量

 

a. 当在 SQL*Plus 中与 PL/SQL 块之间进行数据交互时,需要使用 SQL*Plus 绑定变量来完成。

b. 当在 PL/SQL 中引用非 PL/SQL 变量时,必须要在非 PL/SQL 变量前加冒号 (“:”)

SQL> var name varchar2(10);

SQL> BEGIN

2SELECT ename INTO :name FROM emp

3WHERE empno = 7788;

4end;

5  /

SQL> print name;

name

---------

SCOTT

 

9. PL/SQL 词汇单元

 

当编写 PL/SQL 块时,每个 PL/SQL 块都包含多行代码,而每行代码又是由多个合法单元组成的,这些合法单元被称为词汇单元。

1 PL/SQL 词汇单元分类

a. 标识符

通过使用标识符,可以定义常量、变量、异常、显式游标、游标变量、参数、子程序以及包的名称。

示例: declare v_name emp.ename%type;

b. 字面量

写在代码各种具体的数值,如数字、字符、字符串、日期值或布尔值

示例: v_name := 'lovo';

c. 分隔符

分隔符是指具有特定含义的单个符号 (+ - * /) 或组合符号 ( := >=)

示例: a := 10 + 20 ;

3 注释

a. 单行注释 -- 单行注释

b. 多行注释 /* 多行注释 */

示例

DECLARE

-- 定义 v_sal 变量

v_sal NUMBER(6 2);

BEGIN

/*

给变量赋值,

然后打印此变量

*/

v_sal := 1000;

dbms_output.put_line(v_sal);

END;

 

10.PL/SQL 代码编写规则

1   好处

使用适当的编写规则,可以提高代码的可读性,降低程序维护难度。

 

2 规则

A. 标识符命名规则

a. v_ 变量名 定义变量

b. e_ 变量名 定义异常

c. …….

B. 大小写规则

代码不区别大小写,但建议关键字大写。

C. 代码缩进

D. 嵌套块和变量范围

外部块能够访问内部块的变量,反之则不能。

全部评论

相关推荐

头像
不愿透露姓名的神秘牛友
04-29 12:10
点赞 评论 收藏
转发
头像
不愿透露姓名的神秘牛友
04-02 20:12
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务