Создать новый тип объекта в базе данных Oracle - PullRequest
0 голосов
/ 01 марта 2019

Я только начинаю с 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, но я не знаю, как он будет использоваться в этом случае.

введите описание изображения здесь

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Если ваша функция-член просто для получения значения поля для этого экземпляра объекта, тогда вам это вообще не нужно;вы можете обращаться непосредственно к полям объекта.

Воссоздание вашего примера без функции-члена

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
0 голосов
/ 01 марта 2019

Без подробностей, я просто догадываюсь, но я думаю, что вы, возможно, слишком усложняете вещи, и вам просто нужна функция-член тела обычного типа:

CREATE OR REPLACE TYPE BODY Tipo1 
IS 
  MEMBER FUNCTION Numero RETURN Number IS
  BEGIN
    RETURN NumeroCel;
  END;
END;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...