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
  end2 功能表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
go3 如何写存储过程从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)这块应该怎么写啊. 

解决方案 »

  1.   


    -- 这里是 Oracle 版论坛,你这是 SQL Server的语法!
    -- 别发错论坛啦..........
      

  2.   

    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
     )
    goinsert 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都一样的,暂时先不管它里面执行代码了.
      

  3.   

    to luoyoumou, 基本语法还是一样的吧, 
    就算不一样,要是在oracle实现了,我参考下在别的数据库中实现哈.