我创建了一个查询,显示表中返回的最高项目。我的查询完美无误,没有错误!但是,我想要一种将查询转换为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;
答案 0 :(得分:0)
查看cursors
和records
。
这样,您可以从查询中获取数据并在需要时处理该行。
我手边没有数据库来测试我的代码,但这可能会让您了解cursor
和record
的工作原理。
为了捕获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;