名词解释

子程序:PL/SQL的过程和函数统称为子程序。

匿名块:以DECLARE或BEGIN开始,每次提交都被编译。匿名块因为没有名称,所以不能在数据库中存储并且不能直接从其他PL/SQL块中调用。

命名块:除匿名块之外的其他块。包括过程、函数、包和触发器。可以在数据库中存储并在适当的使用运行。

子程序的优点:

1)具有扩展性

可以自定义PL/SQL语言以满足实际应用

2)高可用和可维护性

子程序的调用不受调用者数目的影响,只要有效就可被调用。

如果定义被更改以后,只有子程序受到影响,简化了维护、优化过程。

匿名块、过程、函数的执行过程基本相似,不同之处在于:匿名块在DECLARE后面声明变量,而过程和函数在IS后面声明。

函数也可以称为过程,特殊之处为:函数总是有一个返回值(RETURN)。

匿名块

[DECLARE]

BEGIN

--statements

[EXCEPTION]

END;

过程

PROCEDURE name

IS

BEGIN

--statements

[EXCEPTION]

END;

函数

FUNCTION name

RETURN datatype

IS

BEGIN

--statements

RETURN value;

[EXCEPTION]

END;

1、 创建存储过程

1)语法

CREATE [OR REPLACE] PROCEDURE procedure_name

[argument[{IN|OUT|IN OUT}] TYPE]

{IS|AS}

<类型、变量的说明>

BEGIN

<执行部分>

EXCEPTION

<可选的异常错误处理程序>

END;

2)示例

①要求:记录登录数据的userid和logdate。

##创建表,用来存储userid和logdate

SQL> create table logtable (userid varchar2(10),logdate date);

Table created.

##创建存储过程

SQL> create or replace procedure logexecution is

2  begin

3    insert into logtable (userid, logdate) values (user, sysdate);

4  end;

5  /

Procedure created.

##执行存储过程

SQL>  exec logexecution;

PL/SQL procedure successfully completed.

##验证执行结果

SQL> select * from logtable;

USERID     LOGDATE

---------- -------------------

SYS        2017-03-12 01:18:28

② 要求:删除表中记录

##创建过程

SQL> create or replace procedure delemp(v_empno in emp.empno%type) is

2    no_result exception;

3  begin

4    delete from emp where empno = v_empno;

5    if sql%notfound then

6      raise no_result;

7    end if;

8    dbms_output.put_line('employee number' || v_empno || 'was deleted!');

9  exception

10    when no_result then

11      dbms_output.put_line('no row found!');

12    when others then

13      dbms_output.put_line('other error!');

14  end delemp;

15  /

Procedure created.

##执行过程

SQL> exec delemp(999);

no row found!

PL/SQL procedure successfully completed.

SQL> exec delemp(7499);

employee number7499was deleted!

PL/SQL procedure successfully completed.

2、 创建函数

1)语法

CREATE [OR REPLACE] FUNCTION function_name

[(argument[{IN|OUT|IN OUT}] TYPE,

...

argument[{IN|OUT|IN OUT}] TYPE)]

RETURN return_type {IS|AS}

function_body

2)示例

##创建函数

SQL> create or replace function get_salary(dept_no number, v_num out number)

2    return number is

3    v_sum number;

4  begin

5    select sum(sal), count(*)

6      into v_sum, v_num

7      from emp

8     where deptno = dept_no;

9    return v_sum;

10  exception

11    when no_data_found then

12      dbms_output.put_line('你需要的数据不存在!');

13    when too_many_rows then

14      dbms_output.put_line('程序运行错误!请使用游标');

15    when others then

16      dbms_output.put_line('发生其他错误!');

17  end get_salary;

18  /

Function created.

##调用函数(注:函数不能单独调用,只能在语句中调用)

SQL> declare

2    v_num number;

3    v_sum number;

4  begin

5    v_sum := get_salary(30,v_num);

6    dbms_output.put_line('30 department sum salary is '||v_sum||' employee: '||v_num);

7  end;

8  /

30 department sum salary is 9400 employee: 6

PL/SQL procedure successfully completed.

3、 触发器

触发器:在数据库中以独立的对象存储,它与存储过程不同的是,存储过程通过其他程序来启动运行或者直接启动运行,而触发器是由一个事件来启动运行。即触发器是当某个事件发生时自动地隐式运行。并且触发器不能接收参数,不能commit。

触发器类型:

DML触发器:Oracle可以在DML语句进行触发,可以在DML操作前或操作后进行触发,并且可以对每个行或语句操作上进行触发。

替代触发器:由于在Oracle里,不能对复杂视图进行操作。所以给出了替代触发器。它就是Oracle专门为进行视图操作的一种处理方法。

系统触发器:它可以在Oracle数据库系统的事件中进行触发,如Oracle系统的启动与关闭等。

触发器组成:

触发事件:即在何种情况下触发TRIGGER。

触发事件:即该TRIGGER是在触发事件发生之前(BEFORE)还是之后(AFTER)触发。

触发器本身:即该TRIGGER被触发之后的目的和意图。

触发类型:说明触发器内定义的动作被执行的次数。即语句级(STATEMENT)触发器和行级(ROW)触发器。

语句级(STATEMENT)触发器:指当某触发事件发生时,该触发器只执行一次。

行级(ROW)触发器:指当某触发器事件发生时,对收到该操作影响的每一行数据,触发器都单独执行一次。

1)示例

①创建DML触发器

要求:当职工表emp被删除一条记录时,把被删除记录写到职工表删除日志表中。

##建立删除日志表

SQL> create table emp_his as select * from emp where 1=2;

Table created.

##创建触发器

SQL> create or replace trigger del_emp

2    before update or delete on scott.emp

3    for each row

4  begin

5    insert into emp_his

6      (deptno, empno, ename, job, mgr, sal, comm, hiredate)

7    values

8      (:old.deptno,

9       :old.empno,

10       :old.ename,

11       :old.job,

12       :old.mgr,

13       :old.sal,

14       :old.comm,

15       :old.hiredate);

16  end del_emp;

17  /

Trigger created.

##验证触发器

SQL> delete from emp where empno=7844;

1 row deleted.

SQL> select count(*) from emp_his;

COUNT(*)

----------

1

②创建替代触发器

##创建复杂视图

SQL> create or replace view emp_view as

2  select deptno,count(*) total_employeer,sum(sal) total_salary

3  from emp group by deptno;

View created.

##对视图进行DML会报错,因为复杂视图不能直接进行DML操作

SQL> delete from emp_view where deptno=10;

delete from emp_view where deptno=10

*

ERROR at line 1:

ORA-01732: data manipulation operation not legal on this view

##创建触发器

SQL> create or replace trigger emp_view_delete

2    instead of delete on emp_view

3    for each row

4  begin

5    delete from emp where deptno = :old.deptno;

6  end emp_view_delete;

7  /

Trigger created.

##再次删除,发现执行成功

SQL> delete from emp_view where deptno=10;

1 row deleted.

③ 创建系统事件触发器

注意:系统时间触发器要以sys用户运行

##登录sys用户

SQL> conn / as sysdba

Connected.

##创建表

SQL> create table logtable (name varchar2(20),log_time date);

Table created.

##创建触发器

SQL> create or replace trigger login_his

2    after logon on database

3  begin

4    insert into logtable values (user, sysdate);

5  end;

6  /

Trigger created.

##验证触发器

SQL> select * from logtable;

NAME                 LOG_TIME

-------------------- -------------------

SYS                  2017-03-12 00:15:29

【PL/SQL】匿名块、存储过程、函数、触发器的更多相关文章

  1. 查看SQL SERVER 加密存储过程,函数,触发器,视图

    原文:查看SQL SERVER 加密存储过程,函数,触发器,视图 create  PROCEDURE sp_decrypt(@objectname varchar(50))ASbeginset noc ...

  2. Oracle PL/SQL异常、存储过程和触发器

    一.异常 1.处理异常 (1)除数不为0 declare b number; begin b:; exception when zero_divide then dbms_output.put_lin ...

  3. 【Java EE 学习 29 上】【PL/SQL】【存储过程】【存储函数】【触发器】

    一.PL/SQL简介 1.概念:PL/SQL语言是Oracle数据库专用的一种高级程序设计语言,是对标准SQL语言进行了过程化扩展的语言. 2.功能:既能够实现对数据库的操作,也能够通过过程化语言中的 ...

  4. oracle 之索引,同义词 ,关键词,视图 ,存储过程,函数,触发器

    --创建索引 关键词 index create[unique] index index_name on table_name(column_name [,column_name…]) [tablesp ...

  5. ORACLE PL/SQL编程之八:把触发器说透

    原文:ORACLE PL/SQL编程之八:把触发器说透 ORACLE PL/SQL编程之八: 把触发器说透 大家一定要评论呀,感谢!光发表就花了我将近一个下午. 本篇主要内容如下: 8.1 触发器类型 ...

  6. SQLPLUS执行PL/SQL语句块

    1.首先登录Oracle HR schema: 2.对于PL/SQL程序,分号表示语句的结束:而使用 "."  号表示整个语句块的结束,也可以省略.按回车键后,该语句块不会执行,即 ...

  7. 同样的一句SQL语句在pl/sql 代码块中count 没有数据,但是直接用SQl 执行却可以count 得到结果

    pl/sql 代码块: SELECT count(distinct t2.so_nbr) INTO v_count2 FROM KFGL_YW_STEP_qd t2 WHERE t2.partitio ...

  8. 在PL/SQL中调用存储过程--oracle

    在oracle10中写好了存储过程,代码如下: CREATE OR REPLACE Procedure Proc_Insert ( sName in varchar2, sAge in int, sE ...

  9. pl/sql 笔记之存储过程、函数、包、触发器(下)

    一.存储过程.存储函数   1.What's This? ①.ORACLE 提供可以把 PL/SQL 程序存储在数据库中,并可以在任何地方来运行它.这样就叫存储过程或函数. ②.存储过程.存储函数的唯 ...

  10. PL/SQL编程-块编程

    (1). 简单分类                           |————过程(存储过程)                           |                        ...

随机推荐

  1. MySQL之视图、触发器、存储过程、函数、事务、数据库锁

    一.视图 视图:是一个虚拟表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据. 视图的特点: 1.视图的列可以来自不同的表,是表的抽象和逻辑意义上建立的新关系: 2.视图是由基本 ...

  2. 我的ArcGis9.3 到Arcgis10.0 升级步骤

    因为之前一直安装的是Arcgis 9.3 版本,领导发了个10.0版本说,该升级了,结果就开始了漫漫的升级路. 个人操作过程,只是个别. 一.卸载Arcgis9.3 这个过程真说是艰辛啊. 首先,卸载 ...

  3. 3D全景之ThreeJs

    3D全景之ThreeJs 一.前言 随着H5越来越多的被应用到各个领域,3D也越来越频繁的出现在各个H5案例中,今天我们就来讨论一下3D全景的实现. 据百度百科上介绍:720全景是视角超过人的正常视角 ...

  4. kendo Grid的toolbar自定义

    由于这个toolbar官方进增加了create,save还有一个是_____ 所以想要自定义话就需要使用 下面的代码(这个是MVVM模式) data-toolbar='[{ template: Ken ...

  5. 洛谷—— P2015 二叉苹果树

    https://www.luogu.org/problem/show?pid=2015 题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点 ...

  6. N天学习一个Linux命令之sudo

    前言 新项目打算采用运维搭建的发布系统发代码,发布后生效前需要做一些处理,因为发布系统登录目标机器使用的是非root账号,所以需要使用sudo来提升权限.当执行sudo cd /xxx/xx时会提示报 ...

  7. no_merge hint

    This is tested in 10gR2. SQL> select * from v$version; BANNER ----------------------------------- ...

  8. ipcs命令学习

    参考这篇 http://blog.csdn.net/pyjfoot/article/details/7989097 ipcs -m -s -q 分别对应集中ipc ipcs -l 显示limits: ...

  9. 【Android开发VR实战】三.开发一个寻宝类VR游戏TreasureHunt

    转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53939303 本文出自[DylanAndroid的博客] [Android开发 ...

  10. 为什么是kafka?

    MQ在分布式场景下的应用已经非常广泛了.可是在全部的MQ使用场景中,大多都要求不能丢消息.意味着必须有持久化的能力,传统行业经常使用的activemq.rabbitmq尽管有持久化能力,无奈的是性能太 ...