[英]Oracle invalid state error
好的,这个错误真的很老了,我从Oracle那里什么都没有得到,该函数将编译但发出警告,然后,如果我尝试使用它,则返回无效状态消息。 现在这里是真正的摩擦。 如果我将其“重新编码”为匿名程序,它将运行正常!! 因此,在我的声明中某处一定有一个错误,因为它包含“创建函数”和“匿名程序”之间的唯一真正区别。 两者的代码都在下面,是的,我知道有更简单的方法来反转字符串,这是一个类分配,我们不能使用内置的字符串反转功能。 任何帮助表示赞赏!
作为一个匿名程序:(注意:这很好用)
DECLARE
strBinary varchar2(32);
intAnswer number := 0;
intExponent number := 0;
strReverse varchar2(32);
strLength number := 0;
intBinChar number := 0;
BinChar char;
BEGIN
dbms_output.enable;
-- Reverse the Binary String first using similar function to Reversed_Name
strBinary := ('11111111');
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;
dbms_output.put_line(intAnswer);
END;--RKC_BinToInt;
这是无效的功能:
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到Dec转换的可笑的复杂代码。
问题是必须在标头(创建或替换)语句中声明RETURN变量intAnswer。 即使我在代码的BEGIN部分中初始化了变量,编译器也没有针对它的句柄。 这只是一些错误建议的结果,因为我曾问过一个非常有经验的用户是否必须先声明该变量。 因此请注意:RETURN不会声明在程序主体中使用的变量-它在匿名程序中有效,因为它已被声明。
感谢您抽出宝贵时间来帮助我们所有的新手。 对于本网站上的每位海报发布者,您所做的不懈努力都不仅仅是简单的感谢。
再次感谢Rob Campbell
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.