触发器调用存储过程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
我写了个存储过程:
create or replace procedure ADD_FEE(MasterID in number)
然后建立一个触发器,在其中调用这个存储过程:
create OR REPLACE trigger insert_elect_water_report
AFTER insert on elect_water_fee_master
for each row
BEGIN
conn.execute ADD_FEE(:new.master_id);
END;
可出现:
“警告: 创建的触发器带有编译错误。”提示,用show erro显示如下:
2/8 PLS-00103: 出现符号 "SQL"在需要下列之一时:
:=.(@%;
符号 ":=在 "SQL" 继续之前已插入。
3/16 PLS-00103: 出现符号 "ADD_FEE"在需要下列之一时:
:=.(@%;
符号 ":=" 被替换为 "ADD_FEE" 后继续。
而触发器改为:
create OR REPLACE trigger insert_elect_water_report
AFTER insert on elect_water_fee_master
for each row
BEGIN
conn.execute ADD_FEE(:new.master_id);
END;
后,用show erro显示如下:
2/11 PLS-00103: 出现符号 "ADD_FEE"在需要下列之一时:
:=.(@%;immediate
符号 ":=" 被替换为 "ADD_FEE" 后继续。
我错在什么地方?
sp_depends
显示有关数据库对象相关性的信息(例如,依赖表或视图的视图和过程,以及视图或过程所依赖的表和视图)。不报告对当前数据库以外对象的引用。
语法
sp_depends [ @objname = ] 'object'
参数
[@objname =] 'object'
被检查相关性的数据库对象。对象可以是表、视图、存储过程或触发器。Object 的数据类型为 varchar(776),没有默认值。
返回代码值
0(成功)或 1(失败)
结果集
sp_depends 显示两个结果集。
下面的结果集显示 object 所依赖的对象。
列名 数据类型 描述
name nvarchar(40) 存在相关性的项目名称。
type nvarchar(16) 项目类型。
updated nvarchar(7) 是否更新项目。
selected nvarchar(8) 项目是否用于 SELECT 语句。
column sysname 存在相关性的列或参数。
下面的结果集显示依赖 object 的对象。
列名 数据类型 描述
name nvarchar(40) 存在相关性的项目名称。
type nvarchar(16) 项目类型。
注释
若一个对象引用另一个对象,则认为前者依赖后者。sp_depends 通过查看 sysdepends 表确定相关性。
权限
执行权限默认授予 public 角色。
示例
下面的示例列出依赖 Customers 表的数据库对象。
USE Northwind
EXEC sp_depends 'Customers'
EXECUTE master.dbo.xp_sendmail 加你的参数
有一触发器如下:
create or replace trigger t_load_inst_data_update
after update on t_mgt_inst
for each row
declare
-- local variables here
begin
--调用存储过程
begin
load_inst_data;
end;
end t_load_inst_data_update;
load_inst_data存储过程如下:
create or replace procedure load_inst_data is
begin
delete from t_mgt_inst_layer;
declare
v_inst_code varchar2(20) :=null;
v_inst_name varchar2(60) :=null;
v_inst_grade varchar2(10) :=null;
cursor c_load_data is
select inst_code,inst_name,inst_grade
from t_mgt_inst
where inst_grade<>'0'; --出错位置, 说t_mgt_inst已发生变化,不能调用
--begin
begin
--open cursor
open c_load_data;
loop
fetch c_load_data into v_inst_code,v_inst_name,v_inst_grade;
exit when c_load_data%NOTFOUND;
insert into t_mgt_inst_layer(inst_code,inst_name,inst_grade,sub_inst_code)
select v_inst_code,v_inst_name,v_inst_grade,sub_inst_code
from (select inst_code as sub_inst_code from t_mgt_inst
start with inst_code=v_inst_code connect by prior inst_code = parent_inst);
end loop;
close c_load_data;
end;
end load_inst_data;
--出错:, 说t_mgt_inst已发生变化,不能调用, 请问该如何处理, 请帮忙?
CREATE TRIGGER Trigger1 ON Table1
FOR INSERT
AS
declare @f1 varchar(10)
declare @f2 varchar(10)
select @f1=I.Field1,
@f2=I.Field2
from Inserted I
if (select count(*) from table1
where Table1.Field1=@f1
and Table1.Field2=@f2)>0
begin
delete from Table1
where Table1.Field1=@f1
and Table1.Field2=@f2
end