您的位置:首页 > 数据库

PL/SQL编程

2015-10-08 16:09 204 查看
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('工资不低于1
4000
0000!');

  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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  plsql 编程