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

时间:2016-01-28 17:14:16

标签: 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, 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;
    );

导致此错误的原因是什么?如何解决?

2 个答案:

答案 0 :(得分:2)

PL/SQL: SQL Statement ignored消息通常只是错误堆栈的顶部,下一行将指出实际问题是什么。

解开你的对象创建语句并按顺序让它们全部编译(并修复至少一个错字,并猜测悬空逗号也是一个错字),创建你的程序得到:

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
);

但是在插入过程中创建的对象只有四个值(重新格式化以使其更具可读性):

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
  )
);

cantidad构造函数调用中有TIP_LINEAS_VENTA(),而不是之后:

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_VENTA的第四个字段是TIP_LINEAS_VENTA类型,因此你需要在表格构造函数中有一个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

...因为您正在使用实际对象而不是REF,正如其他类型定义所期望的那样。您需要决定是将它们作为实际对象还是修复REF ......

答案 1 :(得分:1)

我认为问题在于您尝试在对象表中插入不是对象的内容。

我已将您的对象类型群体拆分为变量(而不是将它们嵌套在insert语句中),这有助于您查看实际尝试插入的内容:< / p>

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;
/

N.B。未经测试。

好的,对象类型描述中存在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;
/