Firebird主从表存储过程的两种写法

33 篇文章 0 订阅
13 篇文章 0 订阅

有三个表:tb_employee,tb_customer,tb_movemaster,分别表示一个公司的业务员、公司的客户和公司的销售主文件表,它们是父表和子表的关系:

CREATE TABLE TB_EMPLOYEE (
    F_ID            INTEGER NOT NULL,
    F_DEPTNO        INTEGER,
    F_EMPLOYEENO    INTEGER,
    F_EMPLOYEENAME  VARCHAR(50),
    F_TEL           VARCHAR(50)
);

CREATE TABLE TB_CUSTOMER (
    F_ID          INTEGER NOT NULL,
    F_EMPLOYEENO  INTEGER,
    F_CUSTNO      INTEGER,
    F_CUSTNAME    VARCHAR(50),
    F_CUSTADDR    VARCHAR(255),
    F_TEL         VARCHAR(50),
    F_MEMO        VARCHAR(255)
);

ALTER TABLE TB_CUSTOMER ADD CONSTRAINT FK_TB_CUSTOMER_1 FOREIGN KEY (F_EMPLOYEENO) REFERENCES TB_EMPLOYEE (F_EMPLOYEENO);

CREATE TABLE TB_MOVEMASTER (
    F_ID        INTEGER NOT NULL,
    F_CUSTNO    INTEGER,
    F_MOVENO    INTEGER,
    F_AMOUNT    NUMERIC(15,2),
    F_DATETIME  TIMESTAMP,
    F_MEMO      VARCHAR(10)
);

ALTER TABLE TB_MOVEMASTER ADD CONSTRAINT FK_TB_MOVEMASTER_1 FOREIGN KEY (F_CUSTNO) REFERENCES TB_CUSTOMER (F_CUSTNO);

 

现在要输出成以下形式供导航树用:

DISPLAYFIELD IMAGEINDEXFIELD KEYFIELD LISTFIELD PARENTFIELD                                       
光明公司 comp 光明公司 光明公司 <null>  
销售一组 dept 销售一组 销售一组 光明公司 
销售一组 dept 销售一组 销售一组 光明公司 
销售二组 dept 销售二组 销售二组 光明公司 
销售二组 dept 销售二组 销售二组 光明公司 
销售三组 dept 销售三组 销售三组 光明公司 
销售三组 dept 销售三组 销售三组 光明公司 
销售四组 dept 销售四组 销售四组 光明公司 
销售四组 dept 销售四组 销售四组 光明公司 
销售四组 dept 销售四组 销售四组 光明公司 
销售四组 dept 销售四组 销售四组 光明公司 
小明 emp  小明 小明 销售一组 
小明 emp  小明 小明 销售一组 
小华 emp  小华 小华 销售一组 
小华 emp  小华 小华 销售一组 
张三 emp  张三 张三 销售二组 
张三 emp  张三 张三 销售二组 
李四 emp  李四 李四 销售二组 
李四 emp  李四 李四 销售二组 
王二 emp  王二 王二 销售三组

写法一:

CREATE PROCEDURE P_GENTREE
RETURNS (
    DISPLAYFIELD VARCHAR(50),
    IMAGEINDEXFIELD VARCHAR(50),
    KEYFIELD VARCHAR(50),
    LISTFIELD VARCHAR(50),
    PARENTFIELD VARCHAR(50))
AS
DECLARE VARIABLE DEPTNO INTEGER;
DECLARE VARIABLE EMPLOYEENAME VARCHAR(50);
DECLARE VARIABLE EMPLOYEENO INTEGER;
DECLARE VARIABLE CUSTNAME VARCHAR(50);
DECLARE VARIABLE CUSTNO INTEGER;
begin

  --输出客户结点
for
    select m.f_custno
    from tb_movemaster m
    into :custno
  do
  begin
    select c.f_custno,c.f_custname,'cust',c.f_custname,c.f_custname,e.f_employeename
    from tb_customer c,tb_employee e
    where c.f_custno=:custno and c.f_employeeno=e.f_employeeno
    into :custno,:displayfield,:imageindexfield,:keyfield,:listfield,:parentfield
  end

end

 

写法二:

CREATE PROCEDURE P_GENTREE
RETURNS (
    DISPLAYFIELD VARCHAR(50),
    IMAGEINDEXFIELD VARCHAR(50),
    KEYFIELD VARCHAR(50),
    LISTFIELD VARCHAR(50),
    PARENTFIELD VARCHAR(50))
AS
DECLARE VARIABLE DEPTNO INTEGER;
DECLARE VARIABLE EMPLOYEENAME VARCHAR(50);
DECLARE VARIABLE EMPLOYEENO INTEGER;
DECLARE VARIABLE CUSTNAME VARCHAR(50);
DECLARE VARIABLE CUSTNO INTEGER;
begin

  for
    select c.f_custno,c.f_custname,'cust',c.f_custname,c.f_custname,e.f_employeename
    from tb_customer c,tb_employee e
    where c.f_employeeno=e.f_employeeno
    into :custno,:displayfield,:imageindexfield,:keyfield,:listfield,:parentfield
  do
  begin
    suspend;
    for
      select cast(m.f_moveno as varchar(50)),'mast',cast(m.f_moveno as varchar(50)),
        cast(m.f_moveno as varchar(50)),:custname
      from tb_movemaster m
      where m.f_custno=:custno
      into :displayfield,:imageindexfield,:keyfield,:listfield,:parentfield
    do
    begin
      suspend;
    end
  end

end

 

写法一简洁一些,写法二繁锁一些,当有销售数据时,两种写法都能查到相应数据,但是当销售数据为空时,则写法一没有客户输出。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值