PLS-00103:遇到符号"文件结束"期待以下之一时:开始函数编译指示程序

时间:2014-06-04 20:07:07

标签: oracle function plsql syntax-error eof

我知道之前会问同样的答案,但我只是盯着我的代码。 我的功能有什么问题???

其他帖子说它缺少了;但我找不到它。

FUNCTION checkIBAN
( p_IBAN in varchar2 )
RETURN varchar2
is
v_landcode  varchar2(2);
v_lengte    number(2);
v_omgezettelandcode varchar2;
v_teller    number(2) DEFAULT 1;
n           number(9);
d           varchar2;
BEGIN
v_landcode := SUBSTRING(p_IBAN, 1, 2);
select lengte
into v_lengte
from IBAN
where code = v_landcode;
if p_IBAN.LENGTH != v_lengte
    then return 'F';
end if;
v_omgezettelandcode := SUBSTRING(p_IBAN, 5) || SUBSTRING(p_IBAN, 1, 4);
WHILE v_teller < v_omgezettelandcode.LENGTH LOOP
    select getal
    into SUBSTRING(v_omgezettelandcode, v_lengte, v_lengte)
    from abc
    where SUBSTRING(v_omgezettelandcode, v_lengte, v_lengte) = letter;
    v_teller := v_teller + 1;
END LOOP;
d := v_omgezettelandcode;
n := SUBSTRING(d, 1, 9);
d := SUBSTRING(d, 10);
n := n/97;
WHILE d.LENGTH > 7 LOOP
    n := n || SUBSTRING(d, 1, 7);
    d := SUBSTRING(d, 8);
    n := n/97;
END LOOP;
n := n || d;
if n/97 = 1
    then return 'T';
    else return 'F';
end if;
END checkIBAN;

4 个答案:

答案 0 :(得分:2)

您需要使用CREATE OR REPLACE FUNCTION而非FUNCTION

离。

CREATE OR REPLACE FUNCTION checkIBAN
( p_IBAN in varchar2 )
RETURN varchar2
is
  v_landcode  varchar2(2);
  v_lengte    number(2);
  v_omgezettelandcode varchar2;
  v_teller    number(2) DEFAULT 1;
  n           number(9);
  d           varchar2;
BEGIN
  v_landcode := SUBSTRING(p_IBAN, 1, 2);

  select lengte
  into v_lengte
  from IBAN
  where code = v_landcode;

  if p_IBAN.LENGTH != v_lengte
    then return 'F';
  end if;

  v_omgezettelandcode := SUBSTRING(p_IBAN, 5) || SUBSTRING(p_IBAN, 1, 4);

  WHILE v_teller < v_omgezettelandcode.LENGTH LOOP
    select getal
    into SUBSTRING(v_omgezettelandcode, v_lengte, v_lengte)
    from abc
    where SUBSTRING(v_omgezettelandcode, v_lengte, v_lengte) = letter;
    v_teller := v_teller + 1;
  END LOOP;

  d := v_omgezettelandcode;
  n := SUBSTRING(d, 1, 9);
  d := SUBSTRING(d, 10);
  n := n/97;

  WHILE d.LENGTH > 7 LOOP
    n := n || SUBSTRING(d, 1, 7);
    d := SUBSTRING(d, 8);
    n := n/97;
  END LOOP;

  n := n || d;

  if n/97 = 1
    then return 'T';
    else return 'F';
  end if;

END checkIBAN;

还有另一个错误。你在哪里:

select getal
into SUBSTRING(v_omgezettelandcode, v_lengte, v_lengte)
from abc
where SUBSTRING(v_omgezettelandcode, v_lengte, v_lengte) = letter;

您使用INTO必须指定变量。您不能将内置函数“SUBSTRING”指定为“select into”

离。

select getal
into SOME_LOCAL_VARIABLE_NAME
from abc
where SUBSTRING(v_omgezettelandcode, v_lengte, v_lengte) = letter;

答案 1 :(得分:2)

SUBSTRING不是Oracle中的一个功能 - 您正在寻找SUBSTR。

d之类的变量不能声明为VARCHAR2 - 必须给它一个长度。请注意,这与参数(例如p_IBAN)或返回值声明不同 - 在这两种情况下都不需要(甚至允许)长度。

@wweicker正确地指出你不能SELECT进入SUBSTR,而必须改为使用变量。

当纠正这些错误时,我认为您的功能应该类似于:

CREATE OR REPLACE FUNCTION checkIBAN
    (p_IBAN in varchar2)
  RETURN varchar2
is
  v_landcode          varchar2(2);
  v_lengte            number(2);
  v_omgezettelandcode varchar2(32767);  -- max possible size for a VARCHAR2 var
  v_teller            number(2) DEFAULT 1;
  n                   number(9);
  d                   varchar2(32767);
  s                   VARCHAR2(32767);
BEGIN
  v_landcode := SUBSTR(p_IBAN, 1, 2);

  select lengte
    into v_lengte
    from IBAN
    where code = v_landcode;

  if p_IBAN.LENGTH != v_lengte then
    return 'F';
  end if;

  v_omgezettelandcode := SUBSTR(p_IBAN, 5) || SUBSTR(p_IBAN, 1, 4);

  WHILE v_teller < v_omgezettelandcode.LENGTH LOOP
    select getal
      into s
      from abc
      where SUBSTR(v_omgezettelandcode, v_lengte, v_lengte) = letter;

    v_omgezettelandcode := SUBSTR(vomgezettelandcode, 1, v_lengte-1) ||
                           letter ||
                           SUBSTR(vomgezettelandcode, v_lengte+LENGTH(letter));

    v_teller := v_teller + 1;
  END LOOP;

  d := v_omgezettelandcode;
  n := SUBSTR(d, 1, 9);
  d := SUBSTR(d, 10);
  n := n/97;

  WHILE d.LENGTH > 7 LOOP
    n := n || SUBSTR(d, 1, 7);
    d := SUBSTR(d, 8);
    n := n/97;
  END LOOP;

  n := n || d;

  if n/97 = 1
    then return 'T';
    else return 'F';
  end if;
END checkIBAN;

祝你好运。

分享并享受。

答案 2 :(得分:0)

谢谢大家,最后我把它翻过来,现在它可以了。

CREATE OR REPLACE FUNCTION checkIBAN
(p_IBAN in varchar2)
RETURN varchar2
is
v_landcode          varchar2(2);
v_lengte            number(2);
v_omgezettelandcode varchar2(32767);  -- max possible size for a VARCHAR2 var
v_teller            number(2) DEFAULT 1;
n                   number(9);
d                   varchar2(32767);
s                   VARCHAR2(32767);
v_omgezet           varchar2(32767);
v_number            varchar2(32767);
BEGIN
v_landcode := SUBSTR(p_IBAN, 1, 2);

select lengte
into v_lengte
from IBAN
where code = v_landcode;

if LENGTH(p_IBAN) != v_lengte then
return 'F';
end if;

v_omgezettelandcode := SUBSTR(p_IBAN, 5) || SUBSTR(p_IBAN, 1, 4);

while v_teller < LENGTH(v_omgezettelandcode) LOOP
    if SUBSTR(v_omgezettelandcode, v_teller, v_teller) in (0, 1, 2, 3, 4, 5, 6,     7, 8, 9)
        then v_omgezet := v_omgezet || SUBSTR(v_omgezettelandcode,     v_teller, v_teller);
    else 
        select getal
        into v_number
        from abc
        where letter = SUBSTR(v_omgezettelandcode, v_teller, v_teller);
        v_omgezet := v_omgezet || v_number;
    end if;
end loop;

d := v_omgezet;
n := SUBSTR(d, 1, 9);
d := SUBSTR(d, 10);
n := n/97;

WHILE LENGTH(d) > 7 LOOP
n := n || SUBSTR(d, 1, 7);
d := SUBSTR(d, 8);
n := n/97;
END LOOP;

n := n || d;

if n/97 = 1
then return 'T';
else return 'F';
end if;
END checkIBAN;

答案 3 :(得分:0)

使用DbVisualizer的其他潜在解决方案(可能还有其他工具?)。这就是我解决这个问题的方法。

将这两行添加到您的代码中,如下所示:

--/ (all your code) /