http://www.cnblogs.com/quanweiru/archive/2012/09/26/2704308.html

触发器
一、报表触发器(report trigger)
报表触发器主要用于完成如设置报表格式,执行报表初始化等工作。事实上,报表

触发器实质上是显示返回TRUE或FALSE的PL/SQL函数。这些函数在运行和格式化报表时被

执行。报表触发器包括After Parameter Form、After Report、Before Parameter Form

、Before Report、Between Pages五个触发器。

测试过程:
(1):After Parameter Form触发器
说明:
该触发器在显示参数表格后触发,它用来存取、校验和修改报表中的参数值(如果出现

错误,则返回到参数表格)。该触发器不能存取数据模型中的列。

注意事项:
1.该触发器定义在报表级,如果出现错误,则返回到参数表格。

2.如果参数表格被屏蔽掉不显示,该触发器仍然被触发。

举例:
对于某个显示作者信息的报表auths_report,要求根据报表运行时用户输入的一个参

数值动态建立一个where子句,从而有条件地显示某一个作者的信息。此时,就可以通在

AfterParameterForm触发器中编写代码。在该报表中存在两个参数,一个参数是where_claus,

它是一个词法引用参数。另一个参数是p_code,它是一个联编参数。where_claus参数

用于根据报表运行时,用户输入的P_code参数值来构造where_claus参数的值。

该报表的查询语句如下:select seqno,author_code,name,salary from auths &where_clause

在After Parameter Form触发器中编写的代码如下:

function AfterPForm return boolean is
begin
--如果输入的参数为空,则查询所有作者的信息。
if :p_code is null then
:where_clause:='';
else
-将输入的p_code参数与whereauthor_code拼串构造一个where子句赋值给参数where_cla.
:where_clause:='where author_code='||upper(:p_code);
end if;
return (TRUE);
end; 
报表运行时,当用户输入参数值后,将显示某一作者的信息。

***我自己的测试如下:

第一步:建好学生信息列表报表:
该报表的查询语句如下:
SELECT ALL STUDENTS.ID, STUDENTS.NAME, STUDENTS.ADDRESS, STUDENTS.SEX
FROM STUDENTS &where_clause

第二步:在对象导航器中添加一个参数p_id,并设置属性为number类型与ID同类型。
在AFTER PARAMETER FORM触发器中编写的代码如下:
function AfterPForm return boolean is
begin
--如果输入的参数为空,则查询所有学生的信息。
if :p_id is null then
:where_clause:='';
else
--将输入的p_id参数与where id 拼串构造一个where子句赋值给参数where_clause.
:where_clause:='where id='||upper(:p_id);
end if;
return (TRUE);
end;
说明,根据p_id号可以按条件id号查询。

(2)Before Parameter Form触发器

第一步建好一个学生信息报表:
该报表的查询语句如下:
SELECT ALL STUDENTS.ID, STUDENTS.NAME, STUDENTS.ADDRESS, STUDENTS.SEX
FROM STUDENTS &where_clause

第二步:在对象导航器中添加一个参数p_id,并设置属性为number类型与ID同类型。

第三步:在AFTER PARAMETER FORM触发器中编写的代码如下:
function AfterPForm return boolean is
begin
--如果输入的参数为空,则查询所有学生的信息。
if :p_id is null then
:where_clause:='';
else
--将输入的p_id参数与where id 拼串构造一个where子句赋值给参数where_clause.
:where_clause:='where id='||upper(:p_id);
end if;
return (TRUE);
end;
说明:Before parameter Form触发器与After parameter Form触发器的主要区别在于代

码的触发时机不同。将代码放在Before parameter Form触发器中,这段代码在显示参数

表格前触发,放在After parameter Form触发器中,代码在显示参数表格后触发。他们都

用于根据用户输入的参数动态地构造一个where子句。

(3)Before Report触发器

注意:该触发器定义在报表级。

第一步建好一个定单信息报表
第二步在报表触发器里选择Before Report,单击右建选择pl/sql编辑器
function BeforeReport return boolean is
begin
if ((upper(:MODE)!='character')and (upper(:DESFORMAT)='HTML')) then
SRW.ATTR.MASK:=SRW.BEFPAGE_ESCAPE_ATTR+SRW.AFTPAGE_ESCAPE_ATTR;
--指定报表的"页之前值类型"属性为文本类型
SRW.ATTR.BEFPAGE_ESCAPE_TYPE:=SRW.TEXT_ESCAPE;
--为报表的"页之前值"属性赋值一个文本字符串
SRW.ATTR.BEFPAGE_ESCAPE_VALUE:='<html><h3>我在测试BeforeReport触发器,现在我是在WEB浏览器上浏览报表</h3>';
SRW.ATTR.AFTPAGE_ESCAPE_TYPE:=SRW.TEXT_ESCAPE;
--保留缺省的"页之后值"属性值
SRW.ATTR.AFTPAGE_ESCAPE_VALUE:='</body></html>';
SRW.SET_ATTR(SRW.REPORT_ID,SRW.ATTR);
END IF;
return (TRUE);
end;
说明:它完成的功能是,首先检测报表运行的系统参数,如果当前报表的模式不是"字符

模式"且输出格式是否为"html",则给报表的"页之前值"和"页之后值"属性赋值。

当该报表在WEB浏览器上输出时,在报表页之前将显示在BeforeReport触发器中指定的文

本字符串。

(4)After Report触发器
该触发器在输出报表(如输出到打印机)或退出报表预览后触发。

(5)Between Pages
说明:该触发器在每一报表页格式化前(第一页除外)触发,且只能在第一次进入报表页

时被触发。它可以用来对每一报表页进行格式化设置。

二、数据触发器(DATA TRIGGER)
数据触发器主要用于过滤数据、验证系统或用户自定义参数、操纵公式或占位列数

据。这类触发器包括组过滤器(Group filter)、Formula和验证(Validation)三个触发器。

(1)组过滤器
说明:组过滤器是一个pl/sql函数,该函数用于确定在报表组中要包含的记录。只有当组

的"组过滤器类型"属性设为"pl/sql"时,才能编写该触发器。该函数必须返回true或false。

如果返回true,则表示在报表中显示此记录;如果显示false,则表示不显示此记录。

注意事项:
该触发器定义在报表组上。
该触发器不能定义在交叉组(cross-prodeucr)上.

举例:测试过程:
第一步:在对象导航器中,打开"数据模型",选定组G_id,单击右建,选属性监察器。

"过滤器类型"选择:"pl/sql".然后在"pl/sql过滤器"项上单击打开组过滤器,编写代码:

如下:

某个用于显示学生信息的报表,该报表中包含的数据库列有:学生地址address,学号id,

姓名name,性别sex。假如想在报表中显示性别"女"的学生信息,则可以在组过滤器中编

写如下代码:
function G_IDGroupFilter return boolean is
begin
if :sex='女' then
return(true);
else
return (false);
end if;
end;
组过滤器在限制报表中的显示的记录数时非常有用。类似地,用户可以在报表中定义一个

计数器和一个数值型的参数,然后将用户输入的参数值与计数器中的值比较,当满足一定

条件时,在报表中显示一定数量的记录。

(2)Formula
说明:
formula是一个用于操纵公式列或占位列的PL/SQL函数,该函数必须返回值给公式列。

对于一个NUMBER类型的列,该函数只能返回NUMBER类型的值;对于DATE类型的列,只能

返回DATE类型的值;对于CHARACTER类型的列,可返回CHARACTER、VARCHAR、VARCHAR2类

型的值。

(3)验证触发器(Validation trigger)
说明:
验证触发器是定义在系统参数或用户定义参数上,用于验证参数初始值的PL/SQL函数。

当在命令行中指定参数值并在参数表格中接受此参数值时,该函数被执行。该函数必须

返回TRUE或FALSE。

注意事项:
该触发器定义在参数上。如果返回值为FALSE,则光标停留在参数表格中,用户可以

在该参数表格中输入不同参数值或退出参数表格。

举例:
在某个报表中包含了一些位图对象。为了在报表输出时,这些位图对象能够显示出来,

则可以定义验证触发器以测试系统参数MODE的值。如果报表的输出模式为字符模式(character),

则不输出报表。代码如下:
function MODEValidTrigger return boolean is
begin
--如果当前报表的输出模式为"字符"模式,则不输出报表。
if :mode='character' then
return(false);
else
return(true);
end if;
end;

三、布局触发器(Layout Trigger)
布局触发器主要用于定义按下报表中的按钮时执行的操作以及动态改变报表对象的显

示格式。这类触发器包括格式触发器(Format trigger)和动作触发器(Action trigger)两个触发器。

(1)格式触发器:
说明:格式触发器是一个返回值为true或false的 PL/SQL函数。在对报表进行格式化前,

系统会自动调用与报表对象相关的格式触发器。使用该触发器可以动态改变报表对象的显

示格式属性。

注意:格式触发器定义在布局模型编辑器中的显示的对象上。

举例如下:对定单报表的F_PRICE域定义了格式触发器
function F_PRICEFormatTrigger return boolean is
tmp number;
begin
if :price<2.00 then
--将定单表中价格每斤超过两元的降将10%
tmp:=:price*.9;
srw.set_field_num(0,tmp);
end if;
return (TRUE);
end;

(2)动作触发器(Action trigger)
说明:
动作触发器(Action trigger)是一个PL/SQL过程,在报表运行过程中,当用户按下报

表中的一个按钮时,执行该过程。该触发器可以用来动态地调用另一个报表或执行其它的

PL/SQL程序块。

注意事项:
该触发器定义在按钮上。在动态预览器中单击按钮时,该触发器不能被触发,只

有在运行态预览器(RUNTIME PREVIEWER)中单击按钮才能触发此触发器。

不能用PL/SQL解译器调试动作触发器。要调试该触发器,可以将其代码放入报表

触发器中测试。

ORACLE报表触发器的更多相关文章

  1. Oracle数据库——触发器的创建与应用

    一.涉及内容 1.理解触发器的概念.作用和类型. 2.练习触发器的创建和使用. 二.具体操作 (实验) 1.利用触发器对在scott.emp表上执行的DML操作进行安全性检查,只有scott用户登录数 ...

  2. [结]Oracle trigger(触发器)摘录

    1.触发器: 是许多关系数据库系统都提供的一项技术.在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块. 触发器在数据库里以独立的对象存储,它与存储过程和函数不同 ...

  3. oracle的触发器

    oracle的触发器分为语句级和行级两种类型,在视图上所创建的触发器叫做什么类型的触发器? DML触发器有三类: 1, insert触发器: 2, update触发器: 3, delete触发器: 触 ...

  4. oracle中触发器的讲解

    触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来启动运行.即触发器是当某个事件发生时自动地隐式运行.并且,触发器不能接收参数. ...

  5. MYSQL和ORACLE的触发器与存储过程语法差异

    整改了一番脚本,遇到了一些两种数据库之间的差异,记录一下: 触发器: 差异 MYSQL ORACLE 说明 创建语句不同 create trigger `AA` BEFORE INSERT on `B ...

  6. Oracle - java创建Oracle 的触发器

    Oracle - java创建Oracle 的触发器 今天碰到这个问题,遇到点问题,到这来 总结一下解决的办法, 需求,为一个用户当中的表增加一个自动增长列,我还没有学Oracle 的这部分,只是简单 ...

  7. oracle之触发器

    触发器可以看做一种"特殊"的存储过程,它定义了一些与数据库相关事件(如INSERT,UPDATE,CREATE等事件)发生时应执行的"功能代码块",常用与管理复 ...

  8. oracle数据库触发器(trigger)用法总结

    from:http://blog.csdn.net/zhanzhib/article/details/48729417 触发器的意思就是当我们对数据库对象(一般是表或视图)进行insert.updat ...

  9. Oracle中用触发器实现自动记录表数据被修改的历史信息

    oracle中用触发器实现自动记录表数据被修改的历史信息. 有一些比较重要的表字段每次修改需要做历史记录,以后可以查询这个表中某些字段如何被修改过.由什么改成了什么等,由谁操作,操作时间等. 实例:1 ...

随机推荐

  1. java heap space解决方法和JVM参数设置

    在JVM中如果98%的时间是用于GC(Garbage Collection)且可用的 Heap size 不足2%的时候将抛出异常信息,java.lang.OutOfMemoryError: Java ...

  2. javascript中的二维数组

    要创建一个二位数组我们脑子里第一个出现的就是 var arr=[][]; 但是在javascript这样是会报错的,要在javascrip中创建一个二位数组对象方法如下 方法一     直接把数组写出 ...

  3. Git操作的一些注意

    这是在在学习Git时遇到的一些需要注意的地方,都是一些小细节的地方,可能会有错误的地方,希望大家可以指出谢谢   1.git使用,安装后,首先要打开git bash   2.必须登录后才可以操作git ...

  4. java线程状态及转换

    java线程有6种状态: 新建线程new,启动线程runnable,阻塞block,限时等待timed_waiting,等待线程waiting,终止线程terminated 1.限时等待timed w ...

  5. TZOJ 5280 搜索引擎(模拟字符串)

    描述 谷歌.百度等搜索引擎已经成为了互连网中不可或缺的一部分.在本题中,你的任务也是设计一个搜索论文的搜索引擎,当然,本题的要求比起实际的需求要少了许多. 本题的输入将首先给出一系列的论文,对于每篇论 ...

  6. PAT L3-008 喊山(广搜)

    喊山,是人双手围在嘴边成喇叭状,对着远方高山发出“喂—喂喂—喂喂喂……”的呼唤.呼唤声通过空气的传递,回荡于深谷之间,传送到人们耳中,发出约定俗成的“讯号”,达到声讯传递交流的目的.原来它是彝族先民用 ...

  7. 44-python-三维画图

    https://www.cnblogs.com/xingshansi/p/6777945.html python绘制三维图   作者:桂. 时间:2017-04-27  23:24:55 链接:htt ...

  8. (一)ROS的安装与环境配置

    1.设置教程 1.1 打开system setting(系统设置)->Software&Updates(软件与更新) 1.2点击上方Other software(其他软件),点击左下角a ...

  9. springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑。为了区别不同的异常通常根据异常类型自定义异常类,这里我们创建一个自定义系统异常,如果controller、service、dao抛出此类异常说明是系统预期处理的异常信息。

    springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑. 1.1 异常处理思路 系统中异常包括两类:预期异常和运行时异常RuntimeEx ...

  10. makefile all

    all:udps udpc udps:udpserv.c    gcc -Wall -o udps udpserv.cudpc:udpclient.c    gcc -Wall -o udpc udp ...