问题描述
--两张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_JCNJ89410400138800189410400428210018942040048722400489420400487321001894204006228510010894204006228520010票品种类(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:通信票 --统称为票)--求票或品的内件面值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;}
解决方案
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) isselect 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;
解决方案二:
我不知道我理解的对不对哈。这个相当于一堆树,每个树枝的末端是票,其余是品。如果这棵树只是单单一个票,就相当于根和树枝是重合的。而你要做的,是要取出上层有品的票。如果这个理解是对的:2:集邮品 3集邮用品 4:拓展产品 ->属于上层的东西没有面值,有内件0:集邮票 1:零枚票 5:通信票 ->属于底层的东西,有面值,没有内件也就是说,只有当2,3,4时,才会在T_JYP_JCNJ表里有数据。也就是说,你只需要查询T_JYP_JCNJ表,就相当于将上层没有品的票过滤掉了。然后关联到T_PUB_PPML表,在用0,1,5过滤一下,就能拿到所有上层有品的票。