plsql

第11章 PL/SQL

1. 什么是 PL/SQL?PL/SQL 和 SQL 有什么区别?

PL/SQL(Procedural Language/Structured Query Language)是 Oracle 数据库的过程化编程语言,它扩展了 SQL 的功能,支持变量、条件判断、循环、异常处理等编程特性。PL/SQL 和 SQL 的主要区别如下:

  • SQL:用于数据查询和操作(如 SELECTINSERTUPDATEDELETE),是声明式语言。
  • PL/SQL:用于编写存储过程、函数、触发器等,支持过程化编程,可以处理复杂的业务逻辑。

2. 使用 PL/SQL 程序实现,查询员工编号为 7369 的员工薪水,然后判断,如果薪水小于 500,打印“薪水低”,如果 500 到 1000,打印“中等”,大于 1000,打印“薪水不错”。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
DECLARE
v_sal NUMBER;
BEGIN
-- 查询员工薪水
SELECT sal INTO v_sal FROM emp WHERE empno = 7369;

-- 判断薪水范围并输出结果
IF v_sal < 500 THEN
DBMS_OUTPUT.PUT_LINE('薪水低: ' || v_sal);
ELSIF v_sal BETWEEN 500 AND 1000 THEN
DBMS_OUTPUT.PUT_LINE('中等: ' || v_sal);
ELSE
DBMS_OUTPUT.PUT_LINE('薪水不错: ' || v_sal);
END IF;
END;
/

3. 查询出所有员工信息,打印出所有员工的编号和姓名。

1
2
3
4
5
6
7
8
9
10
DECLARE
-- 定义游标
CURSOR cur IS SELECT empno, ename FROM emp;
BEGIN
-- 遍历游标并输出结果
FOR i IN cur LOOP
DBMS_OUTPUT.PUT_LINE('编号: ' || i.empno || ' 姓名: ' || i.ename);
END LOOP;
END;
/

4. 给员工表增加一列部门名称,用游标实现将该列的值更新为部门表中的部门名称。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-- 添加部门名称列
ALTER TABLE emp ADD (dname VARCHAR2(10));

DECLARE
-- 定义游标
CURSOR cur IS SELECT deptno, dname FROM dept;
BEGIN
-- 遍历游标并更新部门名称
FOR i IN cur LOOP
UPDATE emp SET dname = i.dname WHERE deptno = i.deptno;
END LOOP;
COMMIT; -- 提交事务
END;
/

-- 清空部门名称列(测试用)
UPDATE emp SET dname = NULL;

5. 写一个 PL/SQL 块,插入表 user.employee 中 100 条数据。插入该表中字段 id 用序列 seq_employee 实现,薪水和姓名字段可以任意填写。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
-- 创建序列
CREATE SEQUENCE seq_employee
START WITH 1
INCREMENT BY 1
MAXVALUE 100
MINVALUE 1
NOCACHE
CYCLE;

DECLARE
BEGIN
-- 插入 100 条数据
FOR i IN 1..100 LOOP
INSERT INTO emp (empno, ename, sal)
VALUES (seq_employee.NEXTVAL, 'Employee' || i, DBMS_RANDOM.VALUE(1000, 5000));
END LOOP;
COMMIT; -- 提交事务
END;
/

-- 删除测试数据
DELETE FROM emp WHERE empno LIKE '_' OR empno LIKE '__';

6. 写一个语句块,在语句块中定义一个显式游标,按 id 升序排列,打印表 employee 中前十条数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
DECLARE
-- 定义游标
CURSOR cur IS SELECT * FROM emp ORDER BY empno;
v_count NUMBER := 0; -- 计数器
BEGIN
-- 遍历游标并输出前十条数据
FOR i IN cur LOOP
v_count := v_count + 1;
IF v_count <= 10 THEN
DBMS_OUTPUT.PUT_LINE('姓名: ' || i.ename || ' 编号: ' || i.empno);
ELSE
EXIT; -- 退出循环
END IF;
END LOOP;
END;
/

plsql
https://blog.pangcy.cn/2018/10/11/数据库相关/Oracle/SQL 练习/plsql/
作者
子洋
发布于
2018年10月11日
许可协议