根据提供的文档内容,我们可以归纳出一系列关于Oracle数据库及其PL/SQL编程语言的重要知识点。这些知识点不仅包括基础的语法和概念,还涉及到了更高级的功能,如存储过程、函数、触发器等。 ### 1. PL/SQL 基础语法 #### %type用法 - `%type`用于声明变量时指定其数据类型与数据库表中的某列相同。 - 示例: ```sql DECLARE myid dept.id%type; -- 提取dept表中id列的类型 myname dept.name%type; -- 提取dept表中name列的类型 BEGIN SELECT id, name INTO myid, myname FROM dept; DBMS_OUTPUT.PUT_LINE(myid); DBMS_OUTPUT.PUT_LINE(myname); END; ``` #### %rowtype用法 - `%rowtype`用于创建一个与表或视图具有相同结构的记录类型。 - 示例: ```sql 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; ``` #### TYPE用法 - `TYPE`用于定义自定义的数据类型,类似于其他语言中的结构体。 - 示例: ```sql 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; ``` ### 2. 控制结构 #### 游标使用 - **游标**是PL/SQL中处理记录集的一种方式。 - 示例: ```sql 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('DEPT ID: ' || 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`块来实现的。 - 示例: ```sql DECLARE -- 定义变量 v_value NUMBER; BEGIN -- 执行可能抛出异常的语句 SELECT id INTO v_value FROM dept WHERE id = '001'; -- 正常执行流程 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('发生了未知的错误: ' || SQLERRM); END; ``` ### 4. 存储过程与函数 - **存储过程**与**函数**是在数据库中定义的可重复使用的代码块。 - 示例: ```sql -- 创建存储过程 CREATE OR REPLACE PROCEDURE p_add (p_num1 IN NUMBER, p_num2 IN NUMBER, p_result OUT NUMBER) AS BEGIN p_result := p_num1 + p_num2; END; / -- 调用存储过程 DECLARE v_result NUMBER; BEGIN p_add(10, 20, v_result); DBMS_OUTPUT.PUT_LINE('结果: ' || v_result); END; / -- 创建函数 CREATE OR REPLACE FUNCTION f_add (p_num1 NUMBER, p_num2 NUMBER) RETURN NUMBER AS BEGIN RETURN p_num1 + p_num2; END; / -- 调用函数 DECLARE v_result NUMBER; BEGIN v_result := f_add(10, 20); DBMS_OUTPUT.PUT_LINE('结果: ' || v_result); END; / ``` ### 5. 软件包与封装 - **软件包**是一种组织和管理PL/SQL对象的方式,通常包含一组相关的子程序、函数、游标等。 - 示例: ```sql -- 创建软件包规范 CREATE OR REPLACE PACKAGE pkg_math AS FUNCTION add (p_num1 NUMBER, p_num2 NUMBER) RETURN NUMBER; END pkg_math; / -- 创建软件包体 CREATE OR REPLACE PACKAGE BODY pkg_math AS FUNCTION add (p_num1 NUMBER, p_num2 NUMBER) RETURN NUMBER AS BEGIN RETURN p_num1 + p_num2; END add; END pkg_math; / -- 使用软件包中的函数 DECLARE v_result NUMBER; BEGIN v_result := pkg_math.add(10, 20); DBMS_OUTPUT.PUT_LINE('结果: ' || v_result); END; / ``` ### 6. 触发器 - **触发器**是在特定事件发生时自动执行的一段代码。 - 示例: ```sql -- 创建触发器 CREATE OR REPLACE TRIGGER trg_after_insert AFTER INSERT ON emp FOR EACH ROW BEGIN INSERT INTO emp_log (emp_id, action, log_time) VALUES (:NEW.emp_id, 'INSERT', SYSDATE); END; / -- 插入新记录并触发触发器 INSERT INTO emp (emp_id, first_name, last_name) VALUES (100, 'John', 'Doe'); COMMIT; ``` 以上知识点涵盖了Oracle数据库中的PL/SQL编程语言的基本用法以及一些高级功能的应用,对于初学者来说是非常宝贵的学习资源。
- 粉丝: 0
- 资源: 8
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于HiEasyX库的学习工具系统.zip
- (源码)基于JSP+Servlet+JDBC的学生宿舍管理系统.zip
- (源码)基于Arduino和Raspberry Pi的自动化花园系统.zip
- (源码)基于JSP和Servlet的数据库管理系统.zip
- (源码)基于Python的文本相似度计算系统.zip
- (源码)基于Spring Boot和Redis的高并发秒杀系统.zip
- (源码)基于Java的Web汽车销售管理系统.zip
- (源码)基于Python的智能家居系统.zip
- (源码)基于Python和CPM模型的中文文本生成系统.zip
- (源码)基于Java Swing和MySQL的教务管理系统.zip