2016-01-28 70 views
0

我有以下的小功能無法編譯:如何解決這個「SQL語句忽略」錯誤?

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

(1)我認爲括號不平衡。 (2)使用'insert'時應該包含列表列表。 –

+1

@cjgmj出於好奇,爲什麼你用這種嵌套表方法?它將會比查看更傳統的關係表設計更難以查詢數據。 – Boneist

+0

@Gordon Linoff括號是平衡的,列在第三部分 – cjgmj

回答

1

我認爲問題在於你試圖插入一個對象的表中,而不是一個對象。

我已經打出了對象類型的人羣到變量(而不是讓他們嵌套像你一樣插入語句內),它希望讓你看到它是什麼你實際上是試圖插入:

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

NB未經測試。


好的,對象類型描述中存在的REFs是導致問題的原因。然而,我不認爲有必要使用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; 
/
+0

它給了我這個錯誤: 錯誤在第43行:PLS-00306:調用'TIP_LINEAS_VENTA'時參數的錯誤數量或類型 – cjgmj

+0

@cjgmj嗯,在你創建的表代碼中,你有一個創建輸入TIP_LINEAVENTA,但不輸入TIP_LINEAS_VENTA;哪一個是正確的對象類型名稱? (我引用了你在原始程序中使用的那個) – Boneist

+0

我只看到 CREATE TYPE TIP_LINEAS_VENTA AS TABLE TIP_LINEAVENTA; ,那麼我認爲它是一樣的沒有? – cjgmj

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

你有cantidadTIP_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 ...