+-
ORA-22814:属性或元素值大于类型中指定的值
SQL> create or replace type societe 
       as object (nom_societe varchar2(20),ville_societe varchar2(20));
   /

create or replace type produit as object(
nom varchar2(20),
poids number(9),
couleur varchar2(20),
composants varchar2(2));
/



SQL> insert into commande(NUMERO,DATE_SOUMISSION,DATE_ENVOI,SOCIETE,PRODUIT) values(
  2  1,to_date('2013/03/11','yyyy/mm/dd'),to_date('2014/05/12','yyyy/mm/dd'),
  3  societe('BME','FES'),produit('prod1',12,'noir','aluminium'));
insert into commande(NUMERO,DATE_SOUMISSION,DATE_ENVOI,SOCIETE,PRODUIT) values(
            *
ERROR at line 1:
ORA-22814: attribute or element value is larger than specified in type


SQL> create table commande(
  2  numero number(9),
  3  date_soumission date,
  4  date_envoi date,
  5  societe societe,
  6  produit produit);
0
投票

composants varchar2(2)

'铝'

显然,您要插入到composants属性中的第四个元素'',由于数据类型的大小为VARCHAR2(2),因此大于2个字符/字节。增大composants的大小,以便它可以存储元素。

CREATE OR REPLACE TYPE societe AS OBJECT (
    nom_societe     VARCHAR2(20),
    ville_societe   VARCHAR2(20)
)
/

CREATE OR REPLACE TYPE produit AS OBJECT (
    nom          VARCHAR2(20),
    poids        NUMBER(9),
    couleur      VARCHAR2(20),
    composants   VARCHAR2(20)
)
/

CREATE TABLE commande (
    numero            NUMBER(9),
    date_soumission   DATE,
    date_envoi        DATE,
    society           societe,
    product           produit
);

现在您可以通过以下方式插入:

INSERT INTO commande (
    numero,
    date_soumission,
    date_envoi,
    society,
    product
) VALUES (
    1,
    TO_DATE('2013/03/11', 'yyyy/mm/dd'),
    TO_DATE('2014/05/12', 'yyyy/mm/dd'),
    societe('BME', 'FES'),
    produit('prod1', 12, 'noir', 'aluminium')
);

您可以检查插入的数据:

SELECT * FROM commande;

NUMERO DATE_SOU DATE_ENV SOCIETY(NOM_SOCIETE,  PRODUCT(NOM, POIDS, COULEUR, COMPOSANTS) 
------ -------- -------- --------------------- -----------------------------------------
     1 11-03-13 12-05-14 SOCIETE('BME', 'FES') PRODUIT('prod1', 12, 'noir', 'aluminium')