【问题标题】:Syntax error for Insert value statement插入值语句的语法错误
【发布时间】:2014-03-25 23:17:32
【问题描述】:
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);

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

【问题讨论】:

    标签: sql oracle stored-procedures plsql insert


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      1) 只要 fCurCost 为空,就会引发异常 MISSING_COST,因此,当您将其值插入到pitem_audit 时,它将始终为空。

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

      【讨论】:

        猜你喜欢
        • 2014-05-25
        • 1970-01-01
        • 2015-11-16
        • 1970-01-01
        • 2016-06-10
        • 2012-04-07
        • 1970-01-01
        • 1970-01-01
        • 2023-04-08
        相关资源
        最近更新 更多