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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/24046612/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-19 02:22:57  来源:igfitidea点击:

PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following: begin function pragma procedure

oraclefunctionplsqlsyntax-erroreof

提问by user3329134

i know the same answer is asked before, but i'm just staring blind on my code. what's wrong with my function???

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

other posts say it's missing a ; but i just can't find it.

其他帖子说它缺少一个;但我就是找不到。

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;

回答by wweicker

You need to use CREATE OR REPLACE FUNCTIONinstead of just FUNCTION

您需要使用CREATE OR REPLACE FUNCTION而不仅仅是FUNCTION

ex.

前任。

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;

There is another error as well. Where you have:

还有另一个错误。你有:

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

You use INTOyou must specify a variable. You can't specify the built in function 'SUBSTRING' to "select into"

你使用INTO你必须指定一个变量。您不能指定内置函数“SUBSTRING”来“选择进入”

ex.

前任。

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

回答by Bob Jarvis - Reinstate Monica

SUBSTRING is not a function in Oracle - you're looking for SUBSTR.

SUBSTRING 不是 Oracle 中的函数 - 您正在寻找 SUBSTR。

A variable such as dcannot be declared as VARCHAR2 - it must be given a length. Note that this is different from a parameter, such as p_IBAN, or a return value declaration - in both cases a length is not required (or even allowed).

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

@wweicker correctly points out that you cannot SELECT into a SUBSTR, and must instead use a variable.

@wweicker 正确地指出您不能 SELECT 到 SUBSTR,而必须使用变量。

When these errors are corrected I think your function should look something like:

纠正这些错误后,我认为您的函数应如下所示:

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;

Best of luck.

祝你好运。

Share and enjoy.

分享和享受。

回答by user3329134

thank you all, eventually i turned it over al little bit, now it works.

谢谢大家,最终我把它翻了一点,现在它可以工作了。

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;

回答by Patrick

Another potential solution for those using DbVisualizer, (and maybe other tools?). This is what solved this problem for me.

对于那些使用 DbVisualizer 的人来说,另一个潜在的解决方案,(也许还有其他工具?)。这就是为我解决这个问题的原因。

Add these two lines to your code, like so:

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

--/ (all your code) /

--/ (all your code) /