2010-01-15 1 views
1

이 유형은 다음과 같이 생성했습니다. PROD_OBJ 유형으로 PRODTABLE을 만들거나 바꾸십시오.중첩 테이블의 요소 속성 업데이트

나는 추적의 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과 같게 만드는 것 같습니다. 잘 모르겠습니다. 누군가 날 기쁘게 할 수 있니?

감사합니다.

답변

1

IN 매개 변수로 선언되어 할당 대상으로 사용할 수 없으므로 a_prodArray을 수정할 수 없습니다. 당신이 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 유형이라고 가정하고 newList를 PRODTABLE (그리고 PLSQL 유형 nestedTable 아님)으로 선언해야합니다.