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 ...
随机推荐
- centos7 端口转发
firewall-cmd --add-masquerade firewall-cmd --add-forward-port=port=3001:proto=tcp:toaddr=172.17.18 ...
- Mysql update 一个表中自己的数据
update table ucf, table t2 set ucf.pcid = t2.pcid where t2.name = 'liming' and t2.gid= ucf.gid and ...
- spring boot 启动方式
一:IDE 运行Application这个类的main方法 二:在springboot的应用的根目录下运行mvn spring-boot:run 三:使用mvn install 生成jar后运行 先到 ...
- mysql for update语句
我们都知道for update语句会锁住一张表,锁表的细节很多人却不太清楚,下面我们举例看下. 在表上我们有个索引,如下: 现在在我们通过索引store_id锁表: 我们再开一个客户端,还是锁住同一个 ...
- Matlab中插值函数汇总(上)
Matlab中插值函数汇总分上下两个部分,主要整合自matlabsky论坛dynamic发表于2009-2-21 21:53:26 的主题帖,以及豆丁网rickoon上传的教材第8章<插值,拟合 ...
- hdoj Max Sum Plus Plus(DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1024 题意:----最大M子段和问题给定由 n个整数(可能为负整数)组成的序列a1,a2,a3,……, ...
- 条款1:视C++为一个语言联邦
C++是门多范式语言,至少包括面向过程,面向对象,泛型,函数式,元变成等. 但谨记,不要随意混合使用各种特性,为自己制定使用原则,针对不同项目.业务. 如: 类C风格编程:没有模板,没有异常,没有重载 ...
- [leetcode]236. Lowest Common Ancestor of a Binary Tree 二叉树最低公共父节点
Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree. According ...
- CFR - another java decompiler批量反编译jar文件
jd-gui众所周知,业界公认的反编译必备工具. 笔者目前遇到一个java项目,社区版,想做一个本地化的版本,询问官方,官方说闭源,无奈之下只能反编译了. 面对那么多jar,jd-gui一个个去反编译 ...
- Python打杂之路
1.任务要落到纸上好记性不如烂笔头,再好的记性也不如写到纸上明确无误,写到纸上就不用担心会漏掉哪项工作.平时,我们总是在忙着一项工作的同时还惦记着下一项工作,把工作都记下后,我们就可以专注于一项工作, ...