Oracle对象和方法存在一些问题

Oracle对象和方法存在一些问题,oracle,Oracle,您好,我是Oracle新手,在编译时遇到一些错误,例如: 1 ORA-06545:PL/SQL:编译错误-编译已中止 ORA-06550:第13行第1列: PLS-00103:遇到符号“创建” ORA-06550:第0行第0列: PLS-00565:个人必须作为潜在参考目标(对象类型)填写C:\Users\GV\Documents\School\ex3.sql 6 1 我想做的是创建一个类Person,它包含他的个人数据(姓名、地址、电话号码、电子邮件)和两个方法一个检测电话号码是否只是数字,另

您好,我是Oracle新手,在编译时遇到一些错误,例如:

1 ORA-06545:PL/SQL:编译错误-编译已中止 ORA-06550:第13行第1列: PLS-00103:遇到符号“创建” ORA-06550:第0行第0列: PLS-00565:个人必须作为潜在参考目标(对象类型)填写C:\Users\GV\Documents\School\ex3.sql 6 1

我想做的是创建一个类Person,它包含他的个人数据(姓名、地址、电话号码、电子邮件)和两个方法一个检测电话号码是否只是数字,另一个检测电子邮件字符串中是否有@

   create or replace type Person as object (
  --variables
  name varchar(10),
  address varchar(50),

  --methods
  member function pNum (phone number) return self as result,
  member function m (mail varchar) return self as result
) not final;

--body of methods

create or replace 
type Persona as

member function pNum (phone number) return self as result as
  begin
  if( phone is not number ) then
       RAISE_APPLICATION_ERROR( -20122,'phone can only have numbers' );
  end;

member function m (mail varchar) return self as result as
  begin
  if( mail contains('@') ) then
   RAISE_APPLICATION_ERROR( -20122,'not a email' );
  end;
所以我的问题是

为什么我在创建时会出现错误

我的方法正确吗

::::::::::[UPDATE]:::::::::::::::::::::::::::::::::::::::

我已经设法修复了所有错误,但现在我需要一个if语句来检查电话号码中是否只有号码,电子邮件中是否有@字符串

更新代码:

---------------------CLASS-----------------------------
create or replace type Person as object (
    --variables
    name varchar(10),
    address varchar(50),

    --methods
    member function pNum (phone number) return varchar2,
    member function ml (mail varchar) return varchar2
) not final;
/



-----------------------BODY----------------------------------
create or replace type BODY Person as
    member function pNum (phone number) return varchar2 as
      begin
        --if statement that detects if var phone is a number goes here
        --if( phone is not number ) then 
            return 'phone can only have numbers';
      end pNum;

    member function ml (mail varchar) return varchar2 as
      begin
        --if statement that detects if var mail has a @ character goes here
        --if( mail contains('@') ) then
            return 'not a email';
      end ml;
end;
/


--------------RUN TEST----------------------------------
DECLARE
  a Person;
begin
  a := Person(1,2);
  dbms_output.put_line('Phone: ' || a.pNum(1152795927));
end;

你必须坚持正确的语法。首先,您定义了正确的类型
Person

然后你尝试创建它的定义,这里是你弄错的地方。必须将其定义为具有相同名称的类型主体。您定义了Person并尝试为Person创建主体:

create or replace type Person as object (
    --variables
    name varchar(10),
    address varchar(50),

    --methods
    member function pNum (phone number) return self as result,
    member function m (mail varchar) return self as result
 ) not final;
 /
要指定正文,请执行以下操作:

create or replace type BODY Person as
    member function pNum (phone number) return number as
      begin
        if( phone is not number ) then
            RAISE_APPLICATION_ERROR( -20122,'phone can only have numbers' );
        end if;
        return phone;
      end pNum;

    member function m (mail varchar) return varchar as
      begin
        if( mail contains('@') ) then
            RAISE_APPLICATION_ERROR( -20122,'not a email' );
        end if;
        return mail;
      end m;
 end;
 /
基本上你用错误的方式定义了身体。我提供的代码可能有语法错误,因为我这里没有oracle来测试它。如果你发现了,请告诉我,我会修好的


编辑:函数必须返回类型。不能返回
SELF
,因为它是参数的定义。请参见此处的文档:

因此我设法让它工作起来

下面的代码是一个类Person,它包含个人数据(例如:姓名、地址、电话号码、电子邮件)和两个方法一个用于检测电话号码是否仅为数字,另一个用于检测电子邮件字符串中是否有@

   create or replace type Person as object (
  --variables
  name varchar(10),
  address varchar(50),

  --methods
  member function pNum (phone number) return self as result,
  member function m (mail varchar) return self as result
) not final;

--body of methods

create or replace 
type Persona as

member function pNum (phone number) return self as result as
  begin
  if( phone is not number ) then
       RAISE_APPLICATION_ERROR( -20122,'phone can only have numbers' );
  end;

member function m (mail varchar) return self as result as
  begin
  if( mail contains('@') ) then
   RAISE_APPLICATION_ERROR( -20122,'not a email' );
  end;
已解析的代码:

---------------------Class Person-----------------------------
create or replace type Person as object (
    --variables
    name varchar(10),
    address varchar(50),

    --methods
    member function pNum (phone number) return varchar2,
    member function ml (mail varchar) return varchar2
) not final;
/



-----------------------Body of Methods----------------------------------
create or replace type BODY Person as
    member function pNum (phone number) return varchar2 as
      begin
        if(mod(phone,1) != 0) then
            return 'Phone number can only contain numbers';
        end if;
          return phone;
      end pNum;

    member function ml (mail varchar) return varchar2 as
      begin
        if (INSTR(mail, '@') != 0) then
            return mail;
        end if;
            return 'That is not a email';
      end ml;
end;
/


--------------Run Test----------------------------------
DECLARE
  a Person;
begin
  a := Person(1,2);
  dbms_output.put_line('Phone: ' || a.pNum(1152.795927));
  dbms_output.put_line('Email: ' || a.ml('armando@email.com'));

end;

你的权利我有人格而不是人格。但我仍然收到这个错误“3 PLS-00103:遇到符号“创建”3 PLS-00103:遇到符号“创建”。在第二天,我想我明白了。尝试我添加的编辑,您需要添加
/
来完成创建命令。lol现在我在方法的返回自我上都遇到错误,如果x包含('y')语法,则没有
。您可能正在寻找
之类的
instr()