oracle PL/SQL(procedure language/SQL)程序设计(在PL/SQL中使用SQL)

时间:2023-02-21 20:20:37

在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
oracle PL/SQL(procedure language/SQL)程序设计(在PL/SQL中使用SQL)
为所有在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;