基於您的評論
如果第二個「選擇」查詢返回多行我想利用第一個和它的處理
......這應該工作,但可能不像你期望的那樣,因爲你還沒有定義'第一個'的含義。
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
處理器適用於整個block。如果任何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
並決定該怎麼做。取決於異常情況對您和您的應用程序意味着什麼。
如果它是作爲標記,那麼你必須選擇到的東西,在這種情況下,你會得到一個'no_data_found'異常,如果行計數爲零,或者'太多rows'如果是大於1的PL/SQL ,所以你可以使用異常處理來處理這個問題;或者使用明確的遊標。我認爲需要更多的背景。 –
@alex我hav更新了我的代碼我發佈了一個示例代碼,我正確使用sql%計數? – user1
否; 'select ... into'(除非你按照Codo的建議批量收集)將總是返回一行,或者拋出異常。想象一下,有兩個匹配的行; 'static_ip'的兩個值中的哪一個會在'outIP'中?只要有一行,你的代碼就會工作,但沒有時會失敗。它是否有效?因爲有多行,如果有的話會發生什麼? –