代码运行成功,但不会将任何数据推送到表中。我尝试过很多东西,但是他们要么破坏代码,要么返回相同的结果。
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 :(得分: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
。目前你有两张桌子的笛卡尔积,这可能也不是你想要的。