1. PL/SQL如何访问数据库
在PL/SQL块中的主要目的是对数据库进行访问。在PL/SQL块中,可以包含各种SQL语句,例如SELECT语句用于查询数据,DML(Data Manipulation Language)语句用于插入、更新或删除数据,DCL(Data Control Language)语句用于权限管理等。但是,在PL/SQL块中,不能直接包含DDL(Data Definition Language)语句,如创建表、修改表结构等。这类操作需要通过其他方法实现。
由于PL/SQL块通常在应用程序中调用执行,而不是交互式执行,因此在PL/SQL块中的SQL语句与一般的SQL语句略有不同。
举例:
假设你在应用程序中需要通过PL/SQL块查询数据库中的员工信息,并对其进行某些处理,这样的SQL查询语句需要写在PL/SQL块中。具体操作可以参考后面的示例。
2. 如何对数据库进行查询
PL/SQL块中使用SELECT语句从数据库中检索数据。SELECT语句的格式与普通的SQL语句基本相同,但在PL/SQL中,查询的结果通常会存放到一个或多个变量中,以便后续处理。
PL/SQL块中SELECT语句的格式:
SELECT 列1, 列2... INTO 变量1, 变量2... FROM 表
SELECT语句中的INTO子句用于将查询到的数据存储在PL/SQL块中的变量中。
举例:
【示例7-13】通过SELECT INTO把查询到的数据存放在变量中并进行处理。
假设需要从部门表(dept)中查询部门编号为30的部门名称和地址信息,并从员工表(emp)中查询该部门中员工的工资和奖金总和。查询结果会存储在PL/SQL块的变量中,并最终打印出来。具体代码如下:
SET SERVEROUTPUT ON;
DECLARE
dno integer;
d_name dept.dname%type;
d_location dept.loc%type;
total_sal number;
total_comm number;
BEGIN
dno := 30;
SELECT dname, loc INTO d_name, d_location FROM dept WHERE deptno = dno;
dbms_output.put_line('名称: ' || d_name || ' 位置: ' || d_location);
SELECT sum(sal), sum(nvl(comm, 0)) INTO total_sal, total_comm FROM emp WHERE deptno = dno;
dbms_output.put_line('工资总和: ' || total_sal || ' 奖金总和: ' || total_comm);
END;
/
结果: 将会输出部门30的名称、位置以及该部门员工的工资和奖金总和。
3. 如何使用DML语句
PL/SQL块中可以包含INSERT、DELETE、UPDATE语句,这些语句用于对数据库中的表进行操作。例如,插入新行、删除行或更新行。在使用这些语句时,可以结合PL/SQL中的变量或记录类型来实现更灵活的数据操作。
举例:
【示例7-14】在dept表中插入两行记录。
下面的示例代码演示了如何通过PL/SQL块向dept
表中插入两条新记录。第一条记录直接插入常量,第二条记录使用变量插入数据:
SET SERVEROUTPUT ON;
DECLARE
dno integer;
d_name dept.dname%type;
d_location dept.loc%type;
BEGIN
-- 插入第一条记录,直接使用常量值
INSERT INTO dept(DEPTNO, DNAME, LOC) VALUES(80, 'NETWORK', 'NOWHERE');
-- 使用变量插入第二条记录
dno := 90;
d_name := 'DEVELOP';
d_location := 'NOWHERE';
INSERT INTO dept(DEPTNO, DNAME, LOC) VALUES(dno, d_name, d_location);
commit;
END;
/
结果: 这段代码会向表dept
中插入两行数据,一行是常量数据,另一行是通过变量插入的数据。
4. 处理查询结果的异常情况
内容解释:
在执行SELECT语句时,可能会遇到两种异常情况:第一种是查询没有返回符合条件的数据,第二种是返回了多行数据。这种情况在PL/SQL中被称为异常处理,Oracle提供了一些预定义的异常,如NO_DATA_FOUND
用于处理没有数据返回的情况。
举例:
假设在查询部门时,如果没有找到对应的部门,PL/SQL块需要处理这个异常并给出提示。可以通过如下代码实现:
BEGIN
-- 尝试查询一个不存在的部门
SELECT dname, loc INTO d_name, d_location FROM dept WHERE deptno = 999;
dbms_output.put_line('名称: ' || d_name || ' 位置: ' || d_location);
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('没有找到符合条件的部门');
END;
/
结果: 当查询条件不满足时,会输出提示信息“没有找到符合条件的部门”。
5. 使用记录类型来简化代码
为了简化代码,在PL/SQL块中可以定义记录类型变量,将多个字段的值存储在一个记录类型变量中。这样可以减少单独定义多个变量的复杂性,并且操作起来更加简洁。
举例:
【示例7-15】在使用PL/SQL进行数据插入时,使用记录类型来简化代码。
例如,插入一条部门记录,包含部门编号、名称和地址。可以使用记录类型来定义这些字段,然后一次性插入:
SET SERVEROUTPUT ON;
DECLARE
TYPE department IS RECORD (d_no integer, d_name dept.dname%type, d_location dept.loc%type);
depart department;
BEGIN
depart.d_no := 1;
depart.d_name := 'MAINTAIN';
depart.d_location := 'NOWHERE';
INSERT INTO dept(deptno, dname, loc) VALUES(depart.d_no, depart.d_name, depart.d_location);
commit;
END;
/
非常感谢您读到这里!如果您觉得这篇文章对您有帮助,可以关注一下博主。关注后,您将第一时间获得最新的AI、云计算、运维(Linux、数据库,容器等)技术,以及更多实用的技能干货。
无论你是AI新手还是AI专家,学习最前沿的AI技术,AI创富俱乐部你值得拥有!