PLSQL代码不会插入到我的库存/交易表中

时间:2017-05-07 02:02:49

标签: sql oracle plsql logic

代码运行成功,但不会将任何数据推送到表中。我尝试过很多东西,但是他们要么破坏代码,要么返回相同的结果。

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代码运行的事务以输出销售前后?被搁置了好几天......

感谢您的帮助。

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 LOOP会插入到您刚刚填充的局部变量中:

    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的{​​{1}}除外。

因此,不确定您尝试实施的业务规则,但您需要为游标和用户输入单独的变量。有几种方法可以做到这一点。一种是基于光标定义变量:

'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

无需OPEN,FETCH,CLOSE或EXIT。这一切都是为你完成的。顺便说一句,您需要加入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 invent。目前你有两张桌子的笛卡尔积,这可能也不是你想要的。