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. Python 字符串操作,截取,长度

    1.字符串操作: 字符串长度: s = "; slen = len(s); 字符串截取: print s[:-:-] #截取,逆序隔1个取一个字符 print s[:-:-] #截取,逆序隔 ...

  2. java 用volatile和不用volatile的区别

    在当前的Java内存模型下,线程可以把变量保存在本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写.这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量值 ...

  3. testng + Ignore 忽略测试方法

    使用testng的时候,有时候会忽略掉某些测试方法,暂时不跑,简单整理一下一些方法.转载还请说明下 1.使用@Test(enable=false)方法 @Feature("查询") ...

  4. springmvc el表达式取值顺序问题

    最近遇到一个问题,两次访问同一个controler, 第二次根据判断条件,明明没有设置model的值,在jsp中通过${data}还是能取到值,最后找到原因是 我为了能够加快响应速度,在session ...

  5. spark开启远程调试

    一.集群环境配置 #调试Master,在master节点的spark-env.sh中添加SPARK_MASTER_OPTS变量 export SPARK_MASTER_OPTS="-Xdeb ...

  6. python的进程间的数据交互

    #先来看下如何实现多进程 # multiprocessing 这个是python的多进程的模块,我们会用到这个模块的很多方法 from multiprocessing import Process i ...

  7. python模块之time模块

    import time #从1970年1月1号凌晨开始到现在的秒数,是因为这一年unix的第一个商业版本上市了,这个最常用# print(time.time()) # 1491574950.23983 ...

  8. C++的MFC 与 HTML 双向通讯

    C++中嵌入ie浏览器总结(1) - ie边框 及上下文菜单 最近项目中用html 来做界面,也就折腾了一下在wxwidget中嵌入浏览器的若干细节工作,mfc也基本是类似的,由于wxwidget中已 ...

  9. Spring的3.0提供了一种:SpEL注入方式(了解)

    1. SpEL:Spring Expression Language是Spring的表达式语言,有一些自己的语法 2. 语法 * #{SpEL} 3. 例如如下的代码 <!-- SpEL的方式 ...

  10. sqlserver 日期格式化

    Sql Server 中一个非常强大的日期格式化函数Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AMSelect CONVE ...