【发布时间】:2012-11-03 21:52:56
【问题描述】:
下面的代码可能返回不止一行。 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;
【问题讨论】:
-
如果标记为 PL/SQL,那么您需要选择某些内容,在这种情况下,如果行数为零,您将获得
no_data_found异常,或者如果是too many rows大于 1,因此您可以使用异常处理来处理此问题;或使用显式游标。我认为需要更多背景信息。 -
@alex 我更新了我的代码我发布了一个示例代码我是否以正确的方式使用 sql%count?
-
否;
select ... into(除非你有bulk collect into就像 Codo 建议的那样)总是会返回一行,或者引发异常。想象一下有两个匹配的行;static_ip的两个值中的哪一个在outIP中?只要有一行,您的代码就可以工作,但如果没有,您的代码就会失败。多于一行是否有效,如果有怎么办? -
另外,
outInstatus在您检查时只能是Y- 如果您的第一个select中没有匹配的行,则在您到达 @987654335 之前将引发no_data_found@。尽管构造无论如何都不正确,但如果sql%rowcount为零——这是不可能的,你会在那里得到no_data_found——那么你就没有设置outretvalue。我不完全确定你是否需要打三下;这可能表明第三个select也可以返回多行。我认为您需要澄清在各种情况下应该发生的事情。 -
@alex 1.我的第一个“选择”查询在一个表上,另外两个“选择”查询在另一个表上。 2.现在我将上面的代码更新为当找不到数据时而不是 else 3.如果第二个“选择”查询返回多行,我想取第一行并处理它。
标签: oracle stored-procedures plsql oracle10g oracle11g