Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.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_Plsql - Fatal编程技术网

如何修复此“;SQL语句被忽略”;错误?

如何修复此“;SQL语句被忽略”;错误?,sql,oracle,plsql,Sql,Oracle,Plsql,我有以下未编译的小函数: CREATE OR REPLACE PROCEDURE insertarVentas(ID NUMBER, IDCliente NUMBER, nombre VARCHAR2, calle VARCHAR2, poblacion VARCHAR2, cp NUMBER, provincia VARCHAR2, dni VARCHAR2, telef1 VARCHAR2, telef2 VARCHAR2, telef3 VARCHAR2, fechaventa date

我有以下未编译的小函数:

CREATE OR REPLACE PROCEDURE insertarVentas(ID NUMBER, IDCliente NUMBER, nombre VARCHAR2, calle VARCHAR2, poblacion VARCHAR2, cp NUMBER, provincia VARCHAR2, dni VARCHAR2, 
telef1 VARCHAR2, telef2 VARCHAR2, telef3 VARCHAR2, fechaventa date, numerolinea NUMBER, IDProducto NUMBER, descripcion VARCHAR2, pvp NUMBER, stockactual NUMBER, cantidad NUMBER) AS
BEGIN
INSERT INTO TABLA_VENTAS VALUES (ID, TIP_CLIENTE(IDCliente, nombre, TIP_DIRECCION(calle, poblacion, cp, provincia), dni, TIP_TELEFONOS(telef1, telef2, telef3)), fechaventa, 
TIP_LINEAS_VENTA(numerolinea, TIP_PRODUCTO(IDProducto, descripcion, pvp, stockactual), cantidad));
END insertarVentas;
编译器给了我以下错误:

Error at line 4: PL/SQL: SQL Statement ignored

2. telef1 VARCHAR2, telef2 VARCHAR2, telef3 VARCHAR2, fechaventa date, numerolinea NUMBER, IDProducto NUMBER, descripcion VARCHAR2, pvp NUMBER, stockactual NUMBER, cantidad NUMBER) AS
3. BEGIN
4. INSERT INTO TABLA_VENTAS VALUES (ID, TIP_CLIENTE(IDCliente, nombre, TIP_DIRECCION(calle, poblacion, cp, provincia), dni, TIP_TELEFONOS(telef1, telef2, telef3)), fechaventa, 
5. TIP_LINEAS_VENTA(numerolinea, TIP_PRODUCTO(IDProducto, descripcion, pvp, stockactual), cantidad));
6. END insertarVentas;
这是一个插入到对象表中的代码,这是该表的代码

CREATE TABLE TABLA_VENTAS OF TIP_VENTA(
IDVENTA PRIMARY KEY
)NESTED TABLE LINEAS STORE AS TABLA_LINEAS;

CREATE TYPE TIP_VENTA AS OBJECT(
IDVENTA NUMBER,

IDCLIENTE REF TIP_CLIENTE,
    CREATE TYPE TIP_CIENTE AS OBJECT(
    IDCLIENTE NUMBER,

    NOMBRE VARCHAR2(50),

    DIREC TIP_DIRECCION,
        CREATE TYPE TIP_DIRECCION AS OBJECT(
        CALLE VARCHAR2(50),
        POBLACION VARCHAR2(50),
        CODPOSTAL NUMBER(5),
        PROVINCIA VARCHAR2(40)
        );

    NIF VARCHAR2(9),

    TELEF TIP_TELEFONOS
        CREATE TYPE TIP_TELEFONOS AS VARRAY(3) OF VARCHAR2(15);
    );

FECHAVENTA DATE,

LINEAS TIP_LINEAS_VENTA,
    CREATE TYPE TIP_LINEAVENTA AS OBJECT(
    NUMEROLINEA NUMBER,

    IDPRODUCTO REF TIP_PRODUCTO,
        CREATE TYPE TIP_PRODUCTO AS OBJECT(
        IDPRODUCTO NUMBER,
        DESCRIPCION VARCHAR2(80),
        PVP NUMBER,
        STOCKACTUAL NUMBER
        );

    CANTIDAD NUMBER
    );

CREATE TYPE TIP_LINEAS_VENTA AS TABLE OF TIP_LINEAVENTA;
    );

导致此错误的原因是什么?如何修复它?

我认为问题在于,您试图在对象的表中插入非对象的内容

我将您的对象类型填充拆分为变量(而不是像您那样将它们嵌套在insert语句中),希望您能够看到实际要插入的内容:

create or replace procedure insertarventas (id number,
                                            idcliente number,
                                            nombre varchar2,
                                            calle varchar2,
                                            poblacion varchar2,
                                            cp number,
                                            provincia varchar2,
                                            dni varchar2,
                                            telef1 varchar2,
                                            telef2 varchar2,
                                            telef3 varchar2,
                                            fechaventa date,
                                            numerolinea number,
                                            idproducto number,
                                            descripcion varchar2,
                                            pvp number,
                                            stockactual number,
                                            cantidad number)
as
  v_tip_venta tip_venta;
  v_tip_cliente tip_cliente;
  v_tip_direccion tip_direccion;
  v_tip_telefonos tip_telefonos;
  v_tip_lineaventa tip_lineaventa;
  v_tip_lineas_venta tip_lineas_venta;
  v_tip_producto tip_producto;
begin
  v_tip_direccion := tip_direccion (calle,
                                    poblacion,
                                    cp,
                                    provincia);
  v_tip_telefonos := tip_telefonos (telef1,
                                    telef2,
                                    telef3);
  v_tip_cliente := tip_cliente (idcliente,
                                nombre,
                                v_tip_direccion,
                                dni,
                                v_tip_telefonos);
  v_tip_producto := tip_producto (idproducto,
                                  descripcion,
                                  pvp,
                                  stockactual);
  v_tip_lineaventa := tip_lineaventa (numerolinea,
                                      v_tip_producto,
                                      cantidad);
  v_tip_lineas_venta := tip_lineas_venta (v_tip_lineaventa);

  -- this is the step you were missing
  v_tip_venta := tip_venta (id,
                            v_tip_cliente,
                            fechaventa,
                            v_tip_lineas_venta);

  insert into tabla_ventas 
  values (v_tip_venta);
end insertarventas;
/
注意:未经测试


好的,在对象类型描述中存在参照是导致问题的原因。但是,我认为没有必要使用REF(更不用说我无法解决如何使代码与它们一起工作!*{;-),因此这里是一个没有REF的工作测试用例:

drop procedure insertarventas;
drop table tabla_ventas;
drop type tip_venta;
drop type tip_lineas_venta;
drop type tip_lineaventa;
drop type tip_producto;
drop type tip_cliente;
drop type tip_telefonos;
drop type tip_direccion;

create type tip_direccion as object (calle varchar2(50),
                                     poblacion varchar2(50),
                                     codpostal number(5),
                                     provincia varchar2(40));

create type tip_telefonos as varray(3) of varchar2(15);

create type tip_cliente as object (idcliente number,
                                   nombre varchar2(50),
                                   direc tip_direccion,
                                   nif varchar2(9),
                                   telef tip_telefonos);

create type tip_producto as object (idproducto number,
                                    descripcion varchar2(80),
                                    pvp number,
                                    stockactual number);

create type tip_lineaventa as object (numerolinea number,
                                      idproducto tip_producto,
                                      cantidad number);

create type tip_lineas_venta as table of tip_lineaventa;

create type tip_venta as object (idventa number,
                                 idcliente tip_cliente,
                                 fechaventa date,
                                 lineas tip_lineas_venta);

create table tabla_ventas of tip_venta (idventa primary key)
  nested table lineas store as tabla_lineas;



create or replace procedure insertarventas (id number,
                                            idcliente number,
                                            nombre varchar2,
                                            calle varchar2,
                                            poblacion varchar2,
                                            cp number,
                                            provincia varchar2,
                                            dni varchar2,
                                            telef1 varchar2,
                                            telef2 varchar2,
                                            telef3 varchar2,
                                            fechaventa date,
                                            numerolinea number,
                                            idproducto number,
                                            descripcion varchar2,
                                            pvp number,
                                            stockactual number,
                                            cantidad number)
as
  v_tip_venta tip_venta;
  v_tip_cliente tip_cliente;
  v_tip_direccion tip_direccion;
  v_tip_telefonos tip_telefonos;
  v_tip_lineaventa tip_lineaventa;
  v_tip_lineas_venta tip_lineas_venta;
  v_tip_producto tip_producto;
begin
  v_tip_direccion := tip_direccion (calle,
                                    poblacion,
                                    cp,
                                    provincia);
  v_tip_telefonos := tip_telefonos (telef1,
                                    telef2,
                                    telef3);
  v_tip_cliente := tip_cliente (idcliente,
                                nombre,
                                v_tip_direccion,
                                dni,
                                v_tip_telefonos);

  v_tip_producto := tip_producto (idproducto,
                                  descripcion,
                                  pvp,
                                  stockactual);

  v_tip_lineaventa := tip_lineaventa (numerolinea,
                                      v_tip_producto,
                                      cantidad);

  v_tip_lineas_venta := tip_lineas_venta (v_tip_lineaventa);

  -- this is the step you were missing
  v_tip_venta := tip_venta (id,
                            v_tip_cliente,
                            fechaventa,
                            v_tip_lineas_venta);

  insert into tabla_ventas 
  values (v_tip_venta);
end insertarventas;
/

我认为问题在于,您试图在对象的表中插入非对象的内容

我将您的对象类型填充拆分为变量(而不是像您那样将它们嵌套在insert语句中),希望您能够看到实际要插入的内容:

create or replace procedure insertarventas (id number,
                                            idcliente number,
                                            nombre varchar2,
                                            calle varchar2,
                                            poblacion varchar2,
                                            cp number,
                                            provincia varchar2,
                                            dni varchar2,
                                            telef1 varchar2,
                                            telef2 varchar2,
                                            telef3 varchar2,
                                            fechaventa date,
                                            numerolinea number,
                                            idproducto number,
                                            descripcion varchar2,
                                            pvp number,
                                            stockactual number,
                                            cantidad number)
as
  v_tip_venta tip_venta;
  v_tip_cliente tip_cliente;
  v_tip_direccion tip_direccion;
  v_tip_telefonos tip_telefonos;
  v_tip_lineaventa tip_lineaventa;
  v_tip_lineas_venta tip_lineas_venta;
  v_tip_producto tip_producto;
begin
  v_tip_direccion := tip_direccion (calle,
                                    poblacion,
                                    cp,
                                    provincia);
  v_tip_telefonos := tip_telefonos (telef1,
                                    telef2,
                                    telef3);
  v_tip_cliente := tip_cliente (idcliente,
                                nombre,
                                v_tip_direccion,
                                dni,
                                v_tip_telefonos);
  v_tip_producto := tip_producto (idproducto,
                                  descripcion,
                                  pvp,
                                  stockactual);
  v_tip_lineaventa := tip_lineaventa (numerolinea,
                                      v_tip_producto,
                                      cantidad);
  v_tip_lineas_venta := tip_lineas_venta (v_tip_lineaventa);

  -- this is the step you were missing
  v_tip_venta := tip_venta (id,
                            v_tip_cliente,
                            fechaventa,
                            v_tip_lineas_venta);

  insert into tabla_ventas 
  values (v_tip_venta);
end insertarventas;
/
注意:未经测试


好的,在对象类型描述中存在REF是导致问题的原因。但是,我认为没有必要使用REF(更不用说我无法解决如何使代码与它们一起工作!*{;-),所以这里是一个没有REF的工作测试用例:

drop procedure insertarventas;
drop table tabla_ventas;
drop type tip_venta;
drop type tip_lineas_venta;
drop type tip_lineaventa;
drop type tip_producto;
drop type tip_cliente;
drop type tip_telefonos;
drop type tip_direccion;

create type tip_direccion as object (calle varchar2(50),
                                     poblacion varchar2(50),
                                     codpostal number(5),
                                     provincia varchar2(40));

create type tip_telefonos as varray(3) of varchar2(15);

create type tip_cliente as object (idcliente number,
                                   nombre varchar2(50),
                                   direc tip_direccion,
                                   nif varchar2(9),
                                   telef tip_telefonos);

create type tip_producto as object (idproducto number,
                                    descripcion varchar2(80),
                                    pvp number,
                                    stockactual number);

create type tip_lineaventa as object (numerolinea number,
                                      idproducto tip_producto,
                                      cantidad number);

create type tip_lineas_venta as table of tip_lineaventa;

create type tip_venta as object (idventa number,
                                 idcliente tip_cliente,
                                 fechaventa date,
                                 lineas tip_lineas_venta);

create table tabla_ventas of tip_venta (idventa primary key)
  nested table lineas store as tabla_lineas;



create or replace procedure insertarventas (id number,
                                            idcliente number,
                                            nombre varchar2,
                                            calle varchar2,
                                            poblacion varchar2,
                                            cp number,
                                            provincia varchar2,
                                            dni varchar2,
                                            telef1 varchar2,
                                            telef2 varchar2,
                                            telef3 varchar2,
                                            fechaventa date,
                                            numerolinea number,
                                            idproducto number,
                                            descripcion varchar2,
                                            pvp number,
                                            stockactual number,
                                            cantidad number)
as
  v_tip_venta tip_venta;
  v_tip_cliente tip_cliente;
  v_tip_direccion tip_direccion;
  v_tip_telefonos tip_telefonos;
  v_tip_lineaventa tip_lineaventa;
  v_tip_lineas_venta tip_lineas_venta;
  v_tip_producto tip_producto;
begin
  v_tip_direccion := tip_direccion (calle,
                                    poblacion,
                                    cp,
                                    provincia);
  v_tip_telefonos := tip_telefonos (telef1,
                                    telef2,
                                    telef3);
  v_tip_cliente := tip_cliente (idcliente,
                                nombre,
                                v_tip_direccion,
                                dni,
                                v_tip_telefonos);

  v_tip_producto := tip_producto (idproducto,
                                  descripcion,
                                  pvp,
                                  stockactual);

  v_tip_lineaventa := tip_lineaventa (numerolinea,
                                      v_tip_producto,
                                      cantidad);

  v_tip_lineas_venta := tip_lineas_venta (v_tip_lineaventa);

  -- this is the step you were missing
  v_tip_venta := tip_venta (id,
                            v_tip_cliente,
                            fechaventa,
                            v_tip_lineas_venta);

  insert into tabla_ventas 
  values (v_tip_venta);
end insertarventas;
/

忽略的
PL/SQL:SQL语句
消息通常只是错误堆栈的顶部,下面的一行将指示实际问题是什么

将对象创建语句解开,并按顺序将它们全部编译(并修复了至少一个拼写错误,并猜测一个悬垂的逗号也是一个拼写错误),创建过程得到:

LINE/COL ERROR
-------- ------------------------------------
4/1      PL/SQL: SQL Statement ignored
4/13     PL/SQL: ORA-00947: not enough values
您已经用五个字段定义了TIP_VENTA:

CREATE TYPE TIP_VENTA AS OBJECT(
  IDVENTA NUMBER,
  IDCLIENTE REF TIP_CLIENTE,
  FECHAVENTA DATE,
  LINEAS TIP_LINEAS_VENTA,
  CANTIDAD NUMBER
);
但是在插入过程中创建的对象只有四个值(重新格式化以使其更可读):

TIP\u LINEAS\u VENTA()
构造函数调用中有
cantidad
,而不是在它之后:

INSERT INTO TABLA_VENTAS VALUES (
  ID,
  TIP_CLIENTE(
    IDCliente,
    nombre, 
    TIP_DIRECCION(calle, poblacion, cp, provincia),
    dni,
    TIP_TELEFONOS(telef1, telef2, telef3)
  ),
  fechaventa, 
  TIP_LINEAS_VENTA(
    numerolinea,
    TIP_PRODUCTO(IDProducto, descripcion, pvp, stockactual)
  ),
  cantidad
);
但现在情况是:

LINE/COL ERROR
-------- ------------------------------------------------------------------
9/1      PL/SQL: SQL Statement ignored
20/5     PL/SQL: ORA-00932: inconsistent datatypes: expected UDT got NUMBER
TIP_文塔的第四个字段是类型TIP_LINEAS_文塔,因此您需要在该表构造函数中有一个TIP_LINEAVENTA:

  TIP_LINEAS_VENTA(
    TIP_LINEAVENTA(
      numerolinea,
      TIP_PRODUCTO(IDProducto, descripcion, pvp, stockactual)
    )
然后得到:

LINE/COL ERROR
-------- -----------------------------------------------------------------------------------------------------------------
9/1      PL/SQL: SQL Statement ignored
22/7     PL/SQL: ORA-00932: inconsistent datatypes: expected X.TIP_PRODUCTO got REF X.TIP_PRODUCTO

…因为您使用的是实际对象,而不是其他类型定义所期望的引用。您需要决定是使它们成为实际对象还是修复引用…

忽略的
PL/SQL:SQL语句
消息通常只是错误堆栈的顶部,下面的一行将指示实际问题是什么

将对象创建语句解开,并按顺序将它们全部编译(并修复了至少一个拼写错误,并猜测一个悬垂的逗号也是一个拼写错误),创建过程得到:

LINE/COL ERROR
-------- ------------------------------------
4/1      PL/SQL: SQL Statement ignored
4/13     PL/SQL: ORA-00947: not enough values
您已经用五个字段定义了TIP_VENTA:

CREATE TYPE TIP_VENTA AS OBJECT(
  IDVENTA NUMBER,
  IDCLIENTE REF TIP_CLIENTE,
  FECHAVENTA DATE,
  LINEAS TIP_LINEAS_VENTA,
  CANTIDAD NUMBER
);
但是在插入过程中创建的对象只有四个值(重新格式化以使其更可读):

TIP\u LINEAS\u VENTA()
构造函数调用中有
cantidad
,而不是在它之后:

INSERT INTO TABLA_VENTAS VALUES (
  ID,
  TIP_CLIENTE(
    IDCliente,
    nombre, 
    TIP_DIRECCION(calle, poblacion, cp, provincia),
    dni,
    TIP_TELEFONOS(telef1, telef2, telef3)
  ),
  fechaventa, 
  TIP_LINEAS_VENTA(
    numerolinea,
    TIP_PRODUCTO(IDProducto, descripcion, pvp, stockactual)
  ),
  cantidad
);
但现在情况是:

LINE/COL ERROR
-------- ------------------------------------------------------------------
9/1      PL/SQL: SQL Statement ignored
20/5     PL/SQL: ORA-00932: inconsistent datatypes: expected UDT got NUMBER
TIP_文塔的第四个字段是类型TIP_LINEAS_文塔,因此您需要在该表构造函数中有一个TIP_LINEAVENTA:

  TIP_LINEAS_VENTA(
    TIP_LINEAVENTA(
      numerolinea,
      TIP_PRODUCTO(IDProducto, descripcion, pvp, stockactual)
    )
然后得到:

LINE/COL ERROR
-------- -----------------------------------------------------------------------------------------------------------------
9/1      PL/SQL: SQL Statement ignored
22/7     PL/SQL: ORA-00932: inconsistent datatypes: expected X.TIP_PRODUCTO got REF X.TIP_PRODUCTO


…因为您使用的是实际对象,而不是其他类型定义所期望的引用。您需要决定是使它们成为实际对象还是修复引用…

(1)我认为括号不平衡。(2)使用
insert
@cjgmj时,您应该包括列列表出于好奇,为什么使用这种嵌套表方法?这将使查询数据比使用更传统的关系表设计更加困难。@Gordon Linoff括号是平衡的,列在第三个括号中part@cjgmj我我不是嵌套表方面的专家,但让我吃惊的是,您已经将表定义为TIP_VENTA的对象,因此当您插入到其中时,您可能需要插入一些同样也是TIP_VENTA对象的内容。Gordon所说的列列表的意思是,您通常会执行插入操作,如:
insert into table()value()
@cjgmj难对付的类!*{;-)(1)我认为括号不平衡使用
insert
@cjgmj时,您应该包括列列表出于好奇,为什么使用这种嵌套表方法?这将使查询数据比使用更传统的关系表设计更加困难。@Gordon Linoff括号是平衡的,列在第三个括号中part@cjgmj我我不是嵌套表方面的专家,但让我吃惊的是,您已经将表定义为TIP_VENTA的对象,因此当您插入到其中时,您可能需要插入一些同样也是TIP_VENTA对象的内容。Gordon所说的列列表的意思是,您通常会执行插入操作,如:
insert into table()value()
@cjgmj-tough class!*{;-)它给了我这个错误:第43行的错误:PLS-00306:调用'TIP_LINEAS_VENTA'时参数的数量或类型错误@cjgmj-Hmm,在您的创建表代码中,您有一个TIP_LINEAVENTA的创建类型,但没有一个TIP_LINEAS_VENTA的创建类型;哪一个是正确的对象类型名称?(我引用了您在原始程序中使用的程序)我只是看到创建类型TIP_LINEAS_VENTA作为TIP_LINEAVENTA;,然后我认为它是相同的否?啊,我错过了。在这种情况下,您需要在将记录插入v_TIP_LINEAS_VENTA之前定义它。我相应地更新了我的答案。它再次给我这个错误:第44行的错误:PLS-00306:错误的参数数量或类型在呼叫“TIP_LINEAVENTA”时,请告诉我以下错误:第43行错误:PLS-00306:错误