赞
踩
【示例1.1】
======================================================================================================================
【示例2.1】
说明:示例2共定义了6个变量,分别用“:=”赋值运算符或DEFAULT 关键字对变量进行了初始化或赋值。
其中:c_tax_rate为常量,在数据类型前加了 “CONSTANT”
关键字;v_valid变量在赋值运算符前面加了关键字“NOT NULL”,强制不能为空。
如果变量是布尔型,它的值只能是“TRUE”、“FALSE”或“NULL”。
本练习中的变量v_valid布尔变量的值只能取“TRUE”或“FALSE”。
=============================================================
【训练2.2】
=====================================================================================
=====================================================================================
varray(10)
=====================================================================================
==========================================================================================
==================================================================================
==================================================================================
SET SERVEROUTPUT ON
DECLARE
BEGIN
==================================================
SET SERVEROUTPUT ON
DECLARE
v_job
BEGIN
SELECT job INTO v_job
FROM emp
WHERE empno=7788;
CASE v_job
WHEN 'PRESIDENT' THEN
WHEN 'MANAGER' THEN
WHEN 'SALESMAN' THEN
WHEN 'ANALYST' THEN
WHEN 'CLERK' THEN
ELSE
END CASE;
END;
说明:以上实例检索雇员7788的职务,通过CASE结构转换成中文输出。
【练习1】将雇员号修改成其他已知雇员号,重新执行。
=======================================================
DECLARE
BEGIN
END;
============================================================
DECLARE
BEGIN
END;
============================================================
DECLARE
BEGIN
END;
===============================================================
BEGIN
END;
1*
2**
3***
4****
5*****
6******
7*******
8********
==============================================================
BEGIN
END;
1
2
3
4
5
6
7
8
9
PL/SQL 过程已成功完成。
=====================================================================
DECLARE
v_count NUMBER(2) := 1;
BEGIN
END;
输出结果为:
PL/SQL 过程已成功完成。
-----------------------------------------------------------------
----------------------------------------------------------------
============================================================================
DECLARE
BEGIN
FOR I IN 1..10
END;
输出结果为:
4037913
PL/SQL 过程已成功完成。
-----------------------------------------------------------------
SET SERVEROUTPUT ON
DECLARE
BEGIN
END;
=================================================================
=================================================================
=================================================================
IF v_num=1 THEN
END IF;
END;
=================================================================
=================================================================
SET LINESIZE 100
SET PAGESIZE 100
DECLARE
BEGIN
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
PL/SQL 过程已成功完成。
说明:在本程序中使用到了固定次数的循环以及SIN和LPAD函数,通过正确地设置步长、幅度和位移的参数,在屏幕上可正确地显示图形
=================================================================
6.4 练习
=================================================================
=================================================================
=================================================================
IF i>20 THEN
ELSIF i>15 THEN
ELSE
END IF;
=================================================================
===============================================================
===============================================================
【训练6.1】 使用隐式游标的属性,判断对雇员工资的修改是否成功。
步骤1:输入和运行以下程序:
BEGIN
END;
=================================================================
【训练7.1】
DECLARE
BEGIN
END;
================================================================
DECLARE
BEGIN
END;
==================================================================
DECLARE
BEGIN
END;
执行结果为:
KING,5000
SCOTT,3000
FORD,3000
PL/SQL 过程已成功完成。
============================================================================
DECLARE
BEGIN
END;
7369SMITH
7499ALLEN
7521WARD
7566JONES
?
==============================================================================
BEGIN
END;
执行结果为:
SMITH
ALLEN
WARD
JONES
==================================================================================
DECLARE
BEGIN
END;
1-SMITH
2-ALLEN
3-WARD
?
=========================================================
【训练10.1】
DECLARE
BEGIN
END;
================================================================
===============================================================================
DECLARE
begin
END;
===============================================================================
declare
begin
end;
ALLEN
WARD
MARTIN
BLAKE
CLARK
ADAMS
JAMES
包含字母B的名字:
BLAKE
包含字母C的名字:
CLARK
SCOTT
说明:使用了二重循环,在外循环体中,动态生成游标的SELECT语句,然后打开。
通过语句letter:=chr(ascii(letter)+1)可获得字母表中的下一个字母。
==========================================================================
DECLARE
v_name VARCHAR2(10);
BEGIN
EXCEPTION
END;
说明:在以上查询中,因为编号为1234的雇员不存在,所以将发生类型为“NO_DATA_FOUND”的异常。
“NO_DATA_FOUND”是系统预定义的错误类型,
EXCEPTION部分下的WHEN语句将捕捉到该异常,
并执行相应代码部分。在本例中,输出用户自定义的错误信息“编号错误,
没有找到相应雇员!”。如果发生其他类型的错误,
将执行OTHERS条件下的代码部分,显示“发生其他错误!”
==========================================================================
DECLARE
BEGIN
EXCEPTION
END;
DECLARE
BEGIN
END;
======================================================================
SET SERVEROUTPUT ON
===============================================================
DECLARE
BEGIN
EXCEPTION
END;
--------------------------------------------
=========================================================================
【练习1】修改雇员的工资,通过引发异常控制修改范围在600~6000之间。
=========================================================================
=========================================================================
阶段训练
=========================================================================
=========================================================================
DECLARE
BEGIN
...
EXCEPTION
...
WHEN OTHERS THEN
END;
SET SERVEROUTPUT ON
DECLARE
v_empno NUMBER(5):=7788;
emp_rec emp%ROWTYPE;
BEGIN
INSERT INTO emp1 VALUES emp_rec;
END;
PL/SQL 过程已成功完成。
步骤2:显示复制结果:
SELECT empno,ename,job FROM emp1;
执行结果为:
-------------- -------------- ----------------
说明:emp_rec变量是根据emp表定义的记录变量,
SELECT...INTO...语句将整个记录传给该变量。
INSERT语句将整个记录变量插入emp1表,如果插入成功(SQL%FOUND为真),则提交事务,否则回滚撤销事务。
试修改雇员编号为7902,重新执行以上程序。
==============================================================
SET SERVEROUTPUT ON
BEGIN
END;
输出结果为:
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
?
==========================================================================
输出结果为:
部门列表
------------------------------------
部门编号:10
部门名称:ACCOUNTING
所在城市:NEW YORK
------------------------------------
部门编号:20
部门名称:RESEARCH
所在城市:DALLAS
...
共有4个部门!
PL/SQL 过程已成功完成。
==========================================================================
【训练4】
SET SERVEROUTPUT ON
DECLARE
v_manager
BEGIN
DBMS_OUTPUT.PUT_LINE('部门名称
==========================================================================
SET SERVEROUTPUT ON
DECLARE
SMITH
JAMES
MARTIN
MILLER
ALLEN
ADAMS
TURNER
WARD
BLAKE
CLARK
JONES
FORD
KING
-----------------------------------------------
增加工资人数:5 剩余工资:3
PL/SQL 过程已成功完成。
==========================================================================
==========================================================================
练 习
==========================================================================
==========================================================================
==========================================================================
==========================================================================
存储过程
==========================================================================
==========================================================================
【训练15.1】
CREATE OR REPLACE PROCEDURE EMP_COUNT
AS
BEGIN
END;
步骤3:按“执行”按钮进行编译。
说明:在该训练中,V_TOTAL变量是存储过程定义的局部变量,用于接收查询到的雇员总人数。
==========================================================================
【训练15.2】
步骤4:执行以上程序,结果为:
==========================================================================
【训练15.3】
CREATE OR REPLACE PROCEDURE EMP_LIST
AS
BEGIN
END;
EXECUTE EMP_LIST
显示结果为:
7369SMITH
7499ALLEN
7521WARD
7566JONES
说明:以上的EMP_LIST存储过程中定义并使用了游标,用来循环显示所有雇员的信息。然后调用已经成功编译的存储过程EMP_COUNT,用来附加显示雇员总人数。通过EXECUTE命令来执行EMP_LIST存储过程。
==========================================================================
【训练16.1】
CREATE OR REPLACE PROCEDURE CHANGE_SALARY(P_EMPNO IN NUMBER DEFAULT 7788,P_RAISE NUMBER DEFAULT 10)
AS
BEGIN
EXCEPTION
END;
==========================================================================
参数的值由调用者传递,传递的参数的个数、类型和顺序应该和定义的一致。如果顺序不一致,可以采用以下调用方法。如上例,执行语句可以改为:
EXECUTE CHANGE_SALARY(P_RAISE=>80,P_EMPNO=>7788);
可以看出传递参数的顺序发生了变化,并且明确指出了参数名和要传递的值,=>运算符左侧是参数名,右侧是参数表达式,这种赋值方法的意义较清楚。
【练习1】创建插入雇员的存储过程INSERT_EMP,并将雇员编号等作为参数。
==========================================================================
CREATE OR REPLACE PROCEDURE EMP_COUNT(P_TOTAL OUT NUMBER)
AS
BEGIN
END;
DECLARE
V_EMPCOUNT NUMBER;
BEGIN
END;
==========================================================================
CREATE OR REPLACE PROCEDURE ADD_REGION(P_HPONE_NUM IN OUT VARCHAR2)
AS
BEGIN
END;
DECLARE
BEGIN
END;
==========================================================================
CREATE OR REPLACE FUNCTION GET_EMP_NAME(P_EMPNO NUMBER DEFAULT 7788)
AS
BEGIN
EXCEPTION
END;
BEGIN
END;
=============================================================================
TEXT
--------------------------------------------------------------------------------
PROCEDURE EMP_COUNT(P_TOTAL OUT NUMBER)
AS
BEGIN
END;
===================================================================================
==================================================================================
==================================================================================
==================================================================================
说明:可以看出存储过程EMP_LIST依赖一些系统包、EMP表和EMP_COUNT存储过程。如果删除了EMP表或EMP_COUNT存储过程,EMP_LIST将变成无效。
===================================================================================
==================================================================================
CREATE OR REPLACE PACKAGE EMPLOYE --包头部分
END EMPLOYE;
/
==============================================================
CREATE OR REPLACE PACKAGE BODY EMPLOYE --包体部分
EMPLOYE EMP%ROWTYPE;
END EMPLOYE;
【练习1】为包增加修改雇员职务和部门编号的功能。
===================================================================================
===================================================================================
===================================================================================
===================================================================================
下面的训练通过定义和创建完整的包EMP_PK并综合运用本章的知识,完成对雇员表的插入、删除等功能,包中的主要元素解释如表所示。
程序结构
V_EMP_COUNT
INIT
LIST_EMP
INSERT_EMP
DELETE_EMP
CHANGE_EMP_SAL
V_MESSAGE
C_MAX_SAL
C_MIN_SAL
SHOW_MESSAGE
EXIST_EMP
===================================================================================
---------------------------- 显示雇员列表过程 ---------------------
----------------------------- 插入雇员过程 -----------------------------
步骤2:初始化包:
SET SERVEROUTPUT ON
EXECUTE EMP_PK.INIT(6000,600);
显示为:
提示信息:初始化过程已经完成!
步骤4:插入一个新记录:
EXECUTE EMP_PK.INSERT_EMP(8001,'小王','CLERK',1000);
显示结果为:
提示信息:雇员8001已插入!
PL/SQL 过程已成功完成。
步骤5:通过全局变量V_EMP_COUNT查看雇员人数:
BEGIN
DBMS_OUTPUT.PUT_LINE(EMP_PK.V_EMP_COUNT);
END;
显示结果为:
15
PL/SQL 过程已成功完成。
==============================================================================================
8 练习
==============================================================================================
==============================================================================================
==============================================================================================
9.触发器
==============================================================================================
==============================================================================================
【训练20.1】
==============================================================================================
==============================================================================================
CREATE OR REPLACE TRIGGER log_sal
BEFORE
UPDATE OF sal
ON scott.emp
FOR EACH ROW
WHEN (new.job='CLERK' AND (ABS(new.sal-old.sal)>200))
DECLARE
BEGIN
END;
------------------ --------------------------------------------------------
==============================================================================================
==============================================================================================
CREATE OR REPLACE TRIGGER CHECK_SAL
BEFORE
UPDATE
ON emp
FOR EACH ROW
BEGIN
END;
------------------ ------------- ------------- ------------------------
=================================================================================
CREATE OR REPLACE TRIGGER CASCADE_UPDATE
AFTER
UPDATE OF deptno
ON DEPT
FOR EACH ROW
BEGIN
END;
========================================================================
CREATE OR REPLACE TRIGGER INITCAP
BEFORE INSERT
ON EMP
FOR EACH ROW
BEGIN
END;
执行结果:
触发器已创建。
=====================================================================
CREATE OR REPLACE TRIGGER CHECK_TIME
BEFORE
UPDATE OR INSERT OR DELETE
ON EMP
BEGIN
END;
===========================================================================
===========================================================================
CREATE TABLE userlog (
USERNAME VARCHAR2(20),
LOGON_TIME DATE);
执行结果:
表已创建。
步骤2:创建数据库STARTUP事件触发器:
CREATE OR REPLACE TRIGGER INIT_LOGON
AFTER
STARTUP
ON DATABASE
BEGIN
END;
执行结果:
触发器已创建。
步骤3:创建数据库LOGON事件触发器:
CREATE OR REPLACE TRIGGER DATABASE_LOGON
AFTER
LOGON
ON DATABASE
BEGIN
END;
执行结果:
触发器已创建。
执行结果:
已连接。
已连接。
----------------------------- -----------------------------------------
-------------------------------- ---------------------------------------
===========================================================================
CREATE OR REPLACE TRIGGER STUDENT_LOGON
AFTER
LOGON ON STUDENT.SCHEMA
BEGIN
END;
执行结果:
触发器已创建。
=============================================================================
CREATE OR REPLACE TRIGGER NODROP_EMP
BEGIN
END;
============================================================================
CREATE OR REPLACE VIEW emp_name AS SELECT ename FROM emp;
CREATE OR REPLACE TRIGGER change_name
DECLARE
BEGIN
END;
=================================================================================================================================
===========================================================================================
===========================================================================================
===========================================================================================
阶段训练
===========================================================================================
===========================================================================================
mgr=:new.mgr,
END;
执行结果:
触发器已创建。
执行结果:
已删除 1 行。
已创建 1 行。
已更新 1 行。
提交完成。
===========================================================================================
===========================================================================================
练习
===========================================================================================
===========================================================================================
保存点
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。