您的位置:首页 > 其它

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

2010-05-14 09:46 253 查看
有三个表: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

写法一简洁一些,写法二繁锁一些,当有销售数据时,两种写法都能查到相应数据,但是当销售数据为空时,则写法一没有客户输出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: