【问题标题】:How to build and execute a procedure in oracle如何在oracle中构建和执行程序
【发布时间】:2021-01-28 17:23:49
【问题描述】:

我在执行程序时遇到问题。当我执行我的程序时,它没有返回任何答案。我知道我的程序有问题,但我无法弄清楚,所以请帮助我创建一个新程序。

在展示我的代码之前,让我告诉你我为什么要创建这个过程:

我实际上正在研究我的项目“超市计费管理系统”,我已经在其中创建了一些表,其中一个是 Products 表,我在其中创建了 FINAL_TOTAL 列作为过程,现在我想要计算一个人购买的所有产品价格的总价格的过程。例如,当您去超市或任何购物中心时,在购买了几件商品后,他们会给出账单,并且在账单的下方,有一个您必须支付的最终金额。

因此,出于这个原因,我创建了该程序。如果你知道我的代码有问题,请告诉我!!

代码:

程序

create procedure FINAL_TOTAL(C IN NUMBER, T OUT NUMBER)
        IS
        BEGIN
        UPDATE Products
        SET FinalTotal = FinalTotal + Total
        WHERE ProdCustId = C;
        Commit;
        SELECT FinalTotal into T FROM Products WHERE ProdCustId = C;
        END;
        /

产品表:

create table Products
    ( ProdId number primary key,
      ProdNum number not null unique,
      ProdName varchar2(15),
      ProdPrice int,
      ProdQuantity int,
      Total int,
      FinalTotal int,
      ProdCustId int references Customers,
      ProdOrdId int references Orders,
      ProdStoreId int references Stores
    );

触发器:

CREATE TRIGGER PROD_TOTAL
    AFTER INSERT ON Products
    BEGIN
    UPDATE Products
    SET Total = ProdPrice * ProdQuantity;
    END;
    /

在 Products 表中插入语句:

insert into Products(ProdID,ProdNum,ProdName,ProdPrice,ProdQuantity,ProdCustId,ProdOrdId,ProdStoreId)
values(1,1001,'Syrup',30,2,1,1,1);

程序的执行代码:

variable K number;
SQL> EXECUTE FINAL_TOTAL(1,:K);

PL/SQL procedure successfully completed.

输出:

select * from Products;

    PRODID    PRODNUM PRODNAME         PRODPRICE PRODQUANTITY      TOTAL
---------- ---------- --------------- ---------- ------------ ----------
FINALTOTAL PRODCUSTID  PRODORDID PRODSTOREID
---------- ---------- ---------- -----------
         1       1001 Syrup                   30            2         60
                    1          1           1


SQL> print :K

         K
----------

所以,这是我的代码,我不知道我的代码有什么问题,因为我是初学者,我对程序没有太多想法,我必须在我的项目中使用该程序,因为这是强制性的,所以请帮助我解决这个问题!

【问题讨论】:

    标签: oracle stored-procedures


    【解决方案1】:

    FinalTotal 为 NULL。使用NVLCOALESCE

    ... SET FinalTotal = NVL(FinalTotal,0) + Total
    

    NULL 加上一个数字就是 NULL。

    SELECT NULL + 1 FROM DUAL; -- NULL
    SELECT NVL(NULL, 0) + 1 FROM DUAL; -- 1
    

    【讨论】:

    • 它一直在工作,直到我没有添加超过一行,但是一旦我添加了 3 行,它就会给我这个错误:ORA-01422:精确提取返回超过请求的数量行 ORA-06512:在“SYSTEM.FINAL_TOTAL”,第 8 行 ORA-06512:在第 1 行
    • @Sushmitashukla 您在过程中的查询返回不止一行。例如,您可以总结它们。 SELECT SUM(FinalTotal) into T FROM Products WHERE ProdCustId = C;
    • 这是我的程序代码:create procedure FINAL_TOTAL(C IN NUMBER, T OUT NUMBER) IS BEGIN UPDATE Products SET FinalTotal = NVL(FinalTotal,0) + Total WHERE ProdCustId = C; Commit; SELECT SUM(FinalTotal) into T FROM Products WHERE ProdCustId = C; END; / Procedure created.
    • 当我执行这段代码时,它工作了,但我没有得到正确的输出。例如,我输入价格=30,数量=4,然后我得到总计=价格*数量,即120(30 * 4),直到这里它工作正常,但我得到我的FinalTotal,即程序列为240,即(总计+total),并且在每一行中我得到相同类型的输出,即在 FinalTotal 中我得到该列的值 total+total,所以我不知道我可以使用什么逻辑来纠正我的问题。如果你知道,请告诉我!
    猜你喜欢
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 2020-07-26
    • 2012-04-22
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多