![](/img/trans.png)
[英]How to use a rowcount in select statement to modify the query to fetch data for 10 days , if rowcount is 0 for 5 days?
[英]Is it possible to use sql%rowcount for SELECT?
下面的代碼可能會返回多行。 請問sql%rowcount
返回獲取的行數?
select * from emp where empname = 'Justin' and dept='IT'
if sql%rowcount>0
...
這是我的樣本過程; 我以正確的方式使用sql%rowcount
嗎?
CREATE PROCEDURE Procn(in_Hid IN VARCHAR2,outInststatus OUT VARCHAR2,outSockid IN NUMBER,outport OUT VARCHAR2,outIP OUT VARCHAR2,outretvalue OUT NUMBER)
AS
BEGIN
select INST_STATUS into outInststatus from TINST_child where INST_ID = in_Hid and INST_STATUS = 'Y';
if outInststatus = 'Y' then
select PORT_NUMBER,STATIC_IP into outport,outIP from TINST where INST_ID = in_Hid and IP_PORT_STATUS = 'Y';
if sql%rowcount >= 1 then
select SOCK_ID into outSockid from TINST where PORT_NUMBER = outport AND STATIC_IP = outIP;
outretvalue := 0;
else
outretvalue := -12;
end if;
EXCEPTION
WHEN NO_DATA_FOUND THEN
outretvalue := -13;
end if;
END;
是的,您可以使用SQL%ROWCOUNT
。 它在PL / SQL中有效。
但是,在PL / SQL中,查詢的結果需要轉移到某個PL / SQL表中。 PL / SQL永遠不會將結果發送到輸出 (終端,窗口等)。 所以SELECT * FROM
不起作用。
您的代碼可能如下所示:
DECLARE
TYPE emp_t ...;
emp_tab emp_t;
BEGIN
SELECT *
BULK COLLECT INTO emp_tab
FROM emp
WHERE empname = 'Justin' AND dept='IT';
IF sql%rowcount > 0 THEN
.. do something ...
END IF;
END;
/
更新 :
更新的問題表明您正在尋找其他東西。
選項1:使用例外
如果有0行或多於1行,則這些情況將單獨處理(作為錯誤):
BEGIN
select PORT_NUMBER,STATIC_IP into outport, outIP
from TINST
where INST_ID = in_Hid AND IP_PORT_STATUS = 'Y';
EXCEPTION
WHEN NO_DATA_FOUND THEN
outretvalue := -12;
RETURN;
WHEN TOO_MANY_ROWS THEN
outretvalue := -13;
RETURN;
END;
選項2:使用聚合
使用聚合,查詢將始終返回一行。 如果現在源行與WHERE子句匹配,則兩個結果值都將為NULL。 如果WHERE子句匹配多行,則將采用最大值。
請注意,此查詢可能會返回端口號和最初不在同一行的IP地址。
select MAX(PORT_NUMBER), MAX(STATIC_IP) into outport, outIP
from TINST
where INST_ID = in_Hid AND IP_PORT_STATUS = 'Y';
IF outport IS NULL OR outIP IS NULL THEN
outretvalue := -12;
RETURN;
END IF;
選項3:使用ROWNUM
此查詢最多返回一行。 如果沒有與WHERE子句匹配的行,則拋出異常並需要處理:
BEGIN
select PORT_NUMBER, STATIC_IP into outport, outIP
from TINST
where INST_ID = in_Hid AND IP_PORT_STATUS = 'Y'
AND ROWNUM = 1;
EXCEPTION
WHEN NO_DATA_FOUND THEN
outretvalue := -12;
RETURN;
END;
根據您的評論
如果第二個'select'查詢返回多行,我想取第一個並用它處理
......這應該有效,但也許並不像你期望的那樣,因為你沒有定義“第一個”的含義。
CREATE PROCEDURE Procn(in_Hid IN VARCHAR2, outInststatus OUT VARCHAR2,
outSockid IN NUMBER, outport OUT VARCHAR2, outIP OUT VARCHAR2,
outretvalue OUT NUMBER)
AS
BEGIN
select INST_STATUS into outInststatus
from TINST_child
where INST_ID = in_Hid and INST_STATUS = 'Y';
-- no need to check if outInstatus is Y, that's all it can be here
-- restricting with `rownum` means you'll get at most one row, so you will
-- not get too_many_rows. But it will be an arbitrary row - you have no
-- criteria to determine which of the multiple rows you want. And you can
-- still get no_data_found which will go to the same exception and set -12
select PORT_NUMBER, STATIC_IP into outport, outIP
from TINST
where INST_ID = in_Hid and IP_PORT_STATUS = 'Y'
and rownum < 2;
-- no need to check sql%rowcount; it can only be 1 here
-- not clear if this can return multiple rows too, and what should happen
-- if it can; could use rownum restriction but with the same caveats
select SOCK_ID into outSockid
from TINST
where PORT_NUMBER = outport AND STATIC_IP = outIP;
outretvalue := 0;
EXCEPTION
WHEN NO_DATA_FOUND THEN
outretvalue := -12;
END;
exception
處理程序適用於整個塊 。 如果任何select
語句沒有找到任何行,則no_data_found
異常將由該塊處理,並將outretvalue
設置為-12
。
如果你想為每個select
不同的outretvalue
,那么你可以將它們包裝在子塊中,每個子塊都有自己的異常處理部分:
CREATE PROCEDURE Procn(in_Hid IN VARCHAR2, outInststatus OUT VARCHAR2,
outSockid IN NUMBER, outport OUT VARCHAR2, outIP OUT VARCHAR2,
outretvalue OUT NUMBER)
AS
BEGIN
BEGIN
select INST_STATUS into outInststatus
from TINST_child
where INST_ID = in_Hid and INST_STATUS = 'Y';
EXCEPTION
WHEN NO_DATA_FOUND THEN
outretvalue := -12;
END;
BEGIN
select PORT_NUMBER, STATIC_IP into outport, outIP
from TINST
where INST_ID = in_Hid and IP_PORT_STATUS = 'Y'
and rownum < 2;
EXCEPTION
WHEN NO_DATA_FOUND THEN
outretvalue := -13;
END;
BEGIN
select SOCK_ID into outSockid
from TINST
where PORT_NUMBER = outport AND STATIC_IP = outIP;
EXCEPTION
WHEN NO_DATA_FOUND THEN
outretvalue := -14;
END;
outretvalue := 0;
END;
如果調用者需要知道哪個select
失敗,你只需要這樣做,如果你真的沒有想到它們中的任何一個失敗那么可能更常見的是根本不捕獲異常並讓調用者看到原始的no_data_found
並決定什么去做。 取決於異常條件對您和您的應用程序的意義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.