gpt4 book ai didi

oracle - 是否可以使用 sql%rowcount 进行 SELECT?

转载 作者:行者123 更新时间:2023-12-02 05:52:31 27 4
gpt4 key购买 nike

下面的代码可能返回多行。 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:使用异常(exception)

如果有 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;

关于oracle - 是否可以使用 sql%rowcount 进行 SELECT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13395131/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com