CREATE OR REPLACE PROCEDURE update_item_cost (iItemId INTEGER, fNewcost NUMBER) AS
fCurCost NUMBER(10,2);
missing_cost EXCEPTION;
BEGIN
SELECT item_cost
INTO fCurCost
FROM pitem
WHERE item_id = iItemId;
IF fCurCost IS NULL THEN
RAISE missing_cost;
ELSE
UPDATE pitem
SET item_cost = fNewCost
WHERE item_id = iItemId;
END IF;
COMMIT;
EXCEPTION
WHEN no_data_found THEN
INSERT INTO pitem_audit
VALUES (iItemId, 'Invalid Item identifier.');
COMMIT;
WHEN missing_cost THEN
INSERT INTO pitem_audit
VALUES (iItemId, 'Null value replaced by original cost of '||TO_CHAR(fCurCost));
COMMIT;
WHEN too_many_rows THEN
INSERT INTO pitem_audit
VALUES (iItemId, 'More than one row for this item: both rows deleted, new row inserted');
COMMIT;
WHEN OTHERS THEN
ROLLBACK;
INSERT INTO pitem_audit
VALUES (iItemId, 'Miscellaneous error.');
COMMIT;
END update_item_cost;
/
- 我的问题是处理missing_cost异常的块上的语法。 我的消息字符串仅显示' Null值替换为原始成本' ...我需要它包含fCurCost但由于某种原因它不显示...我不断收到警告说:程序已创建编译错误.--
- 也用于TOO_MANY_ROWS异常处理程序...如何编写删除多行的代码???我试过了:
DELETE FROM pitem
WHERE item_id NOT IN(SELECT MAX(item_id)
FROM pitem
GROUP BY item_id, item_cost);
- 但无济于事......--
答案 0 :(得分:0)
values
语句需要常量。请改用insert . . . select
:
WHEN missing_cost THEN
INSERT INTO pitem_audit
select iItemId, 'Null value replaced by original cost of '||TO_CHAR(fCurCost));
COMMIT;
关于第二个问题:
如果您要删除价格最高的所有行:
DELETE FROM pitem
where cost < (select Max(item_cost)
FROM pitem
group by item_id
);
答案 1 :(得分:0)
1)只要fCurCost为null,就会引发异常MISSING_COST,因此,当您将其值插入pitem_audit时,它将始终为NULL。
2)如果您尝试删除所有行但是具有最高item_id的行,您应该尝试这样的事情:
DELETE FROM pitem
WHERE item_id NOT IN(SELECT MAX(item_id)
FROM pitem);
您按item_id和item_cost进行分组,这意味着您选择了相同item_id和item_cost的行中最高的item_id。如果item_id是唯一标识符,则子查询将返回表中的所有行,因为每个item_id都是其组中的最高值。