插入值语句的语法错误

时间:2014-03-25 23:17:32

标签: sql oracle stored-procedures plsql insert

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);

- 但无济于事......--

2 个答案:

答案 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都是其组中的最高值。