`
郭清明
  • 浏览: 17643 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

一个看似简单但实现极其复杂的存储过程

阅读更多
表结构如下:

create table t_money(id int primary key,amount int not null);// id 是序列号,amount是金额

对如下数据进行查询:

+----+--------+
| id | amount |
+----+--------+
|  1 |      2 |
|  2 |      2 |
|  3 |      3 |
|  4 |      5 |
|  5 |      2 |
|  6 |      8 |
|  7 |      1 |
|  8 |      2 |
|  9 |      3 |
| 10 |      3 |
+----+--------+
从表中选取若干条数据,使得被选出来的几条数据的amount(金额)字段之和等于10,要求存储过程能返回被选取出来的数据的序列号。
算法举例:2+3+5=10 返回序列号:1,3,4   
说明:表中会有多种组合使金额字段相加等于10,此存储过程要求只要能找到任意一种组合就马上成功返回,不需要找其他的组合了。例如上面序列号为 1,3,4 的组合是第一种,能返回它们就行,至于后面的组合不用管。另外,组合没有个数的限制,可以3个组合成10,如算法举例,也可以2个组合,甚至单个组合,即可能表中有一个数据它的金额就是10,当然也可以是N个数字的组合。
上面对题目的文字说明可能有些啰嗦,我只是想让大家尽可能的明白我的意思,有兴趣的朋友对题意还有疑问的可以联系我。谢谢。
QQ:390000258



下面是一个网友帮我写的存储过程,现在和大家一起分享,如果你有更好的,可以写写。
create or replace procedure P_test(sum_num in number)
as
       v_str      varchar2(200):=',';
       v_str1      varchar2(200):=',';
       v_id       number;
       v_count    number;
       v_tmp      number :=0;
       v_money    number :=0;
       v_length   number:=0;
       v_count1   number;
begin
       for cur1 in 1..100 loop
       v_str:=',';
       v_str1:=',';
       v_tmp:=0;
       v_money:=0;
       v_length:=0;
       select count(0) into v_count1 from t_money;
       loop
           select count(0) into v_count from t_money where not instr(v_str,','||id||',')>0 and amount <= sum_num-v_money;
           if v_count = 0  then
           if v_length=v_count1 then
            dbms_output.put_line('error:the input-value is too large');
            return;
           end if;
             v_str:=',';
             v_str1:=',';
             v_money:=0;
            
              -- or restart
           end if;

           select id,amount into v_id,v_tmp from
                  (select id,amount from t_money where not instr(v_str,','||id||',')>0 and amount <= sum_num-v_money order by dbms_random.value)
                where rownum <2;
           v_money := v_money + v_tmp;
           v_str := v_str || v_id ||',';
           v_str1:=v_str1||v_tmp||',';
           v_length:=v_length+1;
           exit when v_money =sum_num;

       end loop;
     
       dbms_output.put_line('id组合: '||substr(v_str,2));
       dbms_output.put_line('amount组合: '||substr(v_str1,2));
        dbms_output.put_line(v_money);
        end loop;
       -- Error
end p_test;


begin
p_test(10);--可以换成任意数字
end;
1
1
分享到:
评论

相关推荐

    简单加密的实现

    异或加密是通过将明文与一个密钥进行位级异或操作得到密文,解密时再用同样的密钥进行异或。尽管这种方法比凯撒密码强得多,但它仍然不够安全,因为如果密钥被知道,加密数据就变得容易破解。 为了提高安全性,现代...

    基于WebServices简易网络聊天工具的设计与实现

    综上所述,本文所描述的简易网络聊天工具在技术实现上虽然看似简单,但实际上融合了多种IT领域的核心技术,包括WebServices、LINQ to SQL、C/S架构、数据库设计和开发流程等。通过详细掌握这些知识点,我们不仅可以...

    简单五子棋

    这个游戏看似简单,但策略性极强,对玩家的逻辑思维和预判能力有很高的要求。 【编程实现五子棋】 在计算机科学领域,实现一个简单的五子棋游戏通常涉及以下几个关键知识点: 1. **用户界面(UI)**:游戏的界面...

    python实现字符串加密成纯数字

    虽然本例中的加密方法可能并不适用于高安全性的场景,但作为初学者了解加密概念和基础实现的一个起点,它是相当实用的。我们将探讨如何将字符串转化为纯数字,并简单解析这个过程。 首先,我们需要明白字符串到数字...

    MYSQL 定界符分析通过硬编码的方式实现多语句分割并且支持定界符

    这个过程虽然看似简单,但在处理复杂情况,比如嵌套的SQL语句或复杂的存储过程时,可能需要更复杂的逻辑来正确地处理和恢复定界符。 在压缩包`mysql-delimiter-master`中,很可能包含了一个示例项目,演示了如何在...

    易语言简单文件加密

    易语言简单文件加密源码可能包含以上所有步骤的实现,对于初学者来说,这是一个很好的学习资源,可以帮助理解文件加密的基本原理和易语言的编程方式。通过分析和修改源码,可以进一步提高对加密技术的理解,并实现更...

    DSP语音加密,存储音频数据,对音频数据进行加密处理,解密处理

    在本文中,我们将深入探讨 DSP(Digital Signal ...通过 DSP,我们可以实现高效且安全的语音数据处理,保证音频信息在传输和存储过程中的隐私性和完整性。而提供的文件资源将为深入理解和实践这一技术提供宝贵的资料。

    最简单的网页计数器,很好很强大

    在这个案例中,我们有一个名为“最简单的网页计数器”的实现,其设计简洁且易于理解。 首先,让我们来探讨网页计数器的基本工作流程。当用户打开包含计数器代码的网页时,浏览器会发送一个HTTP请求到服务器。服务器...

    Playfire加密算法(C语言实现)

    本文将深入探讨一个名为Playfire的加密算法,并详细讲解其C语言实现过程。Playfire加密算法虽然没有广泛应用于商业场景,但它的设计思想和实现方式对于学习加密原理和C语言编程具有很高的参考价值。 首先,让我们...

    二叉树非递归实现,完整程序.

    这段代码展示了如何使用非递归方法实现二叉树的遍历,虽然看似简单,但实际蕴含了深度优先搜索(DFS)的精髓。在理解和掌握这个代码后,我们可以灵活地应用于其他数据结构和问题,例如对其他类型的数据进行遍历,...

    Python-markovifyPythonic一个简单的可扩展的马尔可夫链生成器

    Python的markovify库是一个强大的工具,用于创建和操作马尔可夫链,这是一种统计模型,常用于模拟和预测序列数据。在这个库中,马尔可夫链被应用于自然语言处理,尤其是生成随机但语法合理的句子。下面我们将深入...

    记事本窗口基本功能的实现

    总的来说,记事本窗口虽然看似简单,但它涉及到的计算机科学知识包括数据结构(如文本存储)、操作系统原理(如文件I/O和内存管理)、图形用户界面设计、事件处理机制以及文本处理算法等多个方面。通过理解这些基础...

    简单文件加解密系统(参考).rar_eleventry_文件加密系统_文件加解密_简单文件加解密

    总的来说,"简单文件加解密系统" 提供了一个基础的加密解决方案,尽管在实际应用中可能需要更强的安全性,但它为学习和理解加密原理提供了很好的平台。通过这个系统,我们可以深入了解文件加密的基本流程,并从中...

    简单的文件加密代码

    "简单的文件加密代码"是一个针对这个需求的解决方案,它能确保您的文件在未经授权的情况下不被轻易访问或篡改。下面,我们将深入探讨文件加密的基本原理、常用的加密算法以及如何实现简单的文件加密。 文件加密是一...

    mima.rar_单表置换密码_字符串 加密_字符串加密_简单加密_置换密码

    本教程主要关注的是“单表置换密码”这一简单的加密方法,它适用于字符串加密,为初学者提供了一个理解加密基本原理的入口。 单表置换密码是一种古老的加密技术,其核心思想是将明文中的每个字符替换为表中对应位置...

    一个IO的传奇一生

    在探讨一个IO从诞生到消亡的过程时,《一个IO的传奇一生》这一作品以其独特的视角,为我们揭示了一个看似简单的输入输出操作背后所蕴含的复杂技术和工程学原理。通过这篇文章,我们将深入了解一个IO操作在不同操作...

    基于MSP430F169芯片设计的混沌信号发生器.pdf

    而三阶JERK系统则是一个三维的混沌系统,它的特点是有一个三阶导数项,这使得它能产生更复杂的混沌动力学行为。 为了在MSP430F169芯片上实现混沌信号的输出,作者采用了简单的欧拉法对混沌系统进行离散化。欧拉法是...

    一个简单的登陆注册系统

    总的来说,一个简单的登录注册系统虽然看似基础,但涵盖了Web开发中许多关键概念和技术,包括用户交互、服务器端逻辑处理、数据验证、数据库操作以及安全性实践。掌握这些技能对于任何Web开发者来说都是至关重要的。

    离线消息设计实现

    虽然这种方式看似简单有效,但实际操作中仍面临许多复杂的细节和技术挑战。下面我们将详细介绍离线消息的几种常见优化方式: 1. **一次性拉取所有消息** 对于同一个用户B,客户端可以一次性拉取所有用户发给其的...

    一个IO传奇的一生.pdf

    综上所述,一个看似简单的文件I/O操作,实际上包含了许多复杂的步骤和多个层次的技术实现。从文件系统层的API函数调用,到内核空间的数据处理,再到最终硬件设备的数据存储,每一个步骤都蕴含着计算机科学的深奥原理...

Global site tag (gtag.js) - Google Analytics