为什么';这个PL/SQL过程不能工作吗?
我有一个游标,它返回两个值:一个是我将使用的值(因此将分配给为什么';这个PL/SQL过程不能工作吗?,sql,oracle,stored-procedures,plsql,toad,Sql,Oracle,Stored Procedures,Plsql,Toad,我有一个游标,它返回两个值:一个是我将使用的值(因此将分配给out变量),另一个是我仅返回以使ROWNUM工作的值 如果将光标作为查询运行,它将按预期工作。但是如果我执行这个过程,out变量将为空。我的方法是否不被支持?我是说,返回两个值,但只使用其中一个 这是我的过程代码:(不要对查询本身进行太多研究。它可以工作,我知道它有点难看,但它可以工作。这是我找到的唯一返回最后一行的方法) EDIT我尝试运行此过程的方法是通过dbms\u输出。put\u行(o\u CODSDPANTERIOR),但它
out
变量),另一个是我仅返回以使ROWNUM工作的值
如果将光标作为查询运行,它将按预期工作。但是如果我执行这个过程,out
变量将为空。我的方法是否不被支持?我是说,返回两个值,但只使用其中一个
这是我的过程代码:(不要对查询本身进行太多研究。它可以工作,我知道它有点难看,但它可以工作。这是我找到的唯一返回最后一行的方法)
EDIT我尝试运行此过程的方法是通过
dbms\u输出。put\u行(o\u CODSDPANTERIOR)
,但它不起作用。然后我在谷歌上搜索了一下,发现我应该先到_CHAR()
我的var,然后将其输出。也不管用 将一个数字传递到DBMS\u输出没有问题。Oracle将使用默认格式以静默方式将其他内置类型转换为VARCHAR2
。如果您想控制所使用的格式,只需要使用来显示字符
——这通常是个好主意,但通常不是必需的
但是,有一种可能性是,您没有看到输出,因为您没有启用它。如果您正在SQLPlus中运行测试,请确保在运行包含DBMS\u输出调用的代码之前将SERVEROUTPUT设置为ON
。如果您使用的是其他客户机,请查阅其文档,了解启用DBMS_输出的正确方法。(当然,您可以通过添加另一个输出字符串文本的调用来测试它是否已启用。)
您用来填充out参数的技术本身并没有什么问题。但是,不需要从游标返回两列;您的select*
可以是selectcodsdp
。您似乎误解了谓词中引用的任何列都必须在选择列表中,但事实并非如此。在最里面的查询中,选择列表不需要包括NRONIP
或CODTIPOMOV
,因为它们不在外部块中引用;该查询中的WHERE子句可以引用表中的任何列,而不管它是否在select列表中
所以,我的第一个猜测是,您根本没有启用服务器输出。我现在唯一能想到的另一种可能性是,您正在两个不同的会话中运行查询和过程,其中一个会话具有针对表的未提交事务,因此它们实际上看到了不同的数据
如果这些建议似乎不是问题,我建议您在单个SQLPlus会话中运行独立查询和过程的测试,然后在此处复制并粘贴整个会话,因此,我们可以确切地看到您在做什么。很抱歉,当答案与我使用的工具有关时,我让你们花时间回答我。我希望你们都学到了一些东西
这个查询至少对我来说是可行的,我没有遇到任何边缘情况下它不起作用,但我没有对它进行彻底的测试
问题是,我用来运行程序的工具TOAD有时会用我告诉它的参数填充程序,但有时不会。这里的问题是,我试图在没有参数的情况下执行该过程,但没有产生任何结果
经验教训:在TOAD版本9上使用右键单击>运行过程运行过程时,请仔细检查生成的过程代码。是否可以将光标作为查询运行?(在sybase中不是)@aF您可以运行它,如果您在选择关键字之前切断零件:我还以为游标是查询。您只需在sql runner中按ctrl+c,然后按ctrl+v即可。也许还有一个教训——当您的GUI工具给出意外结果时,请切换到类似SQLPlus的基本工具
procedure retorna_infos_tabela_164(i_nip in varchar,
o_CODSDPANTERIOR out number) is
cursor c_tabela_164 is
select *
from(
select CODSDP,ROWNUM rn
from
(
select NRONIP,CODTIPOMOV,CODSDP
from TB164_HISTORICOMOVIMENTACOES
where NRONIP = i_nip and
CODTIPOMOV='S1'
order by DTHMOV desc
)
)
where rn=2;
v_temp_nr number;
begin
open c_tabela_164;
fetch c_tabela_164 into o_CODSDPANTERIOR,v_temp_nr;
close c_tabela_164;
end retorna_infos_tabela_164;