Oracle,EXTENDS声明

时间:2018-01-16 18:19:14

标签: oracle object-oriented-database

我试图在Oracle中创建对象数据类型。 我有一个名为type_transaction的对象类型,我使用这种类型的主体 EXTENDS功能。 编译器崩溃以下错误: "标识符' EXTENDS'必须申报。 我不知道我做错了什么

这是类型:

    CREATE OR REPLACE TYPE type_transakcja AS OBJECT
    (
      id_transakcji NUMBER(10),
      data_transakcji DATE,
      pracownika_id REF type_pracownik,
      klient_id REF type_klienta,
      produkt_id REF type_produkt,
      zamowienia k_zamowienie,
      MAP MEMBER FUNCTION odwzoruj RETURN NUMBER,
      MEMBER FUNCTION wartosc_zamowienia RETURN NUMBER,
      MEMBER FUNCTION transakcja(produkty REF type_produkt, ile NUMBER) 
      RETURN NUMBER,
      MEMBER PROCEDURE anuluj,
      MEMBER PROCEDURE zatwierdz
      );

      CREATE TYPE k_zamowienie AS TABLE OF type_sprzedaz;

这是

的主体
      CREATE OR REPLACE TYPE BODY type_transakcja IS

      MEMBER FUNCTION transakcja(produkty REF type_produkt, ile NUMBER) 
      RETURN NUMBER IS
      i INTEGER;
      t k_zamowienie;
      p type_produkt;
      BEGIN
      SELECT DEREF(produkty) INTO p FROM DUAL;
      IF p.ilosc_magazynowa - ile >=0 THEN
      p.ilosc_magazynowa:=p.ilosc_magazynowa-ile;
      t:=SELF.zamowienia;
      t:=extend(1);
      i:= SELF.zamowienia.last();
      t(i).ilosc:=ile;
      t(i).cena:=SELF.wartosc_zamowienia();
      t(i).produkt_id:=produkty;
      RETURN 1;
      ELSE
      RETURN 0;
      END IF;
      END;

      END;

1 个答案:

答案 0 :(得分:0)

很难确定您提供的有限信息,以及看起来不是您得到的实际错误;但看起来你只是错误地扩展你的收藏。

假设k_zamowienie是表类型,您正在执行:

t:=extend(1);

而不是:

t.extend(1);

你真的不需要i,如果你有它,你的索引将是一个关闭(因为它是基于原始表的大小,而不是克隆和扩展的);你可以这样做:

  t(t.last).ilosc:=ile;
  t(t.last).cena:=SELF.wartosc_zamowienia();
  t(t.last).produkt_id:=produkty;

但即便如此,你也没有对t做任何事情,所以这似乎有点无意义。也许你的意思是这个?

  zamowienia.extend(1);
  zamowienia(zamowienia.last()).ilosc:=ile;
  zamowienia(zamowienia.last()).cena:=SELF.wartosc_zamowienia();
  zamowienia(zamowienia.last()).produkt_id:=produkty;