2

我正在做一个大学作业,要求我创建一个 PLSQL 程序,用户可以在其中添加一个新的客户订单,其中包含许多项目和每个项目的数量。我想出了以下方法,它会要求用户输入要添加到订单中的一些项目,然后使用循环来询问特定的详细信息,例如产品编号和数量。我在运行时遇到用户输入问题......当编译代码时,它会询问产品代码和数量,并且不会在运行时再次询问,而是保存之前在编译时给出的值......

CREATE OR REPLACE 
PROCEDURE Add_Order (Item_amount IN NUMBER, CustNo IN NUMBER) AS

    ItemNo NUMBER; 
    var_Quantity NUMBER;
    var_PONo  NUMBER;  

    BEGIN  

      IF Item_amount BETWEEN 2 AND 9 THEN

        SELECT seq_PONo.NEXTVAL INTO var_PONo from dual;

    INSERT INTO PurchaseOrder_tab
         SELECT  var_PONo, REF(C),
                 SYSDATE,
                 ItemList_tab()
          FROM   Customer_tab C
          WHERE  C.CustNo = CustNo;

    FOR i IN 1..Item_amount LOOP
        DBMS_OUTPUT.PUT_LINE('INSIDE LOOP');
        ItemNo := &Enter_ProdCode;
        var_Quantity := &Quantity_Amount;

        INSERT INTO TABLE (
        SELECT  P.ItemList
          FROM  PurchaseOrder_tab P
         WHERE  P.PONo = var_PONo
        )

        SELECT   seq_ItemNo.nextval, REF(Pr), var_Quantity
          FROM   Products_tab Pr
         WHERE   Pr.ProductCode = ItemNo ;

        DBMS_OUTPUT.PUT_LINE('Added '||var_Quantity ||' items of '||ItemNo||' to order No: '||var_PONo);


              END LOOP;    

      ELSE

    DBMS_OUTPUT.PUT_LINE('Amount of items entered onto an order must be between 2 - 9. Please try again with correct amount.');

      END IF;

    EXCEPTION


    WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Operation failed '||'SQLCODE: '||SQLCODE);
    DBMS_OUTPUT.PUT_LINE('SQL Error Message '||SQLERRM);
    ROLLBACK;   
    END;
    /
4

3 回答 3

6

简短的回答:你不能。PL/SQL 在数据库引擎内部执行,并且数据库引擎无法访问您用来启动该过程的终端窗口(或数据库工具)。

您问题中的代码似乎部分工作,因为它要求输入一次,但真正发生的是:工具(SQL*Plus、SQL Developer 或其他)解析 PL/SQL 块并看到 &-Signs,所以它询问用什么替换它们。一旦给出输入,PL/SQL 块(包括输入的值)就被交给数据库执行。

由于您不能在 PL/SQL 中执行此操作,因此最好先创建一个前端程序来收集值,然后将它们发送到数据库。

于 2012-12-03T15:09:16.200 回答
0

尝试玩弄:

BEGIN 
   DBMS_OUTPUT.GET_LINE(:buffer, :status); 
END; 

而不是使用&引用

于 2012-12-03T13:13:22.000 回答
-1

要从用户那里获取数据输入,

设置服务器输出;

ACCEPT Enter_ProdCode VARCHAR2 PROMPT "请输入产品代码:"; ItemNo := &Enter_ProdCode;

于 2014-05-10T17:52:15.077 回答