2010-01-15 46 views
1

我已经创建此类型: 创建或替换类型PRODTABLE作为PROD_OBJ表;更新嵌套表中元素的属性

,我使用PRODTABLE在后续PLSQL代码:

FUNCTION INSERT_PRODUCTS (

     a_supplier_id IN FORNECEDOR.ID_FORNECEDOR%TYPE, 

     a_prodArray IN PRODTABLE 

    ) 

    RETURN NUMBER IS 

     v_error_code NUMBER; 
     v_error_message VARCHAR2(255); 
     v_result  NUMBER:= 0; 
     v_prod_id  PRODUTO.ID_PROD%TYPE; 
     v_supplier  FORNECEDOR%ROWTYPE; 
     v_prodInserted PROD_OBJ; 
     type nestedTable is table of PROD_OBJ; 
     newList nestedTable := nestedTable(); 

    BEGIN 

    SELECT FORNEC_OBJ(ID_FORNECEDOR,NOME_FORNECEDOR,MORADA,ARMAZEM,EMAIL,TLF,TLM,FAX) into v_supplier from fornecedor where id_fornecedor = a_supplier_id; 

     FOR i IN a_prodArray.FIRST .. a_prodArray.LAST LOOP 

      INSERT INTO PRODUTO (PRODUTO.ID_PROD,PRODUTO.NOME_PROD,PRODUTO.PREC_COMPRA_PROD,PRODUTO.IVA_PROD,PRODUTO.PREC_VENDA_PROD,PRODUTO.QTD_STOCK_PROD,PRODUTO.QTD_STOCK_MIN_PROD) 
      VALUES (S_PRODUTO.nextval,a_prodArray(i).NOME_PROD,a_prodArray(i).PREC_COMPRA_PROD,a_prodArray(i).IVA_PROD,NULL,NULL,NULL); 

      SELECT ID_PROD into v_prod_id from PRODUTO where NOME_PROD = a_prodArray(i).NOME_PROD; 

      INSERT INTO PROD_FORNECIDO VALUES (a_supplier_id, v_prod_id,a_prodArray(i).PREC_COMPRA_PROD); 

      SELECT PROD_OBJ(ID_PROD,NOME_PROD,PREC_COMPRA_PROD,PREC_VENDA_PROD,QTD_STOCK_PROD,QTD_STOCK_MIN_PROD,IVA_PROD) into v_prodInserted from PRODUTO where ID_PROD= v_prod_id; 
      newList.extend; 
      newList(newList.last):= v_prodinserted; 

     END LOOP; 

     /*the next line generates Error(43,63): PLS-00642: local collection types not  allowed in SQL statements, 
Error(43,63): PL/SQL: ORA-00932: inconsistent datatypes: expected UDT got CHAR */ 
     INSERT INTO FORNECPRODS2 VALUES (a_supplier_id,v_supplier,newList); 
     v_result:= 1; 
     RETURN v_result; 
     COMMIT; 
    (...) 
    END; 

我想这样做a_prodArray(i):= v_prodInserted,但我不能,因为它是一个嵌套表,所以我需要检索另一个使用在那里插入或用新插入的产品更新嵌套表的每个元素。我必须这样做,因为PRODTABLE中的每个prod_obj都带有来自JAVA的id = 0。 也许还有另一种方法,比如让主键的默认值等于SEQUENCE.nextval,我不知道。有人能请我照看吗?

谢谢!

回答

1

您将无法修改a_prodArray,因为它被声明为参数IN(因此不能用作分配目标)。如果声明的参数作为IN OUT,转让成功:

SQL> CREATE TYPE PROD_OBJ AS OBJECT 
    2 (
    3  ID_PROD NUMBER, 
    4  NOME_PROD VARCHAR2(1) 
    5 ) 
    6 ; 
    7/ 
Type created 

SQL> CREATE TYPE PRODTABLE as table of PROD_OBJ; 
    2/ 
Type created 

SQL> CREATE FUNCTION INSERT_PRODUCTS(a_prodArray IN OUT PRODTABLE) 
    2  RETURN NUMBER IS 
    3 BEGIN 
    4  a_prodArray(1) := prod_obj(1, NULL); 
    5  RETURN 0; 
    6 END; 
    7/ 
Function created 

SQL> DECLARE 
    2  l_prod_table prodtable := prodtable(); 
    3  dummy NUMBER; 
    4 BEGIN 
    5  l_prod_table.extend(); 
    6  dummy := INSERT_PRODUCTS(l_prod_table); 
    7 END; 
    8/ 
PL/SQL procedure successfully completed 

现在的PLS-00642错误,你必须使用精确相同的数据类型表的定义。在这种情况下,我想这个类型是PRODTABLE SQL Type,你必须声明newList为PRODTABLE(而不是PLSQL类型nestedTable)。