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
写法一简洁一些,写法二繁锁一些,当有销售数据时,两种写法都能查到相应数据,但是当销售数据为空时,则写法一没有客户输出。
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
写法一简洁一些,写法二繁锁一些,当有销售数据时,两种写法都能查到相应数据,但是当销售数据为空时,则写法一没有客户输出。
相关文章推荐
- 两种写法不同作用相同的存储过程
- mySql数据库存储过程打印参数写法
- oracle 的存储过程写法
- mysql存储过程定时调用两种方式
- asp.net中怎样调用存储过程和存储过程的写法
- asp.net中怎样调用存储过程和存储过程的写法
- 使用SQL Server存储过程中的返回值的两种方法
- 执行存储过程的多种写法
- oracle的存储过程写法以及调用,各种游标的介绍(静态,动态,sys游标的区别)
- 两种分页存储过程
- SQL SERVER 利用存储过程查看角色和用户信息的写法
- 存储过程几种写法
- sql存储过程参数不填写时的正确写法
- 能用sql搞定就用sql,不要用程序去搞定,因为这样太慢了,见下项目过程中的两种写法
- 在C#中调用存储过程中的两种返回值
- SQL Server两种分页的存储过程介绍
- postgreSQL存储过程写法示例
- T-SQL 存储过程中使用事务的几种写法(摘抄)
- oracle 存储过程的写法
- SQL与Oracle两种形式分页存储过程