PL/SQL编程

来源:互联网 发布:访客网络限速多少 编辑:程序博客网 时间:2024/06/04 21:16
PL/SQL块由三部分组成,声明部分、执行部分、异常处理。

   DECLARE 

     --声明部分:声明PL/SQL用到的变量、类型及游标、以及局部的存储过程和函数。

   变量名 变量类型(表.列%TYPE(与表里的列值相同)) :=  给变量赋值;

  变量名 变量类型   表.%ROWTYPE  与表里的一行值相同 :=  给变量赋值;
 BEGIN

     --执行部分:过程及SQL语句,即程序的主要部分

    SELECT 表列名 INTO 变量名(给变量赋值) FROM 表

   

   --条件控制

   IF 布尔表达式 THEN

      PL/SQL 和 SQL语句

  ELSE

      其他语句

  END IF;

 

  --CASE选择结构

     CASE

      WHEN 条件表达式1 THEN

             语句段1

      WHEN 条件表达式2 THEN

             语句段2
   END CASE;

 

    --循环控制

    LOOP

           要执行的语句;

            EXIT WHEN 条件语句  判断停止循环条件;

   END LOOP;

EXCEPTION

    --异常处理部分:错误处理

   WHEN 异常 THEN

      输出 异常错误;
END;

 

-- 游标

DECLARE
      cursor emp_cursor  (游标名称)  IS SELECT sal,empno,deptno FROM EMPLOYEE;
      emp_record emp_cursor%rowtype; 
      e_cname_is_null EXCEPTION;   -- 自定异常
BEGIN
      IF not emp_cursor%ISOPEN THEN   --判断游标是否打开
        open emp_cursor;  --打开游标
       END IF;
  LOOP
   FETCH emp_cursor INTO emp_record;
      exit WHEN emp_cursor%NOTFOUND;

     IF emp_record.sal >= 10000 THEN   -- 当钱大于或等于10000 则输出异常
       RAISE e_cname_is_null;
  ELSE   -- 否则把钱小于10000的全部修改为10000

     UPDATE EMPLOYEE SET SAL = 10000 WHERE EMPNO = emp_record.empno AND emp_record.deptno = 10; 
  end if;
 END LOOP; 
 close emp_cursor;   --关闭游标
 EXCEPTION
  WHEN e_cname_is_null THEN  -- 输出自定义异常
   dbms_output.put_line('工资不低于10000!');
  WHEN OTHERS THEN
   dbms_output.put_line('其他异常');
END;

--存储过程


CREATE OR REPLACE PROCEDURE get_sals(存储过程名称) (
 cur_salary OUT SYS_REFCURSOR,  -- SYS_REFCURSOR 系统游标类型
 on_Flag out NUMBER,
 os_Msg out VARCHAR2
)
AS
BEGIN
  OPEN cur_salary FOR
    SELECT empno,sal FROM employee;
EXCEPTION
 when others then
  on_Flag := -1;
   os_Msg := '查询失败'; 
END;
 

--调用存储过程


declare
  cur_salary SYS_REFCURSOR;
  v_cmpno employee.empno%TYPE;
 v_sal employee.sal%TYPE;
   on_Flag  NUMBER;
  os_Msg  VARCHAR2(10);
 
BEGIN
     get_sals(cur_salary,on_Flag,os_Msg);
   OPEN cur_salary;
 LOOP
    fetch cur_salary into v_cmpno,v_sal;
    exit WHEN cur_salary%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE
      ('第'||'个雇员:'||v_cmpno||v_sal);
  END LOOP;
  close cur_salary;
     dbms_output.put_line(os_Msg);
end;

0 0