【问题标题】:error- column not allowed here & too many values upon insert错误-此处不允许列和插入时的值过多
【发布时间】:2014-01-10 03:01:53
【问题描述】:

在创建 Subscriber_T 类型的 Subscriber 表及其函数后,我遇到了这个新问题,我似乎无法在 Subscrber 表中插入任何值。我不断收到的错误是此处不允许列。但是在哪里???

这些是脚本和插入记录。

CREATE OR REPLACE TYPE Surnames_T AS OBJECT (
  Surname varchar (20)
);
/

CREATE OR REPLACE TYPE listSurnames_T 
AS Varray(4) of Surnames_T;
/


CREATE OR REPLACE TYPE listTels as object(
  Tel   number (12)
);
/

CREATE OR REPLACE TYPE listTels_T as Varray(5) of listTels;
/


CREATE OR REPLACE TYPE ADDRESS_T AS OBJECT (
  NUM       number (6),
  STREET    varchar (20),
  TOWN      varchar (20)
);
/

CREATE or replace type TAddress 
as table of Address_T;
/

create or replace type Subscriber_T as object(
  num_s  number(6),
  sName varchar(30), 
  surname listSurnames_T,
  Adds TAddress,
  DateOfBirth  date,
  phoneNo   listTels_T,
  member function Age return number
);
/

create table Subscribers of Subscriber_T(
  CONSTRAINT subscriber_pk primary key (num_s)
)
nested table Adds store as Tab_Adds;
/
show errors


create or replace type body Subscriber_T as
member function Age return number is
calc_age number;
dob date;
diff  date;
begin
  select S.dateOfBirth into dob
  from Subscribers S
  where deref(S.num_s) = self

  diff := sysdate - dob  
  calc_age := to_Char(diff, 'YYYY')

  return cal_age;
end;
    end;
/
show errors


insert into Subscribers values (34, Chloe, listSurnames_T(Surnames_T('Dave'), Surnames_T('Camille'), Surnames_T('Jones')), 
TAddress(Address_T(10, 'ave Foch', 'Ravenwood'), Address_T(30, 'rue des pole', 'England')), 
'10-11-1976', 
listTels_T(listTels(5839550456), listTels(6834734567)));

我猜这个函数会引发这个问题,但它在编译时没有显示错误。

【问题讨论】:

标签: sql oracle function types


【解决方案1】:

一些问题:

  1. 你不需要在成员函数age中做SELECT
  2. 您没有引用名称 Chloe,因此它不是字符串。
  3. 您尚未将 '10-11-1976' 转换为日期。
  4. You should not use VARCHAR as a datatype - 改用 VARCHAR2

SQL Fiddle

Oracle 11g R2 架构设置

CREATE OR REPLACE TYPE Surnames_T AS OBJECT (
  Surname varchar2 (20)
)
/

CREATE OR REPLACE TYPE listSurnames_T 
AS Varray(4) of Surnames_T
/


CREATE OR REPLACE TYPE listTels as object(
  Tel   number (12)
)
/

CREATE OR REPLACE TYPE listTels_T as Varray(5) of listTels
/


CREATE OR REPLACE TYPE ADDRESS_T AS OBJECT (
  NUM       number (6),
  STREET    varchar2 (20),
  TOWN      varchar2 (20)
)
/

CREATE or replace type TAddress as table of Address_T
/

create or replace type Subscriber_T as object(
  num_s        number(6),
  sName        varchar2(30), 
  surname      listSurnames_T,
  Adds         TAddress,
  DateOfBirth  date,
  phoneNo       listTels_T,
  member function Age return number
)
/


create or replace type body Subscriber_T as
  member function Age return number is
  begin
    return FLOOR( MONTHS_BETWEEN( SYSDATE, self.DateOfBirth )/12 );
  end;
end;
/

create table Subscribers of Subscriber_T(
  CONSTRAINT subscriber_pk primary key (num_s)
)
nested table Adds store as Tab_Adds
/

insert into Subscribers values (
  34,
  'Chloe',
  listSurnames_T(
    Surnames_T('Dave'),
    Surnames_T('Camille'),
    Surnames_T('Jones')
  ), 
  TAddress(
    Address_T(10, 'ave Foch', 'Ravenwood'),
    Address_T(30, 'rue des pole', 'England')
  ),
  TO_DATE( '10-11-1976', 'DD-MM-YYYY' ), 
  listTels_T(
    listTels(5839550456),
    listTels(6834734567)
  )
)
/

查询 1

SELECT s.age() FROM subscribers s

Results

| S.AGE() |
|---------|
|      37 |

编辑

我不确定您为什么要在 Surnames_T 类型中包装 VARCHAR2 或在 ListTels 类型中包装 NUMBER。你可以省略这些,只做:

CREATE OR REPLACE TYPE listSurnames_T 
AS Varray(4) of VARCHAR2(20)
/

CREATE OR REPLACE TYPE listTels_T as Varray(5) of NUMBER(12)
/

和:

insert into Subscribers values (
  34,
  'Chloe',
  listSurnames_T(
    'Dave',
    'Camille',
    'Jones'
  ), 
  TAddress(
    Address_T(10, 'ave Foch', 'Ravenwood'),
    Address_T(30, 'rue des pole', 'England')
  ),
  TO_DATE( '10-11-1976', 'DD-MM-YYYY' ), 
  listTels_T(
    5839550456,
    6834734567
  )
)
/

【讨论】:

  • NP,如果它解决了您的问题,那么请接受答案和/或投票(同样适用于您之前的问题)。如果它不能解决问题,请发布进一步的问题。
  • 嗨 MTO。例如,如果我想更新订阅者以更改 Chloe 的第一个地址和电话,我该怎么做?请建议。 Tnx
  • 对不起,我没有被允许投票,因为我是新来的,所以我没有足够的声誉。我不知道这里的情况如何。对不起,我还在为我的代表工作。^^
  • SQLFIDDLE - 为嵌套表(您的地址)中的条目显示 INSERTUPDATEDELETE。我不使用VARRAYs,所以不知道使用 SQL 添加/更新/删除元素的任何语法,并且从快速搜索中只能找到完全替换条目的语法 - 请参阅最后一个示例在那个 SQLFIDDLE 中。
  • tnx 寻求帮助 MTO。我现在有了更好的理解。
猜你喜欢
  • 1970-01-01
  • 2020-03-31
  • 2021-10-19
  • 1970-01-01
  • 1970-01-01
  • 2016-07-13
  • 2013-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多