【问题标题】:Having some problems with Oracle objects and methodsOracle 对象和方法存在一些问题
【发布时间】:2017-09-11 18:13:54
【问题描述】:

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

1 ORA-06545:PL/SQL:编译错误 - 编译中止 ORA-06550:第 13 行,第 1 列: PLS-00103:遇到符号“CREATE” ORA-06550:第 0 行,第 0 列: PLS-00565:PERSON 必须作为潜在的 REF 目标(对象类型)完成 C:\Users\GV\Documents\School\ex3.sql 6 1

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

   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;

所以我的问题是

为什么我在创建时收到该错误?

我的方法正确吗?

::::::::::::::::::[更新]:::::::::::::::::::::::::: :::::::::::::::::::::::::::::

我已经设法修复了所有错误,但现在我需要一个 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;

【问题讨论】:

    标签: oracle


    【解决方案1】:

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

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

    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,因为它是参数的定义。在此处查看有关它的文档:SELF Parameters in Member Methods

    【讨论】:

    • 你的权利我有角色而不是人。但我仍然收到此错误“3 PLS-00103:遇到符号“CREATE””
    • 3 PLS-00103:遇到符号“CREATE”。在第二次创建
    • 哦,我想我明白了。尝试我添加的编辑,您需要添加/ 来完成创建命令。
    • 大声笑,现在我在方法的返回自身和结束时都遇到错误
    • 没有if x contains('y') 语法。您可能正在寻找likeinstr()
    【解决方案2】:

    所以我设法让它工作!

    以下代码是一个 Person 类,其中包含个人数据(例如:姓名、地址、电话号码、电子邮件)和 2 个方法,一个检测电话号码是否只是数字,另一个检测是否有 @在电子邮件字符串中。

    解析代码:

    ---------------------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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 2011-11-17
      相关资源
      最近更新 更多