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 に答える