我有这些表和对象:
CREATE OR REPLACE TYPE t_article AS OBJECT (
id NUMBER(5),
nom VARCHAR2(15),
preu DECIMAL(7),
iva NUMBER(5));
/* 7 */
create table article of t_article (id primary key);
insert into article
values(t_article(1, 'article1', 12.12, 21));
insert into article
values(t_article(2, 'article2', 123.4, 21));
insert into article
values(t_article(3, 'article3', 41, 21));
insert into article
values(t_article(4, 'article4', 11, 21));
insert into article
values(t_article(5, 'article5', 13.31, 21));
/* 8 */
CREATE OR REPLACE TYPE t_linia AS OBJECT (
id NUMBER(5),
article REF t_article,
quantitat NUMBER(5));
/* 9 */
create type t_detall as table of t_linia;
/* 10 */
CREATE OR REPLACE TYPE t_venda AS OBJECT (
id NUMBER(5),
dat date,
clien REF t_client,
detall t_detall);
好吧,现在我需要在' t_venda'上添加一个功能。返回每篇"文章的SUM
"价格,我有一个线索:
SELECT DEREF(detall(i).article) INTO art FROM DUAL;
有人可以帮助我吗?谢谢你的时间。
答案 0 :(得分:1)
你需要一个成员函数,在对象类型声明中添加(我已经注释掉clien
只是因为你没有包含t_client
的类型定义):
CREATE OR REPLACE TYPE t_venda AS OBJECT (
id NUMBER(5),
dat date,
-- omitting clien as t_client definition not shown in question
-- clien REF t_client,
detall t_detall,
MEMBER FUNCTION sum_price RETURN NUMBER);
/
然后是类型体中的实际函数:
CREATE OR REPLACE TYPE BODY t_venda AS
MEMBER FUNCTION sum_price RETURN NUMBER AS
l_sum_price NUMBER;
BEGIN
SELECT SUM(d.article.preu)
INTO l_sum_price
FROM TABLE(detall) d;
RETURN l_sum_price;
END sum_price;
END;
/
使用包含问题中所有文章的虚构对象进行测试(并再次省略clien
,因为不知道其构造函数应该包含什么内容):
set serveroutput on
DECLARE
l_venda t_venda;
BEGIN
-- omitting t_client constructor as not shown in question
SELECT t_venda(1, sysdate, -- t_client(),
CAST(COLLECT(t_linia(a.id, REF(a), 1)) AS t_detall))
INTO l_venda
FROM article a;
dbms_output.put_line('Got result:' || l_venda.sum_price);
END;
/
Got result:200
PL/SQL procedure successfully completed.