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

Без дополнительных подробностей я просто предполагаю, но я думаю, что вы, возможно, слишком усложняете вещи, и вам просто нужна функция-член тела нормального типа:
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
На самом деле мне нужно создать адрес типа объекта, чтобы затем создать таблицы, использовать его, и когда вы консультируетесь, вы можете взять только улицу, номер или город.