我创建了这种类型: 创建或替换类型PRODTABLE作为PROD_OBJ的表;
我在以下PLSQL代码中使用了PRODTABLE:
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,我不知道。有人可以邀请我吗?
谢谢!
答案 0 :(得分: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
错误,您必须使用 EXACT 相同的数据类型作为表的定义。在这种情况下,我认为类型是PRODTABLE
SQL类型,您必须将newList声明为PRODTABLE
(而不是PLSQL类型nestedTable
)。