第三篇PLSQL编程

  • 格式:docx
  • 大小:60.25 KB
  • 文档页数:12

第三章 PL/SQL编程

3.1 PL/SQL基础知识

3.1.1 什么是PL/SQL

一、什么是PL/SQL?

结合了Oracle进程语言和结构化查询语句的一种扩编语言。利用PL/SQL能够编写具有很多高级功能的程序,尽管通过量个SQL语句也能实现一样的功能,可是相较而言,PL/SQL具有更为明显的一些优势

二、在PL/SQL块中能够利用 SELECT、INSERT、UPDATE、DELETE等DML语句 、事物操纵语句和SQL函数等

。PL/SQL块不许诺直接利用 CREATE、DROP或ALTER等DDL语句

,但能够通过动态SQL来执行它们。

三、PL/SQL块的结构

声明部份

执行部份

异样处置部份

四、常量和变量的声明语法是什么?

变量:

Variable_name data_type[ (size) ] [ := init_value ];

常量:

Variable_name CONSTANT data_type := value;

四、完成例如1

操作步骤:

1.在jbit用户下创建表employee,导入数据

2. 执行语句

--方式一:通过SELECT INTO给变量赋值

DECLARE

v_ename VARCHAR2(20);

v_rate NUMBER(7,2);

c_rate_incr CONSTANT NUMBER(7,2):=1.10;

BEGIN

SELECT ename, sal* c_rate_incr INTO v_ename, v_rate

FROM employee

WHERE empno='7788';

添加输出显示语句,参考P81 例如2中的“DBMS_OUTPUT.PUT_LINE()”语句

DBMS_OUTPUT.PUT_LINE('姓名:'||v_ename||'工资:'||v_rate);

END;

显示结果图:(请截图)

--方式二:通过赋值操作符“:=”给变量赋值

DECLARE

v_ename VARCHAR2(20); v_rate NUMBER(7,2);

c_rate_incr CONSTANT NUMBER(7,2):=1.10;

BEGIN

v_ename:='SCOTT';

DBMS_OUTPUT.PUT_LINE('姓名:'||v_ename);

END;

显示结果图:(请截图)

3.1.2 PL/SQL数据类型

一、PL/SQL支持哪两种属性类型?请详细说明。

1 %TYPE 概念一个变量,其数据类型与和概念的某个数据变量的数据类型相一致,这时能够利用%TYPE

优势

1) 能够没必要明白所引用的数据库列的数据类型。

2) 所引用的数据库列的数据类型能够实时改变,容易维持一致,不用修改PL/SQL程序。

2 %ROWTYPE 返回一个记录类型,其数据类型和数据库表的数据结构相一致,这时能够利用%ROWTYPE

1) 能够没必要明白所引用的数据库中列的个数和数据类型。

2) 所引用的数据库中列的个数和数据库类型能够实时改变,容易维持一致,不用修改PL/SQL程序。

四、完成例如2

DECLARE

v_empno employee.empno%TYPE :=7788;

--表示与数据库表employee的empno列的数据类型一致

v_rec employee%ROWTYPE;

BEGIN

SELECT * INTO v_rec FROM employee WHERE empno=v_empno;

DBMS_OUTPUT.PUT_LINE

('姓名:'||v_rec.ename||'工资:'||v_rec.sal||'工作时刻:'||v_rec.hiredate);

END;

显示结果图:(请截图)

3.1.3 PL/SQL操纵语句

一、操纵结构共有3种类型,它们是什么?别离写出它们的语法。

1 条件操纵

IF THEN

PL/SQL 和 SQL语句

END IF; IF THEN

PL/SQL 和 SQL语句

ELSE

其他语句

END IF;

IF THEN

PL/SQL 和 SQL语句

ELSIF THEN

其他语句

ELSIF THEN

其他语句

ELSIF THEN

其他语句

ELSE

其他语句

END IF;

2 循环操纵

LOOP

要执行的语句;

EXIT WHEN

END LOOP;

WHILE LOOP

要执行的语句;

END LOOP;

FOR 循环计数器 IN [ REVERSE ] 下限…上限 LOOP 要执行的语句;

END LOOP;

3 顺序操纵

二、完成例如3

DECLARE

v_counter NUMBER := 5;

BEGIN

DBMS_OUTPUT.PUT_LINE('v_counter的当前值为:'||v_counter);

IF v_counter >= 10 THEN

NULL; --为了使语法变得成心义,去掉NULL会报语法错误

ELSE

v_counter := v_counter + 10;

DBMS_OUTPUT.PUT_LINE('v_counter的改变后值为:'||v_counter);

END IF;

END;

显示结果图:(请截图)

3.2 异样处置

用来处置正常执行进程中未预料的事件。

1 预概念异样

DECLARE

v_ename employee.ename%TYPE;

BEGIN

SELECT ename INTO v_ename

FROM employee

WHERE empno=1234; dbms_output.put_line('雇员名:'||v_ename);

EXCEPTION

WHEN NO_DATA_FOUND THEN

dbms_output.put_line('雇员号不正确');

WHEN TOO_MANY_ROWS THEN

dbms_output.put_line('查询只能返回单行');

WHEN OTHERS THEN

dbms_output.put_line('错误号:'||SQLCODE||'错误描述:'||SQLERRM);

END;

2 自概念异样

步骤:

(1) 声明异样 e_comm_is_null EXCEPTION; --概念异样类型变量

(2) 抛出异样 RAISE e_comm_is_null;

(3)异样处置

DECLARE

v_comm employeem%TYPE;

e_comm_is_null EXCEPTION; --概念异样类型变量

BEGIN

SELECT comm INTO v_comm FROM employee WHERE empno=7788;

IF v_comm IS NULL THEN

RAISE e_comm_is_null;

END IF;

EXCEPTION

WHEN NO_DATA_FOUND THEN

dbms_output.put_line('雇员不存在!错误为:'||SQLCODE||SQLERRM);

WHEN e_comm_is_null THEN

dbms_output.put_line('该雇员无补助');

WHEN others THEN dbms_output.put_line('显现其他异样');

END;

例如5

3.3 显示游标

一、游标的分类

静态游标(隐式游标和显示游标)和动态游标

二、显示游标的利用步骤:

1.声明游标

2.打开游标

3.提取游标

4.关闭游标

三、显示游标属性

P89

四、利用游标删除或更新

例如7

步骤:

1. 先查询两表的联合查询的记录

SELECT ename,sal

FROM employee e INNER join dept d

ON e.deptno=d.deptno 2. 执行例如7的代码

3. 再查询两表的联合查询的记录

截图

更新前 更新后

3.4 存储进程

一、子程序的组成

二、存储进程用法

1.存储进程的大体用法

(1)创建存储进程

(2)挪用存储进程

在PL/SQL块中的挪用

(3)存储进程的参数模式

(4)存储进程的访问权限

(5)删除存储进程

例如9

*

===========================================================

| 添加员工记录。

============================================================

*/