在PL/SQL程序中,允许使用的SQL语句只有DML和事务控制语句,使用DDL语句是非法的。
使用SELECT语句从数据库中选取数据时,只能返回一行数据。
使用COMMIT, ROLLBACK, 和SAVEPOINT语句控制事务。
使用隐式游标(implicit cursors)测定DML语句的执行结果。
DDL语句只能通过内置的DBMS_SQL包来使用。
在PL/SQL中的SELECT语句
SELECT select_list
INTO {variable_name[, variable_name]...
| record_name}
FROM table
WHERE condition;
必须使用INTO子句
例子
DECLARE
v_deptno NUMBER(2);
v_loc VARCHAR2(15);
BEGIN
SELECT deptno, loc (select检索出列变量的值 赋给 相应的变量)
INTO v_deptno, v_loc
FROM dept
WHERE dname = 'SALES'; ...
END;
存储数据检索结果
例子
DECLARE
v_empRecord emp%ROWTYPE; (行变量)
BEGIN
-- 从emp表中检索一条记录并存储到v_empRecord记录变量中。(一条记录也就是数据库表中的一行记录)
SELECT *
INTO v_empRecord
FROM emp
WHERE empno = 7369;
dbms_output.put_line(v_empRecord.empno||v_empRecord.ename||v_empRecord.sal);
END;
存储数据检索结果
例子
DECLARE
v_deptName dept.dname%TYPE;
v_deptNo dept.deptno%TYPE;
BEGIN
-- 从dept中检索一条记录(具有两个字段)存储到v_deptNo和v_deptName变量中。
SELECT deptno, dname
INTO v_deptNo, v_deptName
FROM dept
WHERE deptno = 20;
dbms_output.put_line(v_deptNo||v_deptName);
END;
返回指定部门的所有员工的工资总额
DECLARE
v_sum_sal emp.sal%TYPE;
v_deptno NUMBER NOT NULL := 10;
BEGIN
SELECT SUM(sal) -- group function
INTO v_sum_sal
FROM emp
WHERE deptno = v_deptno;
dbms_output.put_line(v_sum_sal);
END;
使用DML命令改变数据库表的记录:
INSERT
UPDATE
DELETE
为所有在emp表中的Analysts员工增加工资
DECLARE
v_sal_increase emp.sal%TYPE := 2000;
BEGIN
UPDATE emp
SET sal = sal + v_sal_increase
WHERE job = 'ANALYST';
END;
更新dept表中的数据
v_deptno dept.deptno%TYPE:=&no;
v_dname dept.dname%TYPE :='&name';
BEGIN
UPDATE scott.dept SET dname=v_dname
WHERE deptno=v_deptno;
END;
从emp表中删除10号部门下的所有员工
DECLARE
v_deptno emp.deptno%TYPE := 10;
BEGIN
DELETE FROM emp
WHERE deptno = v_deptno;
END;
COMMIT和ROLLBACK语句
一个事务是从第一条DML语句开始直到COMMIT或ROLLBACK语句结束。
使用COMMIT和ROLLBACK语句结束一个事务。
DECLARE
v_sal NUMBER(10,2) :=&salary;
v_ename VARCHAR2(20):='&name';
BEGIN
UPDATE emp SET sal=v_sal
WHERE ename=v_ename;
COMMIT;
EXCEPTION(发生异常,就回滚)
WHEN others THEN
ROLLBACK;
END;