怎么写触发器和存储过程/函数??????

飞火流星02027 2009-09-24 03:07:10

怎么写触发器和存储过程/函数??????
有两个表,一个存储位置参数表:
CREATE TABLE T_PUB_CCWZCS
(
N_GH tinyint PRIMARY KEY,//柜号(2位)
N_ZGCS tinyint,//总共层数(2位)
N_KFHS tinyint,//可放盒数(2位)
N_KFPS tinyint,//可放盘数(3位)
)

存储位置表:
CREATE TABLE T_GPGL_CCWZ
(
C_CCWZID varchar(8) 主键,形式:(01-01-01)柜号(2位)+层号(2位)+盒号(2位)
N_GH tinyint, //柜号(2位)
N_CH tinyint, //层号(2位)
N_HH tinyint, //盒号(2位)
N_YS tinyint, //余数 (默认值是盒子子的容量)
)

CREATE TRIGGER MyfirstTrigger ON _PUB_CCWZCS
AFTER INSERT
AS
.........
怎么创建一个触发器(或都别的方法也行),做到如下功能:
当:
insert into T_PUB_CCWZCS //存储位置参数表
values(1,3,2,120);
之后马上:
insert into T_PUB_CCWZ //存储位置表
values(01-01-01,1,1,1,120);
insert into T_PUB_CCWZ
values(01-01-02,1,1,2,120);
insert into T_PUB_CCWZ
values(01-02-01,1,2,1,120);
insert into T_PUB_CCWZ
values(01-02-02,1,2,2,120);
insert into T_PUB_CCWZ
values(01-03-01,1,3,1,120);
insert into T_PUB_CCWZ
values(01-03-02,1,3,2,120);
当:
delete from T_PUB_CCWZCS where N_GH=1 //存储位置参数表
之后马上:
删除上面的记录!!

每当在into T_PUB_CCWZCS表中增加一条记录都会在存储位置表中增加该柜子的所有存储位置记录,
每当在into T_PUB_CCWZCS表中增加删除一订记录都会在存储位置表中删除该柜子的所有存储位置记录,
怎么写触发器和存储过程/函数??????
关于insert相关的下面的怎么改写就可以了????


CREATE TRIGGER MyfirstTrigger ON _PUB_CCWZCS
AFTER INSERT
AS
declare @i int,@j int,@t int;
select @i=N_ZGCS,@t=N_KFHS from inserted;
while @i>0
begin
set @j=@t;
while @j>0
begin
insert into T_GPGL_CCWZ(C_CCWZID,N_GH,N_CH,N_HH,N_YS) select N_GH+'-'+@i+'-'+@j,N_GH,@i,@j,N_KFPS from inserted;
set @j=@j-1
end
set @i=@i-1
end
[size=14px]怎么写触发器和存储过程/函数??????





...全文
116 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
飞火流星02027 2009-09-24
  • 打赏
  • 举报
回复
哦,我for后面写掉了delete,谢谢了,js_szy!!!
飞火流星02027 2009-09-24
  • 打赏
  • 举报
回复
奇怪,我看你写的也没有错啊??
飞火流星02027 2009-09-24
  • 打赏
  • 举报
回复
delete对T_GPGL_CCWZ表的记录似乎没有影响啊??
华夏小卒 2009-09-24
  • 打赏
  • 举报
回复

---插入和删除

IF OBJECT_ID('T_PUB_CCWZCS') IS NOT NULL
DROP TABLE T_PUB_CCWZCS
Go
CREATE TABLE T_PUB_CCWZCS
(N_GH tinyint PRIMARY KEY,--//柜号
N_CS tinyint,--//层数
N_HS tinyint,--//盒数
N_PS tinyint,--//容量
)
IF OBJECT_ID('T_GPGL_CCWZ') IS NOT NULL
DROP TABLE T_GPGL_CCWZ
Go
CREATE TABLE T_GPGL_CCWZ
( ID int IDENTITY (1, 1) NOT NULL,
N_GH varchar(20), --//柜号
N_CH tinyint, --//层号
N_HH tinyint, --//盒号
N_YS tinyint, --//余数 (默认值是盒子子的容量) )
)

if object_id('gg') is not null drop trigger gg
go
create trigger gg on T_PUB_CCWZCS
for insert ,delete
as
if not exists(select 1 from deleted) ------- 插入
begin
declare @n int,@m int,@cs int,@hs int
set @cs=(select N_CS from inserted)
set @hs=(select N_HS from inserted)

set @n=1
set @m=1
while @n<=@cs
begin
while @m<=@hs
begin
insert T_GPGL_CCWZ
select right('0'+ltrim(N_GH),2)+'-'+right('0'+ltrim(@n),2)+'-'+right('0'+ltrim(@m),2),@n,@m,N_PS FROM inserted
set @m=@m+1
end

set @n=@n+1
set @m=1
end
end
else ----删除
begin
delete a
from T_GPGL_CCWZ a,deleted d
where cast(left(a.N_GH,2)as int)=d.N_GH
end

go

------------------------
insert into T_PUB_CCWZCS values(1,3,2,120)

insert into T_PUB_CCWZCS values(2,2,2,120)

select * from T_GPGL_CCWZ

ID N_GH N_CH N_HH N_YS
----------- -------------------- ---- ---- ----
1 01-01-01 1 1 120
2 01-01-02 1 2 120
3 01-02-01 2 1 120
4 01-02-02 2 2 120
5 01-03-01 3 1 120
6 01-03-02 3 2 120
7 02-01-01 1 1 120
8 02-01-02 1 2 120
9 02-02-01 2 1 120
10 02-02-02 2 2 120


delete from T_PUB_CCWZCS where N_GH=1
select * from T_GPGL_CCWZ

ID N_GH N_CH N_HH N_YS
----------- -------------------- ---- ---- ----
7 02-01-01 1 1 120
8 02-01-02 1 2 120
9 02-02-01 2 1 120
10 02-02-02 2 2 120

(4 行受影响)
华夏小卒 2009-09-24
  • 打赏
  • 举报
回复

IF OBJECT_ID('T_PUB_CCWZCS') IS NOT NULL
DROP TABLE T_PUB_CCWZCS
Go
CREATE TABLE T_PUB_CCWZCS
(N_GH tinyint PRIMARY KEY,--//柜号
N_CS tinyint,--//层数
N_HS tinyint,--//盒数
N_PS tinyint,--//容量
)
IF OBJECT_ID('T_GPGL_CCWZ') IS NOT NULL
DROP TABLE T_GPGL_CCWZ
Go
CREATE TABLE T_GPGL_CCWZ
( ID int IDENTITY (1, 1) NOT NULL,
N_GH varchar(20), --//柜号
N_CH tinyint, --//层号
N_HH tinyint, --//盒号
N_YS tinyint, --//余数 (默认值是盒子子的容量) )
)

if object_id('gg') is not null drop trigger gg
go
create trigger gg on T_PUB_CCWZCS
for insert
as
declare @n int,@m int,@cs int,@hs int
set @cs=(select N_CS from inserted)
set @hs=(select N_HS from inserted)

set @n=1
set @m=1
while @n<=@cs
begin
while @m<=@hs
begin
insert T_GPGL_CCWZ
select right('0'+ltrim(N_GH),2)+'-'+right('0'+ltrim(@n),2)+'-'+right('0'+ltrim(@m),2),@n,@m,N_PS FROM inserted
set @m=@m+1
end

set @n=@n+1
set @m=1
end
go

------------------------
insert into T_PUB_CCWZCS values(1,3,2,120)

select * from T_GPGL_CCWZ

ID N_GH N_CH N_HH N_YS
----------- -------------------- ---- ---- ----
1 01-01-01 1 1 120
2 01-01-02 1 2 120
3 01-02-01 2 1 120
4 01-02-02 2 2 120
5 01-03-01 3 1 120
6 01-03-02 3 2 120

(6 行受影响)
飞火流星02027 2009-09-24
  • 打赏
  • 举报
回复
触发器中怎么定义char类型的变量啊?
bancxc 2009-09-24
  • 打赏
  • 举报
回复
看联机文档
飞火流星02027 2009-09-24
  • 打赏
  • 举报
回复
与刚才的不一样
华夏小卒 2009-09-24
  • 打赏
  • 举报
回复
刚不是发过了吗?
dawugui 2009-09-24
  • 打赏
  • 举报
回复
--触发器的操作1

create table 化验室纱组(本厂编号 int,客户 int,色号 int,纱支 int)
create table 化验室布组(本厂编号 int,客户 int,色号 int,布类 int)
go
create trigger my_trig on 化验室纱组 for insert ,update ,delete
as
if not exists(select 1 from inserted)
delete 化验室布组 from deleted t where 化验室布组.本厂编号 = t.本厂编号
else if not exists(select 1 from deleted)
insert into 化验室布组(本厂编号 ,客户 ,色号) select 本厂编号 ,客户 ,色号 from inserted
else
update 化验室布组 set 客户 = t.客户 , 色号 = t.色号 from inserted t where 化验室布组.本厂编号 = t.本厂编号
go

--1、insert 对化验室纱组插入数据,然后查看化验室布组表的数据
insert into 化验室纱组 values(1 , 2 , 3 , 4)
insert into 化验室纱组 values(5 , 6 , 7 , 8)
go
select * from 化验室布组
/*
本厂编号 客户 色号 布类
----------- ----------- ----------- -----------
1 2 3 NULL
5 6 7 NULL

(所影响的行数为 2 行)
*/

--2、update , 更改化验室纱组表中本厂编号=1的色号=6
update 化验室纱组 set 色号 = 6 where 本厂编号 = 1
go
select * from 化验室布组
/*
本厂编号 客户 色号 布类
----------- ----------- ----------- -----------
1 2 6 NULL
5 6 7 NULL

(所影响的行数为 2 行)
*/

--3、delete 化验室纱组表中本厂编号=1的那条数据
delete from 化验室纱组 where 本厂编号 = 1
go
select * from 化验室布组
/*
本厂编号 客户 色号 布类
----------- ----------- ----------- -----------
5 6 7 NULL

(所影响的行数为 1 行)
*/

drop table 化验室纱组 , 化验室布组
目 录 第一章 PL/SQL 程序设计简介 4 §1.2 SQL与PL/SQL 4 §1.2.1 什么是PL/SQL? 4 §1.2.1 PL/SQL的好处 4 §1.2.2 PL/SQL 可用的SQL语句 5 §1.3 运行PL/SQL程序 5 第二章 PL/SQL块结构和组成元素 6 §2.1 PL/SQL块 6 §2.2 PL/SQL结构 6 §2.3 标识符 6 §2.4 PL/SQL 变量类型 7 §2.4.1 变量类型 7 §2.4.2 复合类型 9 §2.4.3 使用%ROWTYPE 11 §2.4.4 LOB类型* 11 §2.4.5 Bind 变量 11 §2.4.6 INDEX BY TABLES 12 §2.4.7 数据类型的转换* 13 §2.5 运算符和表达式(数据定义) 13 §2.5.1 关系运算符 13 §2.5.2 一般运算符 13 §2.5.3 逻辑运算符 13 §2.6 变量赋值 13 §2.6.1 字符及数字运算特点 13 §2.6.2 BOOLEAN 赋值 13 §2.6.3 数据库赋值 13 §2.6.4 可转换的类型赋值 13 §2.7 变量作用范围及可见性 13 §2.8 注释 13 §2.9 简单例子 13 §2.9.1 简单数据插入例子 13 §2.9.2 简单数据删除例子 13 第三章 PL/SQL流程控制语句 13 §3.1 条件语句 13 §3.2 CASE 表达式 13 §3.3 循环 13 §3.3 标号和GOTO 13 §3.4 NULL 语句 13 第四章 游标的使用 13 §4.1 游标概念 13 §4.1.1 处理显式游标 13 §4.1.2 处理隐式游标 13 §4.1.3 游标修改和删除操作 13 第五章 异常错误处理 13 §5.1 异常处理概念 13 §5.1.1 预定义的异常处理 13 §5.1.2 非预定义的异常处理 13 §5.1.3 用户自定义的异常处理 13 §5.1.4 用户定义的异常处理 13 §5.2 异常错误传播 13 §5.2.1 在执行部分引发异常错误 13 §5.2.2 在声明部分引发异常错误 13 §5.3 异常错误处理编程 13 §5.4 在 PL/SQL 中使用 SQLCODE, SQLERRM 13 第六章 存储函数和过程 13 §6.1 引言 13 §6.2 创建函数 13 §6.3 存储过程 13 §6.3.1 创建过程 13 §6.3.2 调用存储过程 13 §6.3.3 开发存储过程步骤 13 §6.3.4 与过程相关数据字典 13 第七章 包的创建和应用 13 §7.1 引言 13 §7.2 包的定义 13 §7.3 包的开发步骤 13 §7.4 包定义的说明 13 §7.5 子程序重载 13 §7.6 删除过程、函数和包 13 §7.7 包的管理 13 第八章 触发器 13 §8.1 触发器类型 13 §8.1.1 DML触发器 13 §8.1.2 替代触发器 13 §8.1.3 系统触发器 13 §8.2 创建触发器 13 §8.2.1 触发器触发次序 13 §8.2.2 创建DML触发器 13 §8.2.3 创建替代(Instead_of)触发器 13 §8.2.3 创建系统事件触发器 13 §8.2.4 系统触发器事件属性 13 §8.2.5 使用触发器谓词 13 §8.2.6 重新编译触发器 13 §8.3 删除和使能触发器 13 §8.4 触发器和数据字典 13 §8.5 数据库触发器的应用举例 13
第一章 PL/SQL 程序设计简介 4 §1.2 SQL与PL/SQL 4 §1.2.1 什么是PL/SQL? 4 §1.2.1 PL/SQL的好处 4 §1.2.2 PL/SQL 可用的SQL语句 5 §1.3 运行PL/SQL程序 5 第二章 PL/SQL块结构和组成元素 6 §2.1 PL/SQL块 6 §2.2 PL/SQL结构 6 §2.3 标识符 6 §2.4 PL/SQL 变量类型 7 §2.4.1 变量类型 7 §2.4.2 复合类型 9 §2.4.3 使用%ROWTYPE 11 §2.4.4 LOB类型* 11 §2.4.5 Bind 变量 11 §2.4.6 INDEX BY TABLES 12 §2.4.7 数据类型的转换* 13 §2.5 运算符和表达式(数据定义) 13 §2.5.1 关系运算符 13 §2.5.2 一般运算符 13 §2.5.3 逻辑运算符 13 §2.6 变量赋值 13 §2.6.1 字符及数字运算特点 13 §2.6.2 BOOLEAN 赋值 13 §2.6.3 数据库赋值 13 §2.6.4 可转换的类型赋值 13 §2.7 变量作用范围及可见性 13 §2.8 注释 13 §2.9 简单例子 13 §2.9.1 简单数据插入例子 13 §2.9.2 简单数据删除例子 13 第三章 PL/SQL流程控制语句 13 §3.1 条件语句 13 §3.2 CASE 表达式 13 §3.3 循环 13 §3.3 标号和GOTO 13 §3.4 NULL 语句 13 第四章 游标的使用 13 §4.1 游标概念 13 §4.1.1 处理显式游标 13 §4.1.2 处理隐式游标 13 §4.1.3 游标修改和删除操作 13 第五章 异常错误处理 13 §5.1 异常处理概念 13 §5.1.1 预定义的异常处理 13 §5.1.2 非预定义的异常处理 13 §5.1.3 用户自定义的异常处理 13 §5.1.4 用户定义的异常处理 13 §5.2 异常错误传播 13 §5.2.1 在执行部分引发异常错误 13 §5.2.2 在声明部分引发异常错误 13 §5.3 异常错误处理编程 13 §5.4 在 PL/SQL 中使用 SQLCODE, SQLERRM 13 第六章 存储函数和过程 13 §6.1 引言 13 §6.2 创建函数 13 §6.3 存储过程 13 §6.3.1 创建过程 13 §6.3.2 调用存储过程 13 §6.3.3 开发存储过程步骤 13 §6.3.4 与过程相关数据字典 13 第七章 包的创建和应用 13 §7.1 引言 13 §7.2 包的定义 13 §7.3 包的开发步骤 13 §7.4 包定义的说明 13 §7.5 子程序重载 13 §7.6 删除过程、函数和包 13 §7.7 包的管理 13 第八章 触发器 13 §8.1 触发器类型 13 §8.1.1 DML触发器 13 §8.1.2 替代触发器 13 §8.1.3 系统触发器 13 §8.2 创建触发器 13 §8.2.1 触发器触发次序 13 §8.2.2 创建DML触发器 13 §8.2.3 创建替代(Instead_of)触发器 13 §8.2.3 创建系统事件触发器 13 §8.2.4 系统触发器事件属性 13 §8.2.5 使用触发器谓词 13 §8.2.6 重新编译触发器 13 §8.3 删除和使能触发器 13 §8.4 触发器和数据字典 13 §8.5 数据库触发器的应用举例 13

22,300

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧