使用存储过程实现进销存系统中的先进先出算法(3)——Oracle9i版- ni ...

        本文是我在前一篇文章提到的关于先进先出存储过程,针对Oracle 9i 的修改版,基本思路一致,只是修改了关键字使用方法。
        有关数据库和存储过程的设计,请参阅

         使用Sql Server

       点击下载Oracle 9i 存储过程 

  1. ------------------------------------------------   
  2. ----------Author nileader----------23-------------   
  3. ----------Date 2010/04/24-----------------------   
  4. ------------------------------------------------ 
  5. CREATE OR REPLACE PROCEDURE pro_ProductSM 
  6. SorM        IN char,                --表征当前业务是进货还是出售 S--进货 M--出售 
  7. pId         IN productsm.pid%type,  --表征操作的商品id 
  8.  
  9. marketPrice IN nvarchar2,           --如果当前的业务是M,那么这个参数有效, 表示这次出售的价格   
  10. marketNum   IN nvarchar2,           --如果当前的业务是M,那么这个参数有效,表示这次出售的数量   
  11.  
  12. stockPrice  IN nvarchar2,           --如果当前的业务是S,那么这个参数有效,表示这次进货的成本单价   
  13. stockNum    IN nvarchar2            --如果当前的业务是S,那么这个参数有效,表示这次进货的数量 
  14. IS 
  15. BEGIN   
  16.    --定义变量 
  17.    DECLARE    
  18.      stockNo   int;               -- 当前可以进货的仓库编号   仓库{zd0}6个 
  19.      marketNo  int;               -- 当前可以出售的仓库编号   仓库{zd0}6个   
  20.      updateSQL nvarchar2(200);    -- 一个待构造的sql update 语句  
  21.      numx   nvarchar2(10);              --要更新的num号 
  22.          costx  nvarchar2(10);              --要更新的cost号 
  23.                                   --   各个仓库现在的数量 
  24.          num1       numeric(6);               --第1个仓库当前的数量 
  25.          num2       numeric(6);               --第2个仓库当前的数量 
  26.          num3       numeric(6);               --第3个仓库当前的数量 
  27.          num4       numeric(6);               --第4个仓库当前的数量 
  28.          num5       numeric(6);               --第5个仓库当前的数量 
  29.          num6       numeric(6);               --第6个仓库当前的数量 
  30.          totalNum   numeric(7);             --现在所有仓库中的数量和 
  31.  
  32.          cost1      numeric(5,2);               --第1个仓库当前的成本 
  33.          cost2      numeric(5,2);               --第2个仓库当前的成本 
  34.          cost3      numeric(5,2);               --第3个仓库当前的成本 
  35.          cost4      numeric(5,2);               --第4个仓库当前的成本 
  36.          cost5      numeric(5,2);               --第5个仓库当前的成本 
  37.          cost6      numeric(5,2);               --第6个仓库当前的成本 
  38.        
  39.      flag       int;                      --是否完成交易,1表示完成,0表示没有完成, 
  40.                                   --这个标识用来表示在一个一个仓库卖的过程中, 
  41.                                   --是否可以满足需求,终止此次交易 
  42.      thisWant   numeric(6);         -- 现在还要的需求   
  43.          thisNum    numeric(6);         -- 现在所在的仓库有多少货 
  44.          thisCost   numeric(5,2);        -- 现在所在的仓库的成本 
  45.       
  46.      money      numeric(5,2);        --  盈利 
  47.  
  48.        
  49.       
  50.     ------------   选择操作业务  进货还是出售 S--进货 M--出售  --------- 
  51.      
  52.     -----------------------------------以下是进货操作---------------------------- 
  53. BEGIN --0 
  54.      IF SorM = 'S' THEN --2 
  55.        BEGIN --1 
  56.           
  57.          --让用户知道自己在干什么   
  58.          DBMS_OUTPUT.PUT_LINE('INFO:You will buy somethings-------price is' 
  59.                               ||stockPrice||'---nums is '||stockNum||'---pid is '||pId 
  60.                               ); 
  61.          --取出当前可以进货的编号 
  62.          SELECT stockNo, marketNo INTO stockNo, marketNo FROM ProductSM WHERE pId=pId; 
  63.          --判断是否可以继续进货 
  64.              IF stockNo >=7 THEN    --3                 --不能继续进货了 
  65.                   DBMS_OUTPUT.PUT_LINE('All storages have full, can not buy!'); 
  66.          --还能继续进货      1 <= stockNo <=6 
  67.          ELSE   
  68.            BEGIN --4 
  69.              DBMS_OUTPUT.PUT_LINE('INFO:BEGIN UPDATE THE DB WHERE PID IS'||pId); 
  70.               
  71.              -- --构造出要更新的num和cost字段, 拼装成sql语句--- 
  72.                        numx      := 'num' || TO_CHAR(stockNo ); 
  73.                      costx     := 'cost' || stockNo;  
  74.               
  75.              updateSQL  := 'UPDATE ProductSM SET '|| numx ||'='|| stockNum || ', ' 
  76.                            || costx || '=' || stockPrice || ', stockNo=stockNo+1 WHERE pId=' || pId; 
  77.              EXECUTE IMMEDIATE TO_CHAR(updateSQL) ; 
  78.              --  如果之前所有的仓库都是空的,那么marketNo=0, 
  79.              --  即没有指向任何可以出售的仓库,那么现在要让他指向{dy}个仓库 
  80.              IF  marketNo = 0 THEN --5 
  81.                           BEGIN 
  82.                    updateSQL    := 'UPDATE ProductSM SET marketNo = 1 WHERE pId ='|| pId; 
  83.                    EXECUTE IMMEDIATE TO_CHAR(updateSQL) ; 
  84.  
  85.                           END
  86.              END IF;       --5        
  87.               --让用户知道自己完成了什么工作 
  88.                      DBMS_OUTPUT.PUT_LINE('INFO:You buy something successfully!!-------------stockPrice is'||stockPrice 
  89.                                   ||',---pid is '||pId || '----stockNum is'||stockNum);  
  90.          
  91.            END--4 
  92.           
  93.          END IF;   --3 
  94.           
  95.         END--1 
  96.  
  97.    ----------------------------------以上是进货操作---------------------------- 
  98.   -----------------------------------以下是出售操作---------------------------- 
  99.  
  100.   ELSIF SorM = 'M'  THEN--6 
  101.       BEGIN    --7 
  102.       --让用户知道自己在干什么   
  103.          DBMS_OUTPUT.PUT_LINE('INFO:You will sell somethings-------price is' 
  104.                               ||marketPrice||'---nums is '||marketNum||'---pid is '||pId 
  105.                               ); 
  106.        -- 如果marketNo 大于stockNo 终止 
  107.        --取出当前可以出售的编号和进货编号     
  108.            SELECT stockNo, marketNo INTO stockNo, marketNo FROM ProductSM WHERE pId = pId;   
  109.         
  110.       IF marketNo > stockNo THEN   --10 
  111.               BEGIN  
  112.                    DBMS_OUTPUT.PUT_LINE('出售编号大于进货编号,怎么可能?我得去仓库看看了。'); 
  113.               END
  114.       ELSE   
  115.           BEGIN   --11 
  116.             --仓库概况 
  117.             DBMS_OUTPUT.PUT_LINE('Storages INFO:----stockNo is' || TO_CHAR(stockNo)  
  118.                                  || ' -------marketNo is'||TO_CHAR(marketNo) );                     
  119.             --   统计出现在所有的库存量,用来检测这次出售交易是否超过了所有仓库的供给量 
  120.             SELECT num1,cost1,num2,cost2,num3,cost3,num4,cost4,num5,cost5,num6,cost6 
  121.             INTO   num1,cost1,num2,cost2,num3,cost3,num4,cost4,num5,cost5,num6,cost6 
  122.             FROM ProductSM WHERE pId = pId;  
  123.              
  124.             totalNum := num1 + num2 + num3 + num4 + num5+ num6; 
  125.              
  126.             --如果现在的所有数量都不能满足你的要求,那就只好说再见了 
  127.             IF totalNum < marketNum   THEN        --12 
  128.                        DBMS_OUTPUT.PUT_LINE('不好意思,你的需求过大,交易失败'); 
  129.                 
  130.              ELSE 
  131.                BEGIN       --13 
  132.                  --取出当前可以出售的编号 
  133.                  SELECT marketNo INTO marketNo FROM ProductSM WHERE pId = pId; 
  134.                  -- 从当前可以出售的开始,即@marketNo开始一个一个卖,直到满足marketNum需求 
  135.                  flag := 0; 
  136.                  thisWant := marketNum; 
  137.                   
  138.                  WHILE flag = 0  
  139.                    LOOP             --14 
  140.                                         --取出当前可以进货的编号 
  141.                     SELECT marketNo INTO marketNo FROM ProductSM WHERE pId = pId; 
  142.                        
  143.                     IF marketNo = 1 THEN       --15 
  144.                       BEGIN   
  145.                         thisNum  := num1; 
  146.                         thisCost := cost1; 
  147.                         numx     :='num1'
  148.                         costx    := 'cost1'
  149.                       END
  150.                              ELSE IF marketNo = 2   THEN 
  151.                       BEGIN   
  152.                         thisNum   := num2; 
  153.                         thisCost  := cost2; 
  154.                         numx      :='num2'
  155.                         costx     :='cost2'
  156.                       END
  157.                              ELSE IF marketNo = 3 THEN 
  158.                       BEGIN  
  159.                         thisNum   := num3; 
  160.                         thisCost  := cost3; 
  161.                         numx      :='num3'
  162.                         costx     :='cost3'
  163.                        END
  164.                              ELSE IF marketNo = 4   THEN 
  165.                       BEGIN  
  166.                         thisNum   := num4; 
  167.                         thisCost  := cost4; 
  168.                         numx      := 'num4'
  169.                         costx     := 'cost4'
  170.                       END
  171.                              ELSE IF marketNo = 5 THEN 
  172.                      BEGIN   
  173.                        thisNum    := num5; 
  174.                        thisCost   := cost5; 
  175.                        numx       := 'num5'
  176.                        costx      := 'cost5'
  177.                      END
  178.                              ELSE IF marketNo = 6   THEN 
  179.                      BEGIN   
  180.                        thisNum    := num6; 
  181.                        thisCost   := cost6; 
  182.                        numx       := 'num6'
  183.                        costx      := 'cost6'
  184.                      END
  185.                     END IF;        --15 
  186.                        
  187.                        
  188.                  --判断这个仓库是否可以满足这个交易的需求 
  189.                              --如果这个仓库比需求大,那么出售marketNum件商品就ok了 
  190.                  IF  thisWant < thisNum   THEN--17 
  191.                      BEGIN              --18 
  192.                        DBMS_OUTPUT.PUT_LINE('INFO:you sell something-------marketPrice is  ' 
  193.                                             || marketPrice ||' ----cost is'||TO_CHAR(thisCost) 
  194.                                             || '----pid is'||pId || '------num is'||TO_CHAR(thisWant) ); 
  195.                        -- 算一下赚了多少钱 
  196.                                        money := (marketPrice - thisCost) * thisWant; 
  197.                        DBMS_OUTPUT.PUT_LINE('money you gain is:' || TO_CHAR(money) ); 
  198.                        --更新数据库中的仓库信息 
  199.                                        updateSQL    :='UPDATE ProductSM SET '|| numx || '='|| TO_CHAR(numx) || '-' || TO_CHAR(thisWant)||' WHERE pId='||pId; 
  200.                                        EXECUTE IMMEDIATE TO_CHAR(updateSQL) ; 
  201.                        --做一些收尾工作 
  202.                                         thisWant     := 0;      --都满足需求了,肯定置为0了 
  203.                                         flag    := 1;           --表示已经完成了 
  204.                         
  205.                      END;  --18 
  206.                     ELSE IF   thisWant =  thisNum  THEN  --20 
  207.                       BEGIN          --21 
  208.                          
  209.                         DBMS_OUTPUT.PUT_LINE('INFO:you sell something-------marketPrice is  ' 
  210.                                               || marketPrice ||' ----cost is'||TO_CHAR(thisCost) 
  211.                                               || '----pid is'||pId || '------num is'||TO_CHAR(thisWant) ); 
  212.                          -- 算一下赚了多少钱 
  213.                          money := (marketPrice - thisCost) * thisWant; 
  214.                          DBMS_OUTPUT.PUT_LINE('money you gain is:' || TO_CHAR(money) ); 
  215.                          --更新数据库中的仓库信息 
  216.                          updateSQL  :='UPDATE ProductSM SET marketNo = marketNo + 1,' || numx+'=0,'  
  217.                                       || costx || '=0 WHERE pId=' || pId; 
  218.                          EXECUTE IMMEDIATE TO_CHAR(updateSQL) ; 
  219.                          --做一些收尾工作 
  220.                           thisWant     := 0;        --都满足需求了,肯定置为0了 
  221.                           flag    := 1;           --表示已经完成了 
  222.                        
  223.                        
  224.                        
  225.                       END;           --21 
  226.                        
  227.                       ELSE    --23 
  228.                       BEGIN          --22 
  229.                          
  230.                         DBMS_OUTPUT.PUT_LINE('INFO:you sell something-------marketPrice is  ' 
  231.                                               || marketPrice ||' ----cost is'||TO_CHAR(thisCost) 
  232.                                               || '----pid is'||pId || '------num is'||TO_CHAR(thisNum) ); 
  233.                          -- 算一下赚了多少钱 
  234.                          money := (marketPrice - thisCost) * thisNum; 
  235.                          DBMS_OUTPUT.PUT_LINE('money you gain is:' || TO_CHAR(money) ); 
  236.                          --更新数据库中的仓库信息 
  237.                          updateSQL  :='UPDATE ProductSM SET marketNo = marketNo + 1,' || numx+'=0,' || costx+'=0 WHERE pId='|| pId; 
  238.                          EXECUTE IMMEDIATE TO_CHAR(updateSQL) ; 
  239.     
  240.                           --做一些收尾工作 
  241.                                            thisWant := thisWant - thisNum;        
  242.                        
  243.                        
  244.                        
  245.                       END;           --22 
  246.  
  247.  
  248.                     END IF;        --17 
  249.  
  250.                    END LOOP;          --14 
  251.  
  252.                   
  253.                END;        --13 
  254.                   END IF;              --12 
  255.              
  256.           END;    --11 
  257.       END IF;             --10 
  258.         
  259.                         
  260.  
  261.       END;     --7 
  262.   END IF;        --2 
  263.       
  264. END--0 
  265.       
  266. END

 

 

 

本文出自 “” 博客,请务必保留此出处






郑重声明:资讯 【使用存储过程实现进销存系统中的先进先出算法(3)——Oracle9i版- ni ...】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——