PL / SQL中的最高记录

时间:2015-12-18 21:07:55

标签: plsql

我创建了一个查询,显示表中返回的最高项目。我的查询完美无误,没有错误!但是,我想要一种将查询转换为PL / SQL块的有效方法。转换的目的是处理错误。

 SELECT ITEM_NO, MAX(QUANTITY) AS MAXIMUM 
 FROM ITEMS 
 WHERE CAT_NO >= (
      SELECT MAX(ITEM_NUM) FROM ORDER 
      WHERE STATUS IN('ONE ITEM RETURNED','ALL ITEMS RETURNED')
 )
 GROUP BY ITEM_NO
 ORDER BY ITEM_NO ASC;

2 个答案:

答案 0 :(得分:0)

查看cursorsrecords
这样,您可以从查询中获取数据并在需要时处理该行。

我手边没有数据库来测试我的代码,但这可能会让您了解cursorrecord的工作原理。
为了捕获EXCEPTION,您可以添加一个异常处理程序,并让它在发生异常时记录您忙碌的record

DECLARE 
    CURSOR CursorName IS 
        SELECT  ColumnOne 
        FROM    TableA 
        WHERE   Name = 'Me';

    RecordNumber CursorName%ROWTYPE;

BEGIN 
    -- Fetch the records from the cursor. 
    OPEN CursorName; 
    LOOP
        FETCH CursorName INTO RecordNumber;

        -- Do something with the record. 

        EXIT WHEN CursorName %NOTFOUND;
    END LOOP;
    CLOSE CursorName;
END;
/

END上方添加错误handeling:

EXCEPTION
    WHEN OTHERS THEN
        -- Log error message. 
END;
/

链接:TileSourceFactory
那回答你的问题吗?

答案 1 :(得分:0)

这是我们在包中进行一些异常处理的方法。我将其更改为使用您的代码作为示例。也许你可以使用它的一些想法。

在顶部,将CONSTANT设置为过程的名称,并将一些变量设置为捕获Oracle SQL错误号和消息。然后在过程的主体中,有一个包含select的匿名块。首先,我们设置一个变量来指示我们在哪里(err_loc),以防有多个位置可以在一个块中捕获错误。然后发出选择。如果发生错误,则由EXCEPTION子句捕获。来自Oracle的错误信息包含在err *变量中,构建了err_string,然后通过UTL_MAIL包通过电子邮件发送。 RAISE引发错误,程序停止。它的设置尽可能通用,我们可以放入模板,更改MBR_NAME,SQL,err_loc,就是这样。

  PROCEDURE TEST_PROC AS
    MBR_NAME        CONSTANT VARCHAR2(100) := 'TEST_PROC';  -- For use in error handling. Package member name.
    err_nbr                  NUMBER;                        -- Holds a SQL error number if an exception occurs.
    err_msg                  VARCHAR2(1000);                -- Holds a SQL error message if an exception occurs.
    err_string               VARCHAR2(2000);

  BEGIN
    BEGIN
      err_loc := 'Selecting max quantity';      -- Email subject

      SELECT ITEM_NO, MAX(QUANTITY) AS MAXIMUM 
      FROM ITEMS 
      WHERE CAT_NO >= (SELECT MAX(ITEM_NUM) 
                       FROM ORDER 
                       WHERE STATUS IN('ONE ITEM RETURNED','ALL ITEMS RETURNED')
                      )
      GROUP BY ITEM_NO
      ORDER BY ITEM_NO ASC;
    EXCEPTION
      WHEN OTHERS THEN
        err_nbr  := SQLCODE;
        err_msg  := SUBSTR(SQLERRM, 1, 1000);
        err_string := 'ERROR: ' || err_nbr || ' occurred: ' || err_msg;

        -- PKG_NAME and err_email_recip set in the body.
        UTL_MAIL.send(sender     => PKG_NAME||'.'||MBR_NAME||'@yourcompany.com', 
                      recipients => err_email_recip,  
                      subject    => 'ERROR '|| err_loc, 
                      message    => CHR(13))||err_string);
        RAISE;
    END;
  END TEST_PROC;