PL/SQL块结构和组成元素

PL/SQL块

PL/SQL程序由三个块组成,即声明部分、执行部分、异常处理部分。

DECLARE
/* 声明部分:在此声明PL/SQL用到的变量,类型及游标,以及局部的存储过程和函数*/

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

EXCEPTION
/* 执行异常部分: 错误处理*/
END;

其中,执行部分是必须的。

PL/SQL块可以分为三类:
1、无名块:动态构造,只能执行一次
2、子程序:存储在数据库中的存储过程、函数及包等。当在数据库上建立好后可以在其他程序中调用它们
3、触发器:当数据库发生操作时,会触发一些事件,从而自动执行相应的程序。

标识符

PL/SQL程序设计中的标识符定义与SQL的标识符定义的要求相同。要求和限制有:

  • 标识符名不能超过30字符
  • 第一个字符必须为字母
  • 不区分大小写
  • 不能使用‘-’
  • 不能使用SQL保留字

注意,一般不能把变量名声明与表中字段名完全一样,如果这样可能得到不正确的结果。例如:

DECLARE
   Ename varchar2(20):='KING';
BEGIN
   DELETE FROM emp WHERE ename=ename;
END;

执行后,会删除所有的记录,而不是KING的记录。

在这里插入图片描述

记录类型

记录类型是把逻辑相关的数据作为一个单元存储起来,称作PL/SQL RECORD 的域(FIFLD),其作用是存放互不相同但逻辑相关的信息。

定义记录类型语法如下:

TYPE record_type IS RECORD(
  Field1 type1 [NOT NULL] [:=exp1],
  Field2 type2 [NOT NULL] [:=exp2],
  ......
  Fieldn typen [NOT NULL] [:=expn]
);

例如

declare 
   type test_rec is record(
        l_name varchar2(30),
        d_id number(4));
   v_emp test_rec;
begin
   v_emp.l_name :='Tom';
   v_emp.d_id :=1234;
   dbms_output.put_line(v_emp.l_name|| ',' || v_emp.d_id);
end;

或者

declare
    type test_rec is record(
         l_name varchar2(30),
         d_id number(4));
    v_emp test_rec;
begin
    select last_name,department_id into v_emp
    from employees
    where employee_id = 200;

    dbms_output.put_line(v_emp.l_name|| ',' || v_emp.d_id);
end;

DBMS_OUTPUT.PUT_LINE过程的功能类似于Java中的System.out.println()直接将输出结果送到标准输出中
在使用上述过程之前必须将SQL * PLUS的环境参数SERVEROUTPUT设置为ON,否则将看不到输出结果:set serveroutput on

使用%TYPE
定义一个变量,其数据类型与已经定义的某个数据变量的类型相同,或者与数据库表中的某个列的数据类型相同,这时可以使用%TYPE。

使用%TYPE特性的优点在于:

  • 所引用的数据库列的数据类型可以不必知道
  • 所引用的数据列的数据类型可以实时改变。
declare
   type test_rec is record(
       l_name employees.last_name%type,
       d_id employees.department_id%type);
   v_emp test_rec;
begin
   select last_name,
   department_id into v_emp
   from employees where employee_id = 200;
   dbms_output.put_line(v_emp.l_name|| ',' || v_emp.d_id);
end;

使用%ROWTYPE
PL/SQL提供%ROWTYPE操作符,返回一个记录类型,其数据类型和数据表的数据结构一致。

使用%ROWTYPE特性的特点在于:

  • 所引用的数据库中列的个数和数据类型可以不必知道
  • 所引用的数据库中列的个数和数据类型可以实时改变
declare
    v_emp employees%rowtype;
begin
    select * into v_emp
    from employees where employee_id = 200;
    dbms_output.put_line(v_emp.last_name||',' ||v_emp.department_id||','||v_emp.hire_date);

end;

简单数据插入案例

DECLARE
   v_ename  VARCHAR2(20):='Bill';
   v_sal    NUMBER(7,2):=1234.56;
   v_deptno NUMBER(2):=10;
   v_empno  NUMBER(4):=8888;
BEGIN
   INSERT INTO emp(empno,ename,JOB,sal,deptno,hiredate)
       VALUES(v_empno,v_ename,'Manager',v_sal,v_deptno,
       TO_DATE('1954-06-09','yyyy-mm-dd'));
   COMMIT;

END;

简单数据删除

DECLARE
    v_empno number(4):=8888;
BEGIN
    DELETE FROM emp WHERE empnp=v_empno;
    COMMIT;
END;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值