一、基本语法
PL/SQL是Oracle数据库中的一种编程语言,基于SQL语言扩展而来,既扩展了SQL的语句操作,也提供了一些面向过程的编程功能。以一个简单的Hello World程序为例:
DECLARE
message varchar2(20) := 'Hello, World!';
BEGIN
dbms_output.put_line(message);
END;
关键字DECLARE标识了变量的声明,可以在其中声明一些变量。BEGIN标识程序的开始,END标识程序的结束。dbms_output.put_line()函数可以将信息打印至控制台。
除此之外,PL/SQL还支持分支语句、循环语句、异常处理等常见编程特性。
二、处理CURSOR
将SQL查询结果集的指针存储在游标对象中,以便于在PL/SQL程序中进行操作。
--以下是一份处理游标的代码
DECLARE
CURSOR emp_cursor IS
SELECT first_name, last_name, salary FROM employees WHERE salary > 10000 ORDER BY salary DESC;
BEGIN
FOR emp IN emp_cursor LOOP
dbms_output.put_line(emp.first_name || ' ' || emp.last_name || ', ' || emp.salary);
END LOOP;
END;
在以上代码中,我们先定义一个名为emp_cursor的游标对象,存储的是查询结果集 SELECT first_name, last_name, salary from employees WHERE salary > 10000 ORDER BY salary DESC。FOR-IN循环遍历游标的结果集,将每一条记录的first_name、last_name和salary值输出出来。如果需要在查询结果中增加或修改记录,需要使用游标和UPDATE或INSERT语句连接使用。
三、存储过程
存储过程是PL/SQL程序的一种,类似于函数,但不会返回值。在存储过程中我们可以使用变量和条件控制来编写复杂的业务逻辑。
--以下是一份简单的存储过程代码
CREATE OR REPLACE PROCEDURE increase_salary (p_employee_id NUMBER, p_increase_amount NUMBER) AS
v_salary employees.salary%TYPE;
BEGIN
SELECT salary INTO v_salary FROM employees WHERE employee_id = p_employee_id;
UPDATE employees SET salary = v_salary + p_increase_amount WHERE employee_id = p_employee_id;
COMMIT;
END increase_salary;
这是一个名为increase_salary的存储过程,接受两个输入参数,一个员工ID和一个增加工资的数值。SELECT语句获取员工ID对应的工资,然后使用UPDATE命令将工资更新至原来的基础上增加p_increase_amount,并使用COMMIT将之前的修改进行提交。
四、触发器
触发器是数据库对象,它响应数据库表上的事件。当满足指定的条件时,触发器会自动启动。
--以下是一份使用触发器来记录员工薪水变化的代码
CREATE OR REPLACE TRIGGER salary_change_tracking
AFTER UPDATE OF salary ON employees
FOR EACH ROW
BEGIN
INSERT INTO salary_changes (employee_id, old_salary, new_salary)
VALUES (:old.employee_id, :old.salary, :new.salary);
END;
这是一个名为salary_change_tracking的触发器,在employees表的salary字段更新时执行。针对每条更新记录,触发器会将更新前和更新后的salary和employee_id信息记录到salary_changes表中。
五、包
包是一种将过程、函数、类型、变量和常量进行组织的机制。我们可以在包中定义一个公共的接口,用于集中访问和管理组件逻辑。
--以下是一个简要的包示例
CREATE OR REPLACE PACKAGE my_package IS
PROCEDURE procedure1;
PROCEDURE procedure2;
END my_package;
CREATE OR REPLACE PACKAGE BODY my_package IS
PROCEDURE procedure1 IS
BEGIN
dbms_output.put_line('Procedure 1');
END;
PROCEDURE procedure2 IS
BEGIN
dbms_output.put_line('Procedure 2');
END;
END my_package;
这是一个名为my_package的包,包含了两种过程procedure1和procedure2。在实现部分中,我们可以分别定义每个过程的具体实现。当需要使用时,只需要引用包名即可。