0

ネストされたテーブルにプロシージャを追加する必要があるこの宿題があります。これが構造です

create type associe_t as Object(noAs int, nomAs varchar(50), capAs int)
/
create type lesAssocies_t as TABLE OF associe_t
/
create type promoteur_t as Object(matP int, nomP varchar(50), adrP varchar(50), lesAssocies lesAssocies_t)
/
create table promoteur of promoteur_t (
    constraint pk_promoteur primary key(matP));

create table promoteur of promoteur_t (
    constraint pk_promoteur primary key(matP),
    constraint limCapAs check (capAs <= 1 000 000)
) tableSpace TBS3202A2012
NESTED TABLE lesAssocies STORE AS Table_lesAssocies ;

associe_tパラメータで渡された数値に基づいて、レコード内の値を更新できるタイプのメソッドが必要です。

そこで、タイプにメソッドシグネチャを追加しようとしました。

alter type associe_t add member procedure augmenteCapAs(P IN number) cascade ;

そして、私はその手順の本文を後に追加しようとしました:

CREATE or replace TYPE BODY associe_t AS
MEMBER procedure augmenteCapAs(P in number ) AS 
  BEGIN 
    update Table_lesAssocies t set t.capAs = P/100 where t.noAs = self.noAs;
  END;
END;
/

テーブル名を使用するTable_lesAssociesと、次のエラーが発生します。

ORA-22812: cannot reference nested table column's storage table

また、テーブル名を使用するlesAssocies_tと、テーブルが存在しないことがわかります。

私は何が間違っているのですか?そのテーブルの物理的な名前を使用するべきではないと確信しています(Table_lesAssocies

どのテーブル名を使用する必要がありますか?

4

1 に答える 1

1

エラーメッセージに示されているように、ネストされたテーブルの列に直接アクセス(取得または保存)することはできません。外部テーブルを介してのみアクセスできます。したがって、次のようにコードを書き直すことができます。

SQL> create type associe_t as Object(noAs int, nomAs varchar(50), capAs int)
  2  /

Type created


SQL> create type lesAssocies_t as TABLE OF associe_t
  2  /

Type created


SQL> create type promoteur_t as Object(matP int, nomP varchar(50), adrP varchar(50), lesAssocies lesAssocies_t)
  2  /

Type created


SQL> create table tb_promoteur of promoteur_t (
  2      constraint pk_promoteur primary key(matP)
  3  )tablespace users
  4  NESTED TABLE lesAssocies STORE AS Table_lesAssocies;

Table created

SQL> alter table table_lesassocies add constraint chk_capas check (capas < 1000000);

Table altered

SQL> alter type associe_t add member procedure augmenteCapAs(P IN number) cascade ;

Type altered


SQL> CREATE OR REPLACE TYPE BODY associe_t AS
  2  MEMBER procedure augmenteCapAs(P in number ) AS
  3    BEGIN
  4      update table(select lesAssocies
  5                     from tb_promoteur) t
  6         set t.capAs = P/100
  7       where t.noAs = self.noAs;
  8    END;
  9  END;
 10  /

Type body created
于 2012-11-22T19:54:05.990 に答える