2014-03-25 150 views
0
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異常的塊的語法。 我的消息字符串只顯示'空值被原始代價替換'...我需要它包含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

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

1)異常MISSING_COST引發每當fCurCost因此,當您將其值插入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都是其組中最高的值。