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

打印 上一主题 下一主题

主题 658|帖子 658|积分 1974


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语句的格式:
  1. SELECT 列1, 列2... INTO 变量1, 变量2... FROM 表
复制代码
SELECT语句中的INTO子句用于将查询到的数据存储在PL/SQL块中的变量中。
举例:

【示例7-13】通过SELECT INTO把查询到的数据存放在变量中并进行处理。
假设需要从部门表(dept)中查询部门编号为30的部门名称和地址信息,并从员工表(emp)中查询该部门中员工的工资和奖金总和。查询结果会存储在PL/SQL块的变量中,并最终打印出来。具体代码如下:
  1. SET SERVEROUTPUT ON;
  2. DECLARE
  3.     dno integer;
  4.     d_name dept.dname%type;
  5.     d_location dept.loc%type;
  6.     total_sal number;
  7.     total_comm number;
  8. BEGIN
  9.     dno := 30;
  10.     SELECT dname, loc INTO d_name, d_location FROM dept WHERE deptno = dno;
  11.     dbms_output.put_line('名称: ' || d_name || ' 位置: ' || d_location);
  12.     SELECT sum(sal), sum(nvl(comm, 0)) INTO total_sal, total_comm FROM emp WHERE deptno = dno;
  13.     dbms_output.put_line('工资总和: ' || total_sal || ' 奖金总和: ' || total_comm);
  14. END;
  15. /
复制代码
结果: 将会输出部门30的名称、位置以及该部门员工的工资和奖金总和。
3. 如何使用DML语句

PL/SQL块中可以包含INSERT、DELETE、UPDATE语句,这些语句用于对数据库中的表进行操作。例如,插入新行、删除行或更新行。在使用这些语句时,可以结合PL/SQL中的变量或记录类型来实现更机动的数据操作。
举例:

【示例7-14】在dept表中插入两行记录。
下面的示例代码演示了如何通过PL/SQL块向dept表中插入两条新记录。第一条记录直接插入常量,第二条记录使用变量插入数据:
  1. SET SERVEROUTPUT ON;
  2. DECLARE
  3.     dno integer;
  4.     d_name dept.dname%type;
  5.     d_location dept.loc%type;
  6. BEGIN
  7.     -- 插入第一条记录,直接使用常量值
  8.     INSERT INTO dept(DEPTNO, DNAME, LOC) VALUES(80, 'NETWORK', 'NOWHERE');
  9.    
  10.     -- 使用变量插入第二条记录
  11.     dno := 90;
  12.     d_name := 'DEVELOP';
  13.     d_location := 'NOWHERE';
  14.     INSERT INTO dept(DEPTNO, DNAME, LOC) VALUES(dno, d_name, d_location);
  15.     commit;
  16. END;
  17. /
复制代码
结果: 这段代码会向表dept中插入两行数据,一行是常量数据,另一行是通过变量插入的数据。
4. 处理查询结果的异常情况

内容表明:

在实行SELECT语句时,大概会遇到两种异常情况:第一种是查询没有返回符合条件的数据,第二种是返回了多行数据。这种情况在PL/SQL中被称为异常处理,Oracle提供了一些预界说的异常,如NO_DATA_FOUND用于处理没有数据返回的情况。
举例:

假设在查询部门时,如果没有找到对应的部门,PL/SQL块需要处理这个异常并给出提示。可以通过如下代码实现:
  1. BEGIN
  2.     -- 尝试查询一个不存在的部门
  3.     SELECT dname, loc INTO d_name, d_location FROM dept WHERE deptno = 999;
  4.     dbms_output.put_line('名称: ' || d_name || ' 位置: ' || d_location);
  5. EXCEPTION
  6.     WHEN NO_DATA_FOUND THEN
  7.         dbms_output.put_line('没有找到符合条件的部门');
  8. END;
  9. /
复制代码
结果: 当查询条件不满足时,会输出提示信息“没有找到符合条件的部门”。
5. 使用记录类型来简化代码

为了简化代码,在PL/SQL块中可以界说记录类型变量,将多个字段的值存储在一个记录类型变量中。这样可以减少单独界说多个变量的复杂性,并且操作起来更加简洁。
举例:

【示例7-15】在使用PL/SQL进行数据插入时,使用记录类型来简化代码。
例如,插入一条部门记录,包含部门编号、名称和地址。可以使用记录类型来界说这些字段,然后一次性插入:
  1. SET SERVEROUTPUT ON;
  2. DECLARE
  3.     TYPE department IS RECORD (d_no integer, d_name dept.dname%type, d_location dept.loc%type);
  4.     depart department;
  5. BEGIN
  6.     depart.d_no := 1;
  7.     depart.d_name := 'MAINTAIN';
  8.     depart.d_location := 'NOWHERE';
  9.     INSERT INTO dept(deptno, dname, loc) VALUES(depart.d_no, depart.d_name, depart.d_location);
  10.     commit;
  11. END;
  12. /
复制代码
非常感谢您读到这里!如果您觉得这篇文章对您有帮助,可以关注一下博主。关注后,您将第一时间获得最新的AI、云计算、运维(Linux、数据库,容器等)技术,以及更多实用的技能干货。

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


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

星球的眼睛

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表