Oracle_plsql程序设计基础
根据提供的文档内容,我们可以深入探讨Oracle PL/SQL程序设计的基础知识点。这些知识点涵盖了PL/SQL的基本语法、控制结构、异常处理、存储过程与函数、软件包管理、以及触发器等重要概念。 ### 1. 基本语法 #### %type用法 `%type`是PL/SQL中的一个特性,它允许我们定义一个变量或列,其数据类型与另一个表中的某列相同。例如: ```plsql DECLARE myid DEPT.ID%TYPE; myname DEPT.NAME%TYPE; BEGIN SELECT ID, NAME INTO myid, myname FROM DEPT; DBMS_OUTPUT.PUT_LINE(myid); DBMS_OUTPUT.PUT_LINE(myname); END; / ``` 在这个例子中,`myid`和`myname`的数据类型将与`DEPT`表中的`ID`和`NAME`列相同。这有助于确保数据的一致性和减少出错的可能性。 #### %rowtype用法 `%rowtype`允许我们定义一个变量,该变量包含了指定表的所有列。这对于处理多个列非常有用: ```plsql DECLARE TYPE TYPE_DEPT IS TABLE OF DEPT%ROWTYPE INDEX BY BINARY_INTEGER; tb TYPE_DEPT; BEGIN tb(1).ID := '001'; tb(2).ID := '001'; DBMS_OUTPUT.PUT_LINE(tb.COUNT); END; / ``` 这里,`tb`是一个包含了`DEPT`表所有列的表类型变量。 #### TYPE用法 `TYPE`用于定义自定义的数据类型,类似于其他编程语言中的结构体。例如: ```plsql DECLARE lv_order_date DATE := SYSDATE; lv_last_txt VARCHAR2(5) DEFAULT '001'; lv_last VARCHAR2(10) NOT NULL := 'us'; TYPE TYPE_TEST IS RECORD ( myid DEPT.ID%TYPE, myname DEPT.NAME%TYPE ); rec TYPE_TEST; BEGIN lv_order_date := SYSDATE; DBMS_OUTPUT.PUT_LINE(lv_last); SELECT ID, NAME INTO rec FROM DEPT; DBMS_OUTPUT.PUT_LINE(rec.myid); DBMS_OUTPUT.PUT_LINE(rec.myname); END; / ``` 在这里,`TYPE_TEST`是一个包含了两个字段的记录类型,可以用来存储`DEPT`表中的ID和名称信息。 ### 2. 控制结构 #### 游标的使用 游标在PL/SQL中是非常重要的概念,它允许我们逐行处理查询结果。例如: ```plsql DECLARE g_id CHAR(10) := '002'; find_not CHAR(1) := 'N'; CURSOR cur IS SELECT * FROM DEPT; TYPE TYPE_DEPT IS RECORD ( myid DEPT.ID%TYPE, myname DEPT.NAME%TYPE, myaddr DEPT.ADDR%TYPE ); rec TYPE_DEPT; BEGIN OPEN cur; LOOP FETCH cur INTO rec; EXIT WHEN cur%NOTFOUND; IF rec.myid = g_id THEN find_not := 'Y'; DBMS_OUTPUT.PUT_LINE('Find it!!'); DBMS_OUTPUT.PUT_LINE('DEPTID: ' || rec.myid); DBMS_OUTPUT.PUT_LINE('NAME: ' || rec.myname); DBMS_OUTPUT.PUT_LINE('ADDR: ' || rec.myaddr); END IF; END LOOP; CLOSE cur; IF find_not = 'N' THEN -- 处理未找到的情况 END IF; END; / ``` 这个例子展示了如何打开一个游标,遍历结果集,并进行条件判断。 ### 3. 异常处理 #### exception用法 PL/SQL支持异常处理机制,可以在程序中捕捉并处理运行时出现的错误。例如: ```plsql DECLARE v_id NUMBER; BEGIN -- 尝试获取不存在的记录 SELECT ID INTO v_id FROM DEPT WHERE ID = '9999'; 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('发生未知错误'); END; / ``` 这里展示了如何使用`WHEN`子句来捕捉不同的异常情况,并给出相应的处理方式。 ### 4. 存储过程与函数 #### procedure的建立和调用 存储过程是一种存储在数据库中的程序单元,可以接受输入参数,执行一系列操作,并返回结果。例如: ```plsql CREATE OR REPLACE PROCEDURE print_dept_info ( p_id IN DEPT.ID%TYPE ) AS BEGIN FOR rec IN (SELECT * FROM DEPT WHERE ID = p_id) LOOP DBMS_OUTPUT.PUT_LINE('ID: ' || rec.ID); DBMS_OUTPUT.PUT_LINE('NAME: ' || rec.NAME); DBMS_OUTPUT.PUT_LINE('ADDR: ' || rec.ADDR); END LOOP; END; / -- 调用存储过程 EXECUTE print_dept_info('001'); ``` #### function的建立和调用 函数类似于存储过程,但通常用于返回单个值。例如: ```plsql CREATE OR REPLACE FUNCTION get_dept_name ( p_id IN DEPT.ID%TYPE ) RETURN DEPT.NAME%TYPE AS v_name DEPT.NAME%TYPE; BEGIN SELECT NAME INTO v_name FROM DEPT WHERE ID = p_id; RETURN v_name; END; / -- 调用函数 VARIABLE dept_name VARCHAR2(50); EXECUTE :dept_name := get_dept_name('001'); DBMS_OUTPUT.PUT_LINE(:dept_name); ``` ### 5. 软件包管理 #### 软件包(PACKAGE)的建立和调用 软件包是一组相关的过程、函数和其他对象的集合,它们被组织在一起以便于管理和复用。例如: ```plsql CREATE OR REPLACE PACKAGE dept_pkg AS TYPE dept_rec_type IS RECORD ( id DEPT.ID%TYPE, name DEPT.NAME%TYPE, addr DEPT.ADDR%TYPE ); PROCEDURE print_dept_info ( p_id IN DEPT.ID%TYPE ); END dept_pkg; / CREATE OR REPLACE PACKAGE BODY dept_pkg AS PROCEDURE print_dept_info ( p_id IN DEPT.ID%TYPE ) AS v_dept dept_rec_type; BEGIN SELECT * INTO v_dept FROM DEPT WHERE ID = p_id; DBMS_OUTPUT.PUT_LINE('ID: ' || v_dept.id); DBMS_OUTPUT.PUT_LINE('NAME: ' || v_dept.name); DBMS_OUTPUT.PUT_LINE('ADDR: ' || v_dept.addr); END; END dept_pkg; / -- 调用软件包中的过程 EXECUTE dept_pkg.print_dept_info('001'); ``` ### 6. 触发器 #### 触发器的建立 触发器是在特定事件发生时自动执行的一段PL/SQL代码。例如,在更新`DEPT`表时触发一段代码: ```plsql CREATE OR REPLACE TRIGGER update_dept_info AFTER UPDATE OF NAME ON DEPT FOR EACH ROW DECLARE BEGIN DBMS_OUTPUT.PUT_LINE('部门名称已更改: ' || :NEW.NAME); END; / ``` 这个触发器会在每次更新`DEPT`表中的`NAME`列时自动执行。 以上就是关于Oracle PL/SQL程序设计的基础知识点概述。这些内容涵盖了从基本语法到高级功能的各个方面,对于学习和掌握Oracle数据库编程非常重要。
剩余22页未读,继续阅读
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 3e53940d22a0327bf2fe77db43da8529 (1).png
- 基于小程序的傣族节日及民间故事推广小程序源码(小程序毕业设计完整源码+LW).zip
- 基于Java多语言开发的小程序商城系统设计源码
- 基于Vue框架的排课项目前端设计源码
- 基于的学生宿舍管理系统+node源码(小程序毕业设计完整源码).zip
- 基于指纹识别技术的社区矫正人员管理平台设计源码
- 基于Java的选课管理系统GUI设计源码
- 基于C#开发的医院病人出入院管理系统设计源码
- 基于小程序的农产品商城小程序源码(小程序毕业设计完整源码).zip
- 集冲模、装配和检测于一体的装配机sw19可编辑全套技术资料100%好用.zip
- 基于小程序的“健康早知道”源码(小程序毕业设计完整源码+LW).zip
- 基于HUST2024软件工程项目的儿童学习系统CSS设计源码
- 基于光电心率检测技术的Heartrate设计源码
- 基于小程序的“口腔助手”小程序的设计与实现源码(小程序毕业设计完整源码+LW).zip
- 基于PHP的简单轻巧灵活工作流引擎设计源码
- 流水线风干机sw18可编辑全套技术资料100%好用.zip