编写一个迭代函数

[code="java"]
--两张Oracle数据库表:

--票品目录表
CREATE TABLE "YZPP"."T_PUB_PPML"
( "N_PPDH" NUMBER(8,0) NOT NULL ENABLE, --票品代号
"N_PPZL" NUMBER(1,0), --票品种类
"N_MZ" NUMBER(10,4), --面值
CONSTRAINT "PK_SC" PRIMARY KEY ("N_PPDH")
)
--基础内件表
CREATE TABLE "YZPP"."T_JYP_JCNJ"
( "N_PPDH" NUMBER(8,0) NOT NULL ENABLE, --票品代号
"N_NJDH" NUMBER(8,0) NOT NULL ENABLE, --内件代号
"N_PPSL" NUMBER(4,0) DEFAULT 1, --票品数量
CONSTRAINT "PK_SC" PRIMARY KEY ("N_PPDH,N_NJDH"),
CONSTRAINT "FK_SC_S" FOREIGN KEY ("N_NJDH")
REFERENCES "YZPP"."t_pub_ppml" ("N_PPDH") ENABLE
)

select N_PPDH,N_NJDH,N_PPSL from T_JYP_JCNJ
89410400 138800 1
89410400 4282100 1
89420400 48722400 4
89420400 48732100 1
89420400 62285100 10
89420400 62285200 10

[/code]

票品种类(N_PPZL)取值为:
0:集邮票 1:零枚票 2:集邮品 3集邮用品 4:拓展产品 5:通信票
其中:
2:集邮品 3集邮用品 4:拓展产品 ->属于上层的东西没有面值,有内件
0:集邮票 1:零枚票 5:通信票 ->属于底层的东西,有面值,没有内件

请写出一迭代函数,求票品种类 n_ppzl in (2,3,4) 的品的内件面值:
(2:集邮品 3集邮用品 4:拓展产品--统称为品)
(0:集邮票 1:零枚票 5:通信票 --统称为票)
[code="java"]
--求票或品的内件面值
function f_njmz(number(8) n_ppdh){
number(4) ppzl;
number(15,4) mz;
select n_ppzh into n_ppzl from t_pub_ppml where where n_ppdh=:n_ppdh
if n_ppzl in (0,1,5)
select n_mz into mz from t_pub_ppml where where n_ppdh=:n_ppdh
open cursor
select N_NJDH from T_JYP_JCNJ where n_ppdh=:n_ppdh)
n_njdh
........
--注:一个品可能有多个内件;
如果内件是品,内件还有内件;
如果内件是票,内件
..........
....
return mz;

}
[/code]

[code="java"]
CREATE OR REPLACE FUNCTION "F_NJMZ" (PPDH NUMBER) RETURN NUMBER IS
--查询品的内件面值 author : 戴忠德
num_mz number(10,4); --面值
num_ppzl number(1); --票品种类
num_njdh number(8); --内件代号

CURSOR mycur(cppdh number) is
select N_NJDH from T_JYP_JCNJ where n_ppdh=cppdh;

BEGIN
num_mz:=0;
select N_PPZL INTO num_ppzl FROM T_PUB_PPML WHERE N_PPDH=PPDH;
--0:集邮票 1:零枚票 5:通信票 ->属于底层的东西,有面值,没有内件
IF num_ppzl in (0,1,5) THEN
SELECT nvl(N_MZ,0) INTO num_mz FROM T_PUB_PPML WHERE N_PPDH=PPDH;
----2:集邮品 3集邮用品 4:拓展产品 ->属于上层的东西没有面值,一般有内件
ELSIF num_ppzl in (2,3,4) THEN
begin
if mycur%isopen = false then
open mycur(PPDH);
end if;
loop
fetch mycur into num_njdh;
exit when mycur%notfound;
--dbms_output.put_line('fetch 内件代号:'||num_njdh||' 累加内件面值');
num_mz:=num_mz+f_njmz(num_njdh);
end loop;
close mycur;
--dbms_output.put_line('结束 mycur closed!');
end;
ELSE
num_mz:=0;
END IF;
return num_mz;
END;
[/code]

我不知道我理解的对不对哈。
这个相当于一堆树,每个树枝的末端是票,其余是品。
如果这棵树只是单单一个票,就相当于根和树枝是重合的。
而你要做的,是要取出上层有品的票。

如果这个理解是对的:
2:集邮品 3集邮用品 4:拓展产品 ->属于上层的东西没有面值,有内件
0:集邮票 1:零枚票 5:通信票 ->属于底层的东西,有面值,没有内件

也就是说,只有当2,3,4时,才会在T_JYP_JCNJ表里有数据。

也就是说,你只需要查询T_JYP_JCNJ表,就相当于将上层没有品的票过滤掉了。然后关联到T_PUB_PPML表,在用0,1,5过滤一下,就能拿到所有上层有品的票。