这几个存储过程怎么写啊.

truelove7283159 2010-07-20 01:49:18
1.TABLE1 的触发器中的校验

CREATE TABLE1(
Id char(20) NOT NULL,
商品id char(10) NULL,
商品组ID char(10) NULL,
.............
lock_dt datetime NOT NULL
)
go


/*
我想表达,在插入时候, 商品ID和商品组ID同时不为空的时候做检查
商品必须是属于这个商品组的.要满足这个关系,我下面的写法对不
*/
if
update(商品id ) or
update(商品组ID)
begin
select @nullcnt = 0
select @validcnt = count(*)
from inserted, 商品组关系表 //在商品关系表中查,该商品是不是这个商品组的ID
where
inserted.商品id = 商品组关系表.商品id and
inserted.商品组ID= 商品组关系表.商品组ID

select @nullcnt = count(*) from inserted where//都不为空
inserted.商品id not null and
inserted.商品组ID is not null

if @validcnt + @nullcnt != @numrows
begin
select @errno = 80002,
@errmsg = '不能插入因为商品和所属商品关系组不匹配'
goto error
end
end

2 功能表ID字段定义,我想MY_FUNC 表的id字段定义为自增的 IDENTITY,
可我另外一个表 AUDIT_MY_FUNC(MY_FUNC变更时记录变更信息的表) 也有一个自增字段id,
我可以同时在AUDIT_MY_FUNC有两个IDENTITY吗.


CREATE TABLE MY_FUNC (
sp_fun_id numeric(12,0) IDENTITY,// 这样可以吗?
sp_name char(200) NOT NULL,
trade_type_ind char(1) NOT NULL,
rule_name char(25) NULL,
rule_description char(200) NULL,
status char(1) NOT NULL,
lock_dt datetime NOT NULL
)
go


CREATE TABLE AUDIT_MY_FUNC (//记录
id numeric(12,0) IDENTITY,// 这样可以吗?
modify_dt datetime NOT NULL,
audit_type_ind char(1) NOT NULL,
user_name varchar(30)NOT NULL,
sp_fun_id numeric(12,0) IDENTITY, // 这样可以吗?
status char(1) NOT NULL,
lock_dt datetime NOT NULL
)
LOCK DATAROWS
go

3 如何写存储过程从MY_FUNC 返回一个结果集

CREATE TABLE MY_FUNC (
sp_fun_id numeric(12,0) IDENTITY,// funtion 功能ID
sp_name char(200) NOT NULL, //function对应的 存储过程名字
trade_type_ind char(1) NOT NULL, //交易类型 A B C
rule_name char(25) NULL,
rule_description char(200) NULL,
status char(1) NOT NULL, //ACITVE/INACTIVE.
lock_dt datetime NOT NULL
)


我想有一个存储过程 sp_get_funs返回指定交易类型A的全部功能.

4 检验交易的规则存储过程 sp_check_with_funs 和 sp_check_a 怎么写

CREATE TABLE 交易记录表(
hdr_num int NOT NULL, 交易记录号
trade_type_ind char(1) NOT NULL, 交易类型 A B C
xml_text text NOT NULL, 交易类容
lock_dt datetime NOT NULL
)
go

/记录某一种商品交易的规则, 根据交易的商品或者商品的组,产地,类型来执行不同的格式合同/
CREATE 交易规则表 (
ID char(20) NOT NULL,
商品ID char(10) NULL,
商品组ID char(10) NULL,
商品产地ID char(10) NULL,
trade_type_ind char(1) NOT NULL, 交易类型 A B C
运送方式 char(1) NULL,
格式合同条款ID char(10) NOT NULL,
lock_dt datetime NOT NULL
)

我从第三步得到了要做的function列表,function_recordset.
遍历其中的每一个function,然后调用指定sp_name (如 funcation_a, sp_check_a),
我想让sp_check_a去交易记录表中读取一条交易记录, 然后去交易规则表中找对该条记录进行
分析匹配,找到一条适合的规则(找到第一个适合的就可以跳出匹配规则,不再匹配了),并返回这个规则(格式合同条款ID)

这块应该怎么写啊.





...全文
86 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
truelove7283159 2010-07-20
  • 打赏
  • 举报
回复
TO: gaojier1000 做了一段时间程序员拉, 数据库方面比较弱, 现在新换个工作, 应急啊, 没办法. 等我慢慢学,早就被开了.
TO: xys_777 那两个count怎么等于@numrows,@numrows又是什么
>>我从现有系统中抄的,不太明白.所以来问的,他们都在触发器进行一些判断
能不能插入,删除之类的,想先自己搞明白,实在不行了在问, 要不问弱智问题会被K的,汗
truelove7283159 2010-07-20
  • 打赏
  • 举报
回复
1.TABLE1 的触发器中的校验

CREATE TRADE_RULE(
RULE_ID char(20) NOT NULL,
CARGO_ID char(10) NULL,
CARGO_GROUP_ID char(10) NULL,
CARGO_LOCATION_ID char(10) NULL,
trade_type_ind char(1) NOT NULL, //交易类型 A B C
TERMS_ID char(10) NOT NULL, //合同条款
lock_dt datetime NOT NULL

)

CREATE CARGOGROUPRELATIONSHIP(
CARGOGROUP_R_ID char(20) NOT NULL,
CARGO_ID char(10) NULL,
CARGO_GROUP_ID char(10) NULL,
lock_dt datetime NOT NULL

)


e.g.

INSERT INTO TRADE_RULE VALUES ('rule_coal','coal_cd','coal_group_cd','山西','A','TERM_B',getdate());
INSERT INTO TRADE_RULE VALUES ('rule_Jet','jet_cd','jet_group_cd','陕西','A','TERM_C',getdate());
INSERT INTO TRADE_RULE VALUES ('rule_bean','bean_cd','bean_group_cd','吉林','B','TERM_A',getdate());
INSERT INTO TRADE_RULE VALUES ('rule_bean','bean_cd','coal_group_cd','四川','B','TERM_A',getdate()); //组选错了,不能存.


INSERT INTO TRADE_RULE VALUES ('1','coal_cd','coal_group_cd',getdate())
INSERT INTO TRADE_RULE VALUES ('2','jet_cd','jet_group_cd',getdate())
INSERT INTO TRADE_RULE VALUES ('3','bean_cd','bean_group_cd',getdate())







/*
我想表达,在插入时候, 商品ID(CARGO_ID)和商品组ID(CARGO_GROUP_ID)同时不为空的时候做检查
商品必须是属于这个商品组的.要满足这个关系,我下面的写法对不
*/
if
update(商品id ) or
update(商品组ID)
begin
select @nullcnt = 0
select @validcnt = count(*)
from inserted, CARGOGROUPRELATIONSHIP //在商品关系表中查,该商品是不是这个商品组的ID
where
inserted.CARGO_ID = CARGOGROUPRELATIONSHIP.CARGO_ID and
inserted.CARGO_GROUP_ID= CARGOGROUPRELATIONSHIP.CARGO_GROUP_ID

select @nullcnt = count(*) from inserted where//都不为空
inserted.CARGO_ID not null and
inserted.CARGO_GROUP_ID is not null

if @validcnt + @nullcnt != @numrows
begin
select @errno = 80002,
@errmsg = '不能插入因为商品和所属商品关系组不匹配'
goto error
end
end

//当都正确了, 我向AUDIT_TRADE_RULE增加一条记录,谁,在什么时候,修改了TRADE_RULE的记录.
INSERT INTO AUDIT_TRADE_RULE(getdate(),username(),'insert',.....)




2 功能表ID字段定义,我想MY_FUNC 表的id字段定义为自增的 IDENTITY,
可我另外一个表 AUDIT_MY_FUNC(MY_FUNC变更时记录变更信息的表) 也有一个自增字段id,
我可以同时在AUDIT_MY_FUNC有两个IDENTITY吗.


CREATE TABLE MY_FUNC (
sp_fun_id numeric(12,0) IDENTITY,// 这样可以吗?
sp_name char(200) NOT NULL,
trade_type_ind char(1) NOT NULL,
rule_name char(25) NULL,
rule_description char(200) NULL,
status char(1) NOT NULL,
lock_dt datetime NOT NULL
)
go


insert into MY_FUNC VALUES('sp_check_a','A','check_a','检查A类型交易应该执行的合同条款','A',getdate())
insert into MY_FUNC VALUES('sp_check_a1','A','default_a1','检查A类型交易的默认字段值是否正确','A',getdate())


3 如何写存储过程从MY_FUNC 返回一个结果集

CREATE TABLE MY_FUNC (
sp_fun_id numeric(12,0) IDENTITY,// funtion 功能ID
sp_name char(200) NOT NULL, //function对应的 存储过程名字
trade_type_ind char(1) NOT NULL, //交易类型 A B C
rule_name char(25) NULL,
rule_description char(200) NULL,
status char(1) NOT NULL, //ACITVE/INACTIVE.
lock_dt datetime NOT NULL
)

我想有一个存储过程 sp_get_funs返回指定交易类型A的全部功能.
//得到
---------------
sp_check_a
sp_check_a1


create proc sp_get_funs
@Type char(1)
AS
select * from MY_FUNC where trade_type_ind=@Type
go






4 检验交易的规则存储过程 sp_check_with_funs 和 sp_check_a 怎么写

CREATE TABLE TRADEINFO(
hdr_num int NOT NULL, 交易记录号
trade_type_ind char(1) NOT NULL, 交易类型 A B C
xml_text text NOT NULL, 交易类容
lock_dt datetime NOT NULL
)
go

insert into TRADEINFO VALUES(1001,'A','<trade id="1001"><hdr_num>1001</hdr_num><trade_type_ind>A</trade_type_ind><CARGO_ID>coal_cd</CARGO_ID><CARGO_GROUP_ID>coal_group_cd</CARGO_GROUP_ID><CARGO_LOCATION_ID>山西</CARGO_LOCATION_ID></trade>',getdate())




我从第三步得到了要做的function列表,function_recordset.
遍历其中的每一个function,然后调用指定sp_name (如 funcation_a, sp_check_a),
我想让sp_check_a去交易记录表中TRADEINFO读取一条交易记录, 然后去交易规则表TRADE_RULE中找对该条记录进行
分析匹配,找到一条适合的规则(找到第一个适合的就可以跳出匹配规则,不再匹配了),并返回这个规则(格式合同条款ID)

这块应该怎么写啊.

-------------------->>>>>>>
sp_check_with_funs
(1) call sp_get_funs 'A' //
(2) //得到
sp_check_a
sp_check_a1
(3) 遍历得到结果集 分别调用得到的结果,

3.1 sp_check_a
3.1.1 从 TRADEINFO 读记录,得到1001,xml表格式的. 不熟悉解析xml表解析就当一个字段先取了,然后设固定变量往下做吧,
我知道sybase中xmltract,别的数据库不知道呢。

3.1.2 TRADE_RULE 分析匹配得到TERM_B ,可能是下面这么写的.
(1)不过我传近来的交易记录不一定同时都有CARGO_ID和CARGO_GROUP_ID,大多数情况,只有里面的一个.
(2)我也不确定到底哪个TRADE_RULE是符合的,需要遍历一边这个表中交易类型是一样的所有规则,知道找到第一个合适的

select TERMS_ID from TRADE_RULE where CARGO_ID='coal_cd' and CARGO_GROUP_ID='coal_group_cd'
and CARGO_LOCATION_ID='山西' and trade_type_ind ='A'



3.2 sp_check_a1
//这个只管去调用了,参数格式 数目和sp_check_a都一样的,暂时先不管它里面执行代码了.




永生天地 2010-07-20
  • 打赏
  • 举报
回复
2、不能有多个自增
3、很容易
4、比较抽象,难于理解
永生天地 2010-07-20
  • 打赏
  • 举报
回复
1、那两个count怎么等于@numrows,@numrows又是什么
  • 打赏
  • 举报
回复
1、逻辑判断不建议使用触发器,建议写程序前判断是否满足条件,如果满足insert,否则给出提示;
2、一个表只能有一个自增列;
3、create proc sp_get_funs
@Type char(1)
AS
select * from MY_FUNC where trade_type_ind=@Type
go
上述存储过程创建好后,调用执行,传递参数为A即可获得你想要的结果。
4、还没有看明白。


综述:我不是很明白楼主为什么提出这样的问题,是你的作业还是其他的,总之比较全面的基础内容,建议还是有人带你一下,这些东西都不是复杂,建议多看基础的东西,不要上来就往上冲,只有基础掌握好了,才能有更快的进步。

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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