我只是从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,但是我不知道在这种情况下将如何使用它。
答案 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