你的位置:首页 > 数据库

[数据库]PL/SQL编程_如何访问数据库


编写PL/SQL块的主要目的是对数据库进行访问,因此,在PL/SQL块中可以包含SELECT语句、DML语句,还可以包含DCL语句。
需要注意的是,在PL/SQL块中不能直接包含DDL语句,如果要利用PL/SQL块完成诸如创建表、修改表结构等操作,需要通过其他方法。
通过SQL语句以及流控制语句,可以编写复杂的PL/SQL块,对数据库进行复杂的访问。

由于PL/SQL块一般是在应用程序中调用执行,而不是以交互方式执行,所以在PL/SQL块中的SQL语句与一般的SQL语句有所不间。

如何对数据进行查询

在PL/SQL块中通过SELECT语句从数据库中检索数据。

由于要对数据进行查询以及处理,而不仅仅是显示出来,所以SELECT语句需要采用下面的特殊格式:

SELECT 列1, 列2 ... INTO 变量1 ,变量2 •••
FROM 表

与一般的SELECT语句相比, PL/SQL块中的SELECT语句使用了INTO子句,其余部分是相同的。
利用INTO子句,把查询到的数据存放在变量中,以进行相应的处理。

例如,下面的例子首先从部门表中检索部门30的名称、地址等信息,分别存放在变量d_name和d_location 中,然后从雇员表中查询该部门中员工的工资、奖金总和,分别存放在变量total_sal 和变量total comm 中,最后打印出这些信息。
为了使程序更加灵活,首先定义了一个变量dno ,用来存放部门编号,这样在SELECT语句中就可以使用这样的变量。

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(comm) INTO total_sal, total_comm
FROM emp
WHERE deptno=dno;
dbms_output.put_line('工资总和:'|| total_sal || ' 奖金总和:' || total_comm);
END;

需要注意的是,在SELECT语句中,需要查询的列与INTO子句中的变量在数目类型上要一致,否则会发生错误。
在执行SELECT语句时,可能会发生两种例外情况,一是没有查询到满足条件的数据,二是存在多行满足条件的数据,这就是通常所说的异常
Oracle预定义了一些异常,例如在第一种情况下发生的是异常NO_DATA_FOUND ,在第二种情况下发生的是异常TOO_MANY_ROWS 。
对于这样的异常必须做出处理,否则会影响PL/SQL块的正确执行。
为了使程序简沽,在INTO子句中可以使用一个记录型变量,以代替多个单独的变量,把查询的数据存储在这个记录型变量中。
例如,对上面的PL/SQL块进行改造,首先定义一个记录类型department以及一个该类型的变量depart 。
然后定义一个记录类型employeei以及该类型的变量employ。
在变量depart 中存放需要查询的部门的信息,在变量employ 中存放员工的总工资和总奖金。

DECLARE
TYPE department is RECORD
(dno integer,
d_name dept.dname%type,
d_location dept.loc%type
);
depart department;
TYPE employee is RECORD
(total_sal number,
total_comm number
);
employ employee;
BEGIN
depart.dno := 30;
SELECT deptno,dname, loc INTO depart
FROM dept
WHERE deptno=depart.dno;
dbms_output.put_line('名称:'|| depart.d_name || ' 位置:' || depart.d_location);
SELECT sum(sal), sum(nvl(comm,0)) INTO employ
FROM emp
WHERE deptno=depart.dno;
dbms_output.put_line('工资总和:'|| employ.total_sal || ' 奖金总和:' || employ.total_comm);
END;

在使用记录型变量时要注意, SELECT之后的列要与记录型变量各个字段在数目与类型上保持一致,否则程序执行时会发生错误。

注:SELECT INTO 语句中,需要将SELECT子句中的列与记录型变量中的列对应,即使某些列用不到。

如何使用DML 语句

在PL/SQL块中可以包含INSERT 、DELETE 、UPDATE语句,用于对数据库中的表进行增、删、改等操作。
在这些语句中,可以使用数字、字符串等形式的常量,也可以使用变量,还可以使用记录型变量。
例如,下面的程序向dept表中插入两行:

DECLARE
dno integer;
d_name dept.dname%type;
d_location dept.loc%type;
BEGIN
INSERT INTO dept VALUES (50 , 'NETWORK ', 'NOWHERE');
dno:=60;
d_name := 'DEVELOP';
d_location := 'NOWHERE';
INSERT INTO dept VALUES(dno,d_name,d_location);
END;

两条INSERT语句都是将三个常量作为三个列的值,将其插入表中。
在使用记录型变量时,可以将各个字段的值作为表中各列的值,向表中插入一行,在INSERT语句的VALUES子句中必须指定记录型变量各个字段的值。
例如:

DECLARE
TYPE department is RECORD
(dno integer,
d_name dept.dname%type,
d_location dept.loc%type
);
depart department;
BEGIN
depart.dno:=70;
depart.d_name:='MA工NTA工N';
depart.d_location := 'NOWHERE';
INSERT INTO dept(deptno,dname,loc)
VALUES(depart.dno, depart.d_name, depart.d_location);
END;

在删除表中的数据时,在DELETE语句的WHERE子句中也可以使用变量,例如,以下例子要从dept表中删除某个部门的信息,部门编‘号由变量dno指定。

DECLARE
dno number :=70;
BEGIN
DELETE FROM dept
WHERE deptno=dno;
END;

在修改表中的数据时,在UPDATE语句的SET子句和WHERE子句中可以使用变量,也可以使用记录型变量。
如果是记录型变量,则要单独使用该变量的各个字段

例如,下面的例子要修改某部门的信息,部门编号由变量dno指定,该部门的信息存放在记录型变量depart 中。

DECLARE
dno number;
TYPE department is RECORD
(d_name dept.dname%type,
d_location dept.loc%type
);
depart department;
BEGIN
dno:=60;
depart.d_name := 'MONITOR';
depart.d_location := 'WASHINGTON';
UPDATE dept
SET dname=depart.d_name
WHERE deptno=dno;
END;