在Oracle数据库中创建新型的对象

时间:2019-03-01 12:38:07

标签: database oracle

我只是从Oracle开始,我需要创建一种新型的对象,例如:


CREATE OR REPLACE TYPE Tipo1 IS OBJECT (
Primernombre CHAR(10),
Segundonombre CHAR(10),
NumeroCel Number(21),
MEMBER FUNCTION Numero RETURN Number);

CREATE TABLE T1( Code VARCHAR(8) NOT NULL, Nombres Tipo1, CONSTRAINT PK_T1 PRIMARY KEY (Code) );

INSERT INTO T1 (Code,Nombres) 
VALUES (1554,Tipo1('Nombre1','SegN1',774744));
INSERT INTO T1 (Code,Nombres) 
VALUES (1555,Tipo1('Nombre2','SegN2',774746));
INSERT INTO T1 (Code,Nombres) 
VALUES (1556,Tipo1('Nombre3','SegN3',774146));


CREATE 
OR REPLACE TYPE BODY Tipo1 IS MEMBER FUNCTION Numero RETURN Number IS x Number;
BEGIN
    SELECT
        c.Nombres.NumeroCel INTO x 
    FROM
        T1 c;
RETURN (x);
END;
END;

SELECT c.Nombres.Numero() FROM T1 c;

但是,当有多个记录时,会出现此错误:

ORA-01422: Exact recovery returns a greater number of rows than requested. 

我可以通过什么方式获取更多记录?我想到了FOR,但是我不知道在这种情况下将如何使用它。

enter image description here

2 个答案:

答案 0 :(得分:0)

我只是在猜测更多细节,但我认为您可能会使事情复杂化了,您只需要一个普通的类型body成员函数:

CREATE OR REPLACE TYPE BODY Tipo1 
IS 
  MEMBER FUNCTION Numero RETURN Number IS
  BEGIN
    RETURN NumeroCel;
  END;
END;
/

答案 1 :(得分:0)

如果您的成员函数只是为了获取该对象实例的字段值,那么您根本不需要它。您可以直接引用对象的字段。

在没有成员函数的情况下重新创建示例

CREATE OR REPLACE TYPE Tipo1 IS OBJECT (
  Primernombre CHAR(10),
  Segundonombre CHAR(10),
  NumeroCel Number(21)
);
/

CREATE TABLE T1( Code VARCHAR(8) NOT NULL, Nombres Tipo1, CONSTRAINT PK_T1 PRIMARY KEY (Code) );

INSERT INTO T1 (Code,Nombres) 
VALUES (1554,Tipo1('Nombre1','SegN1',774744));
INSERT INTO T1 (Code,Nombres) 
VALUES (1555,Tipo1('Nombre2','SegN2',774746));
INSERT INTO T1 (Code,Nombres) 
VALUES (1556,Tipo1('Nombre3','SegN3',774146));

然后您可以仅查询该字段:

SELECT c.Nombres.NumeroCel FROM T1 c;

NOMBRES.NUMEROCEL
-----------------
           774744
           774746
           774146

或列和对象字段的组合:

SELECT c.code, c.Nombres.Primernombre, c.Nombres.Segundonombre, c.Nombres.NumeroCel
FROM T1 c;

CODE     NOMBRES.PR NOMBRES.SE NOMBRES.NUMEROCEL
-------- ---------- ---------- -----------------
1554     Nombre1    SegN1                 774744
1555     Nombre2    SegN2                 774746
1556     Nombre3    SegN3                 774146