Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 错误-此处不允许列&;插入时值过多_Sql_Oracle_Function_Types - Fatal编程技术网

Sql 错误-此处不允许列&;插入时值过多

Sql 错误-此处不允许列&;插入时值过多,sql,oracle,function,types,Sql,Oracle,Function,Types,在创建Subscriber\u T类型的Subscriber表及其函数后,我遇到了这个新问题,我似乎无法在Subscriber表中插入任何值。错误,我一直得到列不允许在这里。但是在哪里 这些是脚本和插入记录 CREATE OR REPLACE TYPE Surnames_T AS OBJECT ( Surname varchar (20) ); / CREATE OR REPLACE TYPE listSurnames_T AS Varray(4) of Surnames_T; /

在创建Subscriber\u T类型的Subscriber表及其函数后,我遇到了这个新问题,我似乎无法在Subscriber表中插入任何值。错误,我一直得到列不允许在这里。但是在哪里

这些是脚本和插入记录

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)));
我猜函数会引发这个问题,但它在编译时没有显示错误。

一些问题:

  • 您不需要在成员函数
    age
    中执行
    选择
  • 你没有引用克洛伊的名字,所以它不是一个字符串
  • 您尚未将
    '10-11-1976'
    转换为日期
  • -改用
    VARCHAR2
  • 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)
      )
    )
    /
    
    SELECT s.age() FROM subscribers s
    
    | S.AGE() |
    |---------|
    |      37 |
    
    查询1

    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)
      )
    )
    /
    
    SELECT s.age() FROM subscribers s
    
    | S.AGE() |
    |---------|
    |      37 |
    

    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)
      )
    )
    /
    
    SELECT s.age() FROM subscribers s
    
    | S.AGE() |
    |---------|
    |      37 |
    
    编辑

    我不知道你为什么要在
    姓氏
    类型中包装
    VARCHAR2
    ,或者在
    列表中包装
    数字
    。您可以忽略这些,只需执行以下操作:

    CREATE OR REPLACE TYPE listSurnames_T 
    AS Varray(4) of VARCHAR2(20)
    /
    
    CREATE OR REPLACE TYPE listTels_T as Varray(5) of NUMBER(12)
    /
    
    以及:


    您不需要
    /
    :NP,如果它解决了您的问题,请接受答案和/或向上投票(您前面的问题也是如此)。如果它不能解决问题,那么发布进一步的问题。嗨,MTO。例如,如果我想对订户进行更新,以更改克洛伊的第一个地址和电话,我该怎么做?Plz建议。很抱歉,我没有被允许投票支持bcs,因为我是新来的&所以我没有足够的声誉。我不知道这里的情况如何。请原谅,我仍在处理我的代表。^-显示嵌套表(您的地址)中的条目的
    插入
    更新
    删除
    。我不使用
    VARRAY
    s,因此不知道使用SQL添加/更新/删除元素的语法,快速搜索只能找到替换整个条目的语法-有关帮助MTO,请参阅该SQLFIDDLE.tnx中的最后一个示例。我现在有了更好的理解。