Создать новый тип объекта в базе данных 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, но не знаю, как его использовать в этом случае.

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

На самом деле мне нужно создать адрес типа объекта, чтобы затем создать таблицы, использовать его, и когда вы консультируетесь, вы можете взять только улицу, номер или город.

Andrey Duvan 01.03.2019 13:40

Вы хотите иметь возможность запросить у любого экземпляра вашего объекта tipo1 получение значений numerocel для каждой строки в вашей таблице объектов? Это полезное дело?

Alex Poole 01.03.2019 13:41

Это действительно также немного в дидактическом плане, как можно было бы сделать что-то подобное? Также возникает вопрос о том, как обрабатываются эти составные атрибуты. Если я хочу, чтобы они сохранялись как один атрибут, где находится структура, и в некоторых запросах я просто хочу получить часть

Andrey Duvan 01.03.2019 14:09

Я не совсем понимаю, что вы имеете в виду. Если у вас есть две строки в таблице, что вы ожидаете от своего SELECT c.Nombres.Numero() FROM T1 c? Ваша функция-член предполагает, что вы хотите, чтобы функция возвращала значения numero строки каждый (поскольку она запрашивает саму таблицу), подразумевая, что ваш запрос должен возвращать каждый numero в таблице, но для каждой строки. Итак, если бы в таблице было две строки, вы бы увидели 4 результата; если бы у вас было 3 строки, вы бы увидели 9 результатов. Это звучит неправильно. Пожалуйста, добавьте дополнительные образцы данных и ожидаемые результаты к вашему вопросу, чтобы уточнить.

Alex Poole 01.03.2019 14:24
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
0
4
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

CREATE OR REPLACE TYPE BODY Tipo1 
IS 
  MEMBER FUNCTION Numero RETURN Number IS
  BEGIN
    RETURN NumeroCel;
  END;
END;
/
Ответ принят как подходящий

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

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

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

Другие вопросы по теме