Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么';这个PL/SQL过程不能工作吗?_Sql_Oracle_Stored Procedures_Plsql_Toad - Fatal编程技术网

为什么';这个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;