编写一个迭代函数

问题描述

--两张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过滤一下,就能拿到所有上层有品的票。

时间: 2024-10-03 15:29:29

编写一个迭代函数的相关文章

vb-VB中的InStr在C#中有什么表示?或者怎么编写一个InStr函数?Mid函数呢?

问题描述 VB中的InStr在C#中有什么表示?或者怎么编写一个InStr函数?Mid函数呢? VB翻译成C#的问题,VB中的InStr在C#中有什么表示?或者怎么编写一个InStr函数?Mid函数呢? 解决方案 instr函数,string.indexof mid函数,string.substring 解决方案二: InStr 函数VB InStr函数 解决方案三: c#中indexof

用c语言编写一个数组排序函数 要求如下

问题描述 用c语言编写一个数组排序函数 要求如下 1.既能从小到大也能从大到小 2.对int,unsigned int,const int,double 等类型数组都适用 3.尽量简洁 解决方案 参考系统函数qsort的实现.允许用户传一个比较函数指针.各种类型,按照大小排序,都由用户传这个比较函数实现.这样就通用了. 解决方案二: 你去搜,c 模板 排序,能搜到 解决方案三: 你是刚刚学习C语言么?你现在想要的是一段严格规范的代码,还是说一种编程的思路,又或者,只是为了应付一下某个任务?

如何编写一个全新的 Git 协议

曾几何时,我在持续追踪自己的文件方面遇到一些问题.通常,我忘了自己是否将文件保存在自己的桌面电脑.笔记本电脑或者电话上,或者保存在了云上的什么地方.更有甚者,对非常重要的信息,像密码和Bitcoin的密匙,仅以纯文本邮件的形式将它发送给自己让我芒刺在背. 我需要的是将自己的数据存放一个git仓库里,然后将这个git仓库保存在一个地方.我可以查看以前的版本而且不用提心数据被删除.更最要的是,我已经能熟练地在不同电脑上使用git来上传和下载文件. 但是,如我所言,我并不想简单地上传我的密匙和密码到G

一个JavaScript函数把URL参数解析成Json对象_javascript技巧

问题:请编写一个JavaScript函数parseQueryString,它的用途是把URL参数解析为一个对象. eg:var obj=parseQueryString(url); 创建对象的三种形式: 一: var Person=new Object(); Person.name="Sun"; Person.age=24; 二: var Person=new Object(); Person["name"]="Sun"; Person[&quo

java 面试中的一道编写一个截取字符串的函数!!!!

函数|字符串 编程:编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串. 但是要保证汉字不被截半个,如"我ABC"4,应该截为"我AB",输入"我ABC汉DEF",6,应该输出为"我ABC"而不是"我ABC+汉的半个". package string;class SplitString { private String str; private int byteNum; publi

c++-编写一个函数,对输入的整数k输出它的全部素数因子。……格式为126=2*3*3*7

问题描述 编写一个函数,对输入的整数k输出它的全部素数因子.--格式为126=2*3*3*7 解决方案 不知道你的编译器是什么,如果只是输出格式不对,就加一句: #include"iostream" using namespace std; #include<math.h> void main() { int x,i; cout<<"输入整数:"; cin>>x; cout<<x<<"="

c语言-C语言编写一个输出的函数

问题描述 C语言编写一个输出的函数 编写一个函数,输出数组,要求通过参数指定每行输出的元素个数,以 及每个元素占有的列数. 假设自己定义一个参数为x 那么打印的时候printf(""%xd"")怎么用一个参数来满足每次打印时候 元素所占列数的不同呢 解决方案 #include <stdio.h>void display(int data[] int n int cols int w){ for (int i = 0; i < n; i++) { p

c++ 指针-一个c++指针的问题,要求编写一个函数

问题描述 一个c++指针的问题,要求编写一个函数 有这样一个题,要求编写一个函数,以char指针数组和数组中的指针数量作为参数,返回最长字符串的地址.我想请问这个函数的返回值的类型是什么呢?也就是说在声明函数时函数类型应该是char *** 还是其他呢?因为我认为 **char *** 指的是返回一个指向单个字符的指针而不是指向字符串的指针,而且这个函数怎么编写呢?以下是我写的源代码,虽然通过了编译,但是在运行时崩溃了 ** **char* maxn( char *** arr[],int le

c语言-求教编写一个函数求出两个字符串包含的相同的单词

问题描述 求教编写一个函数求出两个字符串包含的相同的单词 编写一个函数,函数首部为void maxword(char *s,char *t),求出两个字符串包含的相同单词(同一字母的大小写视为不同的字符).规定单词全部由英文字母构成,单词直接由一个或多个空格分隔.其中主函数如下: #include Void main() { Char s[]="This is C programming text"; Char t[]="This is a text for C progra