Oracle使用包中定义的类型作为添加到已定义类型的表的记录

问题描述 投票:0回答:1

我有以下包裹。

CREATE OR REPLACE PACKAGE offer_actions AS
  TYPE opis_oferty_type IS RECORD (nazwa varchar(11), rocznik number(4), cena decimal(10,2), imie_klienta varchar(32), nazwisko_klienta varchar(32));
  TYPE opis_ofert_table IS TABLE OF varchar(100);
  komis_id komisy.idk%TYPE :=0;
  CURSOR c_oferty RETURN opis_oferty_type;
  FUNCTION find_oferrs(komis_id number) RETURN opis_ofert_table;
END offer_actions;
/
CREATE OR REPLACE PACKAGE BODY offer_actions AS

  CURSOR c_oferty RETURN opis_oferty_type IS
    SELECT mar.nazwa, sze.rok_produkcji, ofe.cena_aktualna, kli.imie, kli.nazwisko FROM oferty ofe, szczegoly_oferty sze, modele modd, marki mar, klienci kli WHERE ofe.klient_id = kli.idk AND sze.oferta_id = ofe.idk AND ofe.model_id = modd.idk AND modd.marka_id = mar.idk AND ofe.komis_id = komis_id;

  FUNCTION find_oferrs(komis_id number) RETURN opis_ofert_table IS
    l_offers opis_ofert_table := opis_ofert_table();
  BEGIN
    FOR i in c_oferty LOOP
      l_offers.EXTEND;  
      l_offers(l_offers.COUNT) := i.nazwa;
    END LOOP;
    RETURN l_offers;
  END find_oferrs; 
END offer_actions;

当我运行脚本时,我收到以下错误。

PLS-00222: no function with name 'OPIS_OFERTY_TYPE' exists in this scope

如何定义opis_oferty_type以允许在操作中添加新记录

l_offers(l_offers.COUNT) := (opis_oferty_type(i.nazwa,i.rocznik,i.cena,i.imie_klienta, i.nazwisko_klienta));

声明的类型。

CREATE OR REPLACE TYPE opis_oferty_type AS OBJECT
(nazwa varchar(11), 
rocznik number(4), 
cena decimal(10,2), 
imie_klienta varchar(32), 
nazwisko_klienta varchar(32)
);
/
CREATE OR REPLACE TYPE opis_ofert_table AS TABLE OF opis_oferty_type;
oracle plsql oracle11g
1个回答
1
投票

您正在尝试使用类似对象类型的记录类型。不可能。 仅在SQL级别声明的对象类型,仅在PL / SQL级别记录类型。 使用opis_oferty_type在SQL中创建类型create type ... as object,或继续使用记录类型,但初始化记录的每个字段,如下所示:

Declare
  l_v opis_oferty_type;
  ...
Begin
  ...
  l_v.nazwa:= ...;
  l_v.rocznik:= ...;
  ...
  l_offers(l_offers.COUNT) := l_v;

这里有一对供参考的链接:Declaring Object TypesInitial Values of Record Variables

© www.soinside.com 2019 - 2024. All rights reserved.