2014-12-17 2 views
0

ОК, эта ошибка становится реальной, я ничего не получаю от Oracle, функция будет компилироваться, но дает предупреждение, а затем, если я попытаюсь использовать ее, сообщение о недопустимом состоянии. Теперь вот настоящая руб. Если я «перекодирую» его как анонимную программу, он отлично работает! Поэтому где-то в моей декларации должна быть ошибка, так как она содержит единственное реальное различие между функцией Create и анонимной программой. Код для обоих ниже, и да, я знаю, что есть более простые способы изменить строку, это назначение класса, и мы не можем использовать встроенную функцию обратного преобразования строк. Любая помощь приветствуется!Ошибка 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; 
    /
+1

параметры функции в оракула не должны иметь размер. change 'varchar2 (32)' to 'varchar2' – Exhausted

+2

Используйте' SHOW ERRORS' для получения фактических ошибок компиляции. «Недопустимое состояние» означает просто «ошибка компиляции». –

ответ

0

Ваша функция должна быть, как это

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; 
    /
+0

Спасибо, Exhaused, я внес изменения, которые вы предложили, но все равно получите ту же ошибку ... –

+0

@ Исчерпан, '2 ** intExponent' является действительным PL/SQL. –

+0

после объявления intAnswer функция компилируется – psaraj12

0

Я НАЙДЕ ОТВЕТ:

Проблема заключалась не в смехотворном сложном коде, который я создал, чтобы сделать базовое преобразование Bin to Dec.

Проблема заключалась в том, что переменная RETURN intAnswer должна была быть объявлена ​​в заявлении заголовка (Создать или заменить). Несмотря на то, что я инициализировал переменную в разделе BEGIN кода, у компилятора не было дескриптора для этого. Это было просто результатом плохого совета, поскольку я попросил очень опытного пользователя, если эта переменная должна была быть объявлена ​​первой. SO ПРИМЕЧАНИЕ: RETURN НЕ объявляет переменную, используемую в теле программы - она ​​работала в программе Anonymous, потому что она, конечно же, была объявлена.

Спасибо, что нашли время, чтобы помочь всем нам стать новичками. Для каждого плаката на этом сайте вы все заслуживаете большего, чем просто благодарность за ваши неустанные усилия.

Еще раз спасибо Роб Кэмпбелл