ORACLE报表触发器
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报表触发器的更多相关文章
- Oracle数据库——触发器的创建与应用
一.涉及内容 1.理解触发器的概念.作用和类型. 2.练习触发器的创建和使用. 二.具体操作 (实验) 1.利用触发器对在scott.emp表上执行的DML操作进行安全性检查,只有scott用户登录数 ...
- [结]Oracle trigger(触发器)摘录
1.触发器: 是许多关系数据库系统都提供的一项技术.在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块. 触发器在数据库里以独立的对象存储,它与存储过程和函数不同 ...
- oracle的触发器
oracle的触发器分为语句级和行级两种类型,在视图上所创建的触发器叫做什么类型的触发器? DML触发器有三类: 1, insert触发器: 2, update触发器: 3, delete触发器: 触 ...
- oracle中触发器的讲解
触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来启动运行.即触发器是当某个事件发生时自动地隐式运行.并且,触发器不能接收参数. ...
- MYSQL和ORACLE的触发器与存储过程语法差异
整改了一番脚本,遇到了一些两种数据库之间的差异,记录一下: 触发器: 差异 MYSQL ORACLE 说明 创建语句不同 create trigger `AA` BEFORE INSERT on `B ...
- Oracle - java创建Oracle 的触发器
Oracle - java创建Oracle 的触发器 今天碰到这个问题,遇到点问题,到这来 总结一下解决的办法, 需求,为一个用户当中的表增加一个自动增长列,我还没有学Oracle 的这部分,只是简单 ...
- oracle之触发器
触发器可以看做一种"特殊"的存储过程,它定义了一些与数据库相关事件(如INSERT,UPDATE,CREATE等事件)发生时应执行的"功能代码块",常用与管理复 ...
- oracle数据库触发器(trigger)用法总结
from:http://blog.csdn.net/zhanzhib/article/details/48729417 触发器的意思就是当我们对数据库对象(一般是表或视图)进行insert.updat ...
- Oracle中用触发器实现自动记录表数据被修改的历史信息
oracle中用触发器实现自动记录表数据被修改的历史信息. 有一些比较重要的表字段每次修改需要做历史记录,以后可以查询这个表中某些字段如何被修改过.由什么改成了什么等,由谁操作,操作时间等. 实例:1 ...
随机推荐
- 《Blue Flke》第一次作业:团队亮相
1.队名:Blue Flke 团队格言:决心是成功的力量,耐心是成功的保障. 2.团队成员组成: 201571030129/ 王胜海 (组长) 201571030126/ 妥志福 20157103 ...
- LPSN获取菌python脚本
本文转载于https://mp.weixin.qq.com/s?__biz=MzIxNzEzODA5NQ==&mid=2649373408&idx=1&sn=232c2cb36 ...
- Web标准:六、html列表
Web标准:六.html列表 知识点: 1.ul无序和ol有序列表 2.改变项目符号样式或用图片定义项目符号 3.横向图文列表 4.浮动后父容器高度自适应 5.IE6的双倍边距bug 1)ul无序 ...
- JPA报错, PersistenceException_Unable to build Hibernate SessionFactory
javax.persistence.PersistenceException: [PersistenceUnit: TestJPA] Unable to build Hibernate Session ...
- 64位windows+32位JDK8+32位eclipse是可以的
- Course Schedule课程表12(用Topological Sorting)
[抄题]: 现在你总共有 n 门课需要选,记为 0 到 n - 1.一些课程在修之前需要先修另外的一些课程,比如要学习课程 0 你需要先学习课程 1 ,表示为[0,1]给定n门课以及他们的先决条件,判 ...
- Boost 库uuid 的使用
UUID 简介 通用唯一识别码(英语:Universally Unique Identifier,简称UUID)是一种软件建构的标准,亦为开放软件基金会组织在分布式计算环境领域的一部分. uuid 版 ...
- super限定,子类中系统查找变量的顺序:
示例代码如下: import static java.lang.System.*; //-父类: class BaseClass{ public int a=7; } //-子类: public cl ...
- Spark设计思想浅析
Spark is no rocket science!——博主 了解分布式计算的朋友,一定知道DAG这样一个概念.其实我接触DAG也是在学习MapReduce时了解到的.(具体可查阅<大数据日知 ...
- 谈谈我对Ui设计师的一些观点
做ui设计师3年多了,对ui设计师在工作中也了解了许多. 作为UI设计师,在工作中需要清楚了解设计的目的,尤其是你做的不是大众化产品,不能以个人认知.很强的主题性来确定. 例如针对儿童人群的app时, ...