2017-05-07 23 views
1

代碼成功運行但未將任何數據推送到表中。我已經嘗試了一堆東西,但他們要麼破壞代碼或返回相同的結果。PLSQL代碼未插入到我的庫存/事務處理表中

ACCEPT v_idno PROMPT 'Enter the IDNO: '; 
ACCEPT v_itemname PROMPT 'Enter the Item Name: ' 
ACCEPT v_price PROMPT 'Enter the Price: ' 
ACCEPT v_onhand PROMPT 'Enter the Onhand amount: ' 

DECLARE 
    v_idno     invent.idno%TYPE := &v_idno; 
    v_itemname    invent.itemname%TYPE := '&v_itemname'; 
    v_price     invent.price%TYPE := &v_price; 
    v_onhand    invent.onhand%TYPE := &v_onhand; 
    v_code     transac.transaccode%TYPE; 
    v_transac    transac.transaction%TYPE; 

    CURSOR addinven IS 
     SELECT invent.idno, itemname, price, onhand, transaccode, transaction 
     FROM invent, transac 
     WHERE v_idno = invent.idno; 

BEGIN 
    OPEN addinven; 
    LOOP 
     FETCH addinven INTO v_idno, v_itemname, v_price, v_onhand, v_code, v_transac; 
     EXIT WHEN addinven%NOTFOUND; 

     INSERT INTO invent 
     (invent.idno, itemname, price, onhand) 
     VALUES 
     (v_idno, v_itemname, v_price, v_onhand); 

     v_transac := v_price * v_onhand; 

     INSERT INTO transac 
     (transac.idno, transaction) 
     VALUES 
     (&v_idno, v_transac); 

     UPDATE invent 
     SET invent.idno = v_idno, itemname = 'v_itemname', price = v_price, onhand = v_onhand 
     WHERE v_idno = invent.idno; 

     UPDATE transac 
     SET transac.idno = v_idno, transaction = v_transac 
     WHERE v_idno = transac.idno; 
     END LOOP; 
    CLOSE addinven; 
END; 
/

另外我將如何去顯示通過PLSQL代碼運行的事務來輸出售前和售後?在這個日子裏一直堅持......

謝謝你的幫助。

+0

'DBMS_OUTPUT。PUT_LINE(string_to_output);'輸出一個值。您可能需要在PL/SQL塊之前使用SET SERVEROUTPUT ON;才能將值顯示到控制檯。 – MT0

+0

我曾嘗試過,不幸的。 –

+0

@JBen,所以你說你想要的DBMS_OUTPUT.PUT_LINE顯示值?另一件事,你嘗試調試它嗎?我想如果你調試你會發現問題在哪裏。 – smshafiqulislam

回答

1

在您的代碼末尾添加提交

+0

我也試過。 –

0

我認爲您的問題是合乎邏輯的。看起來你的程序正在執行的東西,但它並沒有應用你認爲它的變化,所以這就是爲什麼你沒有看到你期望的數據。

如果我們看一下你的代碼,你就開始通過接受某些用戶輸入:

ACCEPT v_idno PROMPT 'Enter the IDNO:'; 
ACCEPT v_itemname PROMPT 'Enter the Item Name:' 
ACCEPT v_price PROMPT 'Enter the Price:' 
ACCEPT v_onhand PROMPT 'Enter the Onhand amount:' 

你那麼這個輸入分配給一些局部變量。

DECLARE 
v_idno     invent.idno%TYPE := &v_idno; 
v_itemname    invent.itemname%TYPE := '&v_itemname'; 
v_price     invent.price%TYPE := &v_price; 
v_onhand    invent.onhand%TYPE := &v_onhand; 
v_code     transac.transaccode%TYPE; 
v_transac    transac.transaction%TYPE; 

假設你想要做的是將用戶輸入值應用到你的表格。問題是,你的遊標FOR循環插入到你剛剛填充的局部變量:

FETCH addinven INTO v_idno, v_itemname, v_price, v_onhand, v_code, v_transac; 

所以兩個刀片,這將創建一個重複的記錄(上idno大概沒有主)

INSERT INTO invent 
(invent.idno, itemname, price, onhand) 
VALUES 
(v_idno, v_itemname, v_price, v_onhand); 

...這確實創建了一個新的紀錄,因爲它引用的&v_idno

INSERT INTO transac 
(transac.idno, transaction) 
VALUES 
(&v_idno, v_transac); 

替代價值......但計算值是從現有的值導出,這樣是不對的v_transac := v_price * v_onhand;

兩個更新語句覆蓋具有相同價值觀的現有記錄,除了invent.itemname被設置爲字符串字面'v_itemname'

所以,不確定你想要實現什麼業務規則,但你需要爲你的光標和你的用戶輸入單獨的變量。有幾種方法可以做到這一點。一種是基於光標定義一個變量:

CURSOR addinven IS 
     SELECT invent.idno, itemname, price, onhand, transaccode, transaction 
     FROM invent, transac 
     WHERE v_idno = invent.idno; 
    l_rec addinven%rowtype; 
    BEGIN 

取這樣的:fetch addinven into lrec;

參考這樣的:lrec.idno = invent.idno

或者使用隱式遊標爲您的循環:

for lrec in (SELECT invent.idno, itemname, price, onhand, transaccode, transaction 
      FROM invent 
        join transac 
        on transac.idno = invent.idno 
      WHERE v_idno = invent.idno) 
loop 

不需要OPEN,FETCH,CLOSE或EXIT。這一切都爲你完成。順便提一句,你需要加入inventtransac。目前你有兩張表的笛卡爾積,這可能不是你想要的。

相關問題