从查询到操作:PL/SQL中访问数据库

在这里插入图片描述

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语句的格式:

SELECT1,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创富俱乐部你值得拥有!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周同学的技术栈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值