1. PL/SQL的定义与特点

PL/SQL是Oracle公司开发的一种编程语言,它是对SQL的扩展。PL/SQL程序可以定义变量、数据类型、函数、过程、游标等,且能够包含SQL语句。PL/SQL的设计目的是为SQL添加编程能力,支持结构化的编程和复杂的数据处理。

特点:

  • 模块化设计思想:PL/SQL支持模块化设计,可以在程序中定义函数、过程和触发器,方便复用和管理代码。
  • 跨平台支持:PL/SQL程序可以在不同平台之间迁移,且与不同计算机系统之间的运作无缝兼容。
  • 高效的数据访问:通过PL/SQL,SQL语句的执行更为高效,减少了客户端与服务器之间的数据交互频次,从而提升性能。

举例:
假设有一个SQL查询,用于查询员工信息:

SELECT ename, sal FROM emp WHERE empno = 7369;

在PL/SQL中,可以将此查询封装到一个过程(Procedure)中,这样在需要的时候,只需调用这个过程,而不需要每次都手动执行SQL查询:

CREATE OR REPLACE PROCEDURE get_employee_info (p_empno IN NUMBER) AS
  v_ename emp.ename%TYPE;
  v_sal emp.sal%TYPE;
BEGIN
  SELECT ename, sal INTO v_ename, v_sal 
  FROM emp 
  WHERE empno = p_empno;
  
  DBMS_OUTPUT.PUT_LINE('Employee Name: ' || v_ename || ' Salary: ' || v_sal);
END;
/

执行这个过程:

BEGIN
  get_employee_info(7369);
END;
/
Employee Name: SMITH Salary: 800

2. 传统SQL与PL/SQL的执行方式

传统SQL和PL/SQL的执行方式:

  • 传统SQL执行方式:客户端应用程序每发送一条SQL语句,数据库服务器就处理并返回结果。每次请求都会经历发送请求、服务器处理、返回结果的循环过程。
  • PL/SQL执行方式:PL/SQL程序是作为一个整体来执行的,客户端仅需发送一次请求,服务器执行后一次性返回结果,这样减少了网络通信的次数,提高了执行效率。

举例:
在传统的SQL执行中,假设你要查询三次不同的员工信息,传统的做法是分别发送三次查询请求:

SELECT ename, sal FROM emp WHERE empno = 7369;
SELECT ename, sal FROM emp WHERE empno = 7499;
SELECT ename, sal FROM emp WHERE empno = 7521;

而使用PL/SQL方式,可以一次性获取所有结果:

CREATE OR REPLACE PROCEDURE get_multiple_employees AS
  CURSOR emp_cursor IS
    SELECT ename, sal FROM emp WHERE empno IN (7369, 7499, 7521);
  v_ename emp.ename%TYPE;
  v_sal emp.sal%TYPE;
BEGIN
  OPEN emp_cursor;
  LOOP
    FETCH emp_cursor INTO v_ename, v_sal;
    EXIT WHEN emp_cursor%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE('Employee Name: ' || v_ename || ' Salary: ' || v_sal);
  END LOOP;
  CLOSE emp_cursor;
END;
/

调用该过程:

BEGIN
  get_multiple_employees;
END;
/
Employee Name: SMITH Salary: 800
Employee Name: ALLEN Salary: 1600
Employee Name: WARD Salary: 1250

3. PL/SQL块结构的组成

PL/SQL的基本结构单元是“块”,一个块包含以下三部分:

  • 声明部分(DECLARE):用于声明变量、常量、游标等。声明的元素仅在该块内有效。
  • 执行部分(BEGIN...END):包含具体的PL/SQL代码,是块的核心部分,必须存在。
  • 异常处理部分(EXCEPTION):用于处理代码执行过程中可能发生的错误或异常。

举例:
以下是一个简单的PL/SQL块示例,包含所有三部分:

DECLARE
  v_message VARCHAR2(50);
BEGIN
  v_message := 'Hello, PL/SQL!';
  DBMS_OUTPUT.PUT_LINE(v_message);
EXCEPTION
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('An error occurred.');
END;
/

执行结果:

Hello, PL/SQL!

4. PL/SQL块的执行

PL/SQL块可以直接在SQL*Plus或其他支持PL/SQL的客户端工具中执行。最简单的PL/SQL块只有一个执行部分(BEGIN...END),没有声明和异常处理部分。PL/SQL块的执行结果可以通过DBMS_OUTPUT.PUT_LINE等输出到控制台。

举例:
以下是一个最简单的PL/SQL块示例:

BEGIN
  DBMS_OUTPUT.PUT_LINE('Hello, World!');
END;
/

运行结果如图7-2所示,控制台输出“Hello, World!”。

5. PL/SQL块的用途与应用

PL/SQL块是用于定义复杂的业务逻辑的单元,它可以被存储在数据库中作为存储过程、函数或触发器。PL/SQL块通过编程控制流程,支持条件判断、循环处理、异常捕获等,极大提高了数据库操作的灵活性和功能性。

举例:
假设需要在数据库中插入一条新员工记录,并在插入成功后输出一条确认信息:

CREATE OR REPLACE PROCEDURE add_employee (
  p_empno IN emp.empno%TYPE,
  p_ename IN emp.ename%TYPE,
  p_sal IN emp.sal%TYPE
) AS
BEGIN
  INSERT INTO emp (empno, ename, sal) 
  VALUES (p_empno, p_ename, p_sal);
  
  DBMS_OUTPUT.PUT_LINE('Employee added successfully: ' || p_ename);
EXCEPTION
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('Failed to add employee: ' || p_ename);
END;
/

调用该过程:

BEGIN
  add_employee(7934, 'MILLER', 1300);
END;
/
Employee added successfully: MILLER

非常感谢您读到这里!如果您觉得这篇文章对您有帮助,可以关注一下博主。关注后,您将第一时间获得最新的AI、云计算、运维(Linux、数据库,容器等)技术,以及更多实用的技能干货。


无论你是AI新手还是AI专家,学习最前沿的AI技术,AI创富俱乐部你值得拥有!

本文由mdnice多平台发布


逼格高的汤圆
10 声望2 粉丝