Oracle无效状态错误

Oracle无效状态错误,oracle,function,Oracle,Function,好了,伙计们,这个错误已经很老了,我没有从Oracle得到任何信息,这个函数将编译,但会给出一个警告,如果我尝试使用它,则会显示无效状态消息。这才是真正的问题。如果我把它编码为匿名程序,它运行得很好!!所以在我的声明中一定有一个错误,因为它包含Create函数和匿名程序之间唯一真正的区别。下面是两者的代码,是的,我知道有更简单的方法来反转字符串,这是一个类赋值,我们不能使用内置的字符串反转函数。感谢您的帮助 作为一个匿名程序:(注意:这个很好用) 以下是无效的函数: CREATE OR REP

好了,伙计们,这个错误已经很老了,我没有从Oracle得到任何信息,这个函数将编译,但会给出一个警告,如果我尝试使用它,则会显示无效状态消息。这才是真正的问题。如果我把它编码为匿名程序,它运行得很好!!所以在我的声明中一定有一个错误,因为它包含Create函数和匿名程序之间唯一真正的区别。下面是两者的代码,是的,我知道有更简单的方法来反转字符串,这是一个类赋值,我们不能使用内置的字符串反转函数。感谢您的帮助

作为一个匿名程序:(注意:这个很好用)

以下是无效的函数:

 CREATE OR REPLACE FUNCTION RKC_BinToInt(strBinary IN varchar2(32) RETURN number IS
        intExponent       number := 0;
        strReverse        varchar2(32); 
        strLength             number := 0;
        intBinChar            number := 0;
        BinChar               char;

     BEGIN

        -- Initialize Reverse the Binary String first using similar function to Reversed_Name  
        intAnswer := 0;
        strLength := Length(StrBinary) + 1;

        FOR i IN 1..strLength   LOOP 
             BinChar := SUBSTR(strBinary,strLength-i,1);
            strReverse := strReverse || BinChar;
        END LOOP;

        --Extract the binary character from the reversed string and do the math
        FOR i IN REVERSE 1..LENGTH(strReverse)-1  LOOP
                BinChar := SUBSTR(strReverse, i, 1);
                intExponent := i - 1;
                intBinChar := TO_NUMBER(BinChar);
                intAnswer := intAnswer + (intBinChar * (2 ** intExponent));
        END LOOP;

      RETURN intAnswer;

    END RKC_BinToInt;
    /

你的功能应该是这样的

CREATE OR REPLACE FUNCTION RKC_BinToInt(strBinary IN varchar2) RETURN number IS
        intExponent       number := 0;
        strReverse        varchar2(32); 
        strLength             number := 0;
        intBinChar            number := 0;
        BinChar               char;
        intAnswer NUMBER;
     BEGIN

        -- Initialize Reverse the Binary String first using similar function to Reversed_Name  
        intAnswer := 0;
        strLength := Length(StrBinary) + 1;

        FOR i IN 1..strLength   LOOP 
             BinChar := SUBSTR(strBinary,strLength-i,1);
            strReverse := strReverse || BinChar;
        END LOOP;

        --Extract the binary character from the reversed string and do the math
        FOR i IN REVERSE 1..LENGTH(strReverse)-1  LOOP
                BinChar := SUBSTR(strReverse, i, 1);
                intExponent := i - 1;
                intBinChar := TO_NUMBER(BinChar);
                intAnswer := intAnswer + (intBinChar * (2 ** intExponent));
        END LOOP;

      RETURN intAnswer;

    END RKC_BinToInt;
    /
我找到了答案:

问题不在于我为进行基本的Bin-to-Dec转换而创建的极其复杂的代码

问题是必须在Header(Create或Replace)语句中声明返回变量intAnswer。即使我在代码的BEGIN部分初始化了变量,编译器也没有它的句柄。这仅仅是一些错误建议的结果,因为我问过一位非常有经验的用户是否必须首先声明该变量。所以请注意:RETURN没有声明程序体中使用的变量-它在匿名程序中工作,因为它当然是声明的

谢谢你抽出时间来帮助我们所有的新手。对于这个网站上的每一张海报,你们都应该得到的不仅仅是对你们不懈努力的简单感谢

再次感谢
Rob Campbell

oracle中的函数参数不应具有大小。将
varchar2(32)
更改为
varchar2
使用
SHOW ERRORS
获取实际编译错误。“无效状态”仅表示“存在编译错误”。@expended,
2**intExponent
是有效的PL/SQL。在声明intAnswer后,函数将被编译
CREATE OR REPLACE FUNCTION RKC_BinToInt(strBinary IN varchar2) RETURN number IS
        intExponent       number := 0;
        strReverse        varchar2(32); 
        strLength             number := 0;
        intBinChar            number := 0;
        BinChar               char;
        intAnswer NUMBER;
     BEGIN

        -- Initialize Reverse the Binary String first using similar function to Reversed_Name  
        intAnswer := 0;
        strLength := Length(StrBinary) + 1;

        FOR i IN 1..strLength   LOOP 
             BinChar := SUBSTR(strBinary,strLength-i,1);
            strReverse := strReverse || BinChar;
        END LOOP;

        --Extract the binary character from the reversed string and do the math
        FOR i IN REVERSE 1..LENGTH(strReverse)-1  LOOP
                BinChar := SUBSTR(strReverse, i, 1);
                intExponent := i - 1;
                intBinChar := TO_NUMBER(BinChar);
                intAnswer := intAnswer + (intBinChar * (2 ** intExponent));
        END LOOP;

      RETURN intAnswer;

    END RKC_BinToInt;
    /