yinyun594230 2010-09-06 21:21
浏览 252
已采纳

编写一个迭代函数

[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]

  • 写回答

2条回答 默认 最新

  • 飞火流星02027 2010-09-12 11:46
    关注

    [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]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)