计算对象表中的文章总和

时间:2017-03-08 11:05:45

标签: sql oracle plsql

我有这些表和对象:

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;

有人可以帮助我吗?谢谢你的时间。

1 个答案:

答案 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.