唯一在這里作業的查詢是INSERT這樣的,這讓我覺得條件作業正常(我測驗了兩次運行存盤程序而沒有向 table1 插入任何新內容)但是UPDATE查詢不做任何事情并且 IF 條件是正確的。
這是我的存盤程序:
CREATE OR REPLACE PROCEDURE proc_user_messages_count
AS
l_m_document_id VARCHAR2(11);
l_mc_document_id VARCHAR2(11);
--l_mc_messages INTEGER;
BEGIN
SELECT document_id
INTO l_m_document_id
FROM table1
WHERE status IN (0, 1)
ORDER BY creationdate DESC
OFFSET 0 ROWS
FETCH NEXT 1 ROWS ONLY;
SELECT document_id
INTO l_mc_document_id
FROM table2
WHERE document_id = l_m_document_id;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
l_mc_document_id := 0;
IF l_mc_document_id = 0
THEN
INSERT INTO table2
VALUES (l_m_document_id, 1);
ELSE
--SELECT messages INTO l_mc_messages FROM table2 WHERE document_id = l_mc_document_id;
UPDATE table2
SET messages = messages 1
WHERE document_id = l_mc_document_id;
END IF;
END proc_user_messages_count;
/
注釋行是我試圖弄清楚這些條件是否搞砸了。
這是我第一次使用存盤程序,任何建議都將不勝感激。
uj5u.com熱心網友回復:
我希望你除錯得很好,即確保UPDATE實際上有一些要更新的東西:
- 如果沒有 who 的行
document_id = l_mc_document_id,則不會發生任何事情 - 如果
messages列值為NULL,則結果也messages 1將為NULL;nvl(messages, 0) 1在這種情況下考慮
此外,我認為您放錯了位置exception;看看將前兩個select陳述句包含在它自己的(內部)begin-exception-end塊中是否有意義。因為,你真的不想把整體IF放進去exception——這就是你的代碼目前所做的。
修改后,您的代碼可能如下所示:
CREATE OR REPLACE PROCEDURE Proc_USER_MESSAGES_Count AS
l_m_document_id VARCHAR2(11);
l_mc_document_id VARCHAR2(11);
--l_mc_messages INTEGER;
BEGIN
BEGIN
SELECT document_id INTO l_m_document_id
FROM table1
WHERE status IN (0,1)
ORDER BY creationdate DESC
OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY;
SELECT document_id INTO l_mc_document_id
FROM table2
WHERE document_id = l_m_document_id;
EXCEPTION
WHEN NO_DATA_FOUND THEN l_mc_document_id := 0;
END;
IF l_mc_document_id = 0 THEN
INSERT INTO table2 VALUES(l_m_document_id,1);
ELSE
--SELECT messages INTO l_mc_messages FROM table2 WHERE document_id = l_mc_document_id;
UPDATE table2 SET messages = nvl(messages, 0) 1
WHERE document_id = l_mc_document_id;
END IF;
END Proc_USER_MESSAGES_Count;
/
uj5u.com熱心網友回復:
問題是缺少BEGIN END. 我已經重新格式化了您的代碼,以便清楚每個塊的結構是什么。然后很明顯,只有在拋出例外時才會執行帶有INSERT/的整個部分。UPDATENO_DATA_FOUND
這應該這樣做:
CREATE OR REPLACE PROCEDURE proc_user_messages_count
AS
l_m_document_id VARCHAR2(11);
l_mc_document_id VARCHAR2(11);
--l_mc_messages INTEGER;
BEGIN
SELECT document_id
INTO l_m_document_id
FROM table1
WHERE status IN (0, 1)
ORDER BY creationdate DESC
OFFSET 0 ROWS
FETCH NEXT 1 ROWS ONLY;
BEGIN
SELECT document_id
INTO l_mc_document_id
FROM table2
WHERE document_id = l_m_document_id;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
l_mc_document_id := 0;
END;
IF l_mc_document_id = 0
THEN
INSERT INTO table2
VALUES (l_m_document_id, 1);
ELSE
--SELECT messages INTO l_mc_messages FROM table2 WHERE document_id = l_mc_document_id;
UPDATE table2
SET messages = messages 1
WHERE document_id = l_mc_document_id;
END IF;
END proc_user_messages_count;
/
區別在于BEGIN第二個之前SELECT和END之后的例外處理程式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/408373.html
標籤:
上一篇:根據日期資料生成日期范圍資料組
