2009-05-22 23 views
6

ecco la procedura memorizzata che ho scritto.In questo processo "p_subjectid" è una matrice di numeri passati dal front-end.Errore Oracle ORA-22905: impossibile accedere alle righe da un elemento di tabella non annidato

PROCEDURE getsubjects(p_subjectid subjectid_tab,p_subjects out refCursor) 
     as 

     BEGIN 

      open p_subjects for select * from empsubject where subject_id in 
      (select column_value from table(p_subjectid)); 
      --select * from table(cast(p_subjectid as packg.subjectid_tab)) 
     END getsubjects; 

Questo è l'errore che sto ottenendo.

Oracle error ORA-22905: cannot access rows from a non-nested table item OR 

come ho visto in diversi post, ho provato gettando "cast (p_subjectid come packg.subjectid_tab)" dentro la funzione tabella come riportato nel commento below.But sto ottenendo un altro errore: ORA-00902: invalid datatype.

E questa è la definizione di "subjectid_tab".

type subjectid_tab is table of number index by binary_integer; 

Qualcuno può dirmi qual è il nulla error.Is sbagliato con la mia procedura.

risposta

10

si deve dichiarare il tipo sul "livello di database", come suggerito ammoQ:

CREATE TYPE subjectid_tab AS TABLE OF NUMBER INDEX BY binary_integer; 

invece di dichiarare il tipo all'interno di PL/SQL. Se si dichiara il tipo solo nel blocco PL/SQL, non sarà disponibile per il "motore" SQL.

+0

Questo non funziona in Oracle 11g, nel caso in cui qualcun altro stia lottando. PLS-00355: Uso della tabella pl/sql non definita in questo contesto. Tutto sembra a posto in Oracle 12c. Come un aggiramento in 11g, se si può legare solo ad array associativi (come nodejs), ho fatto il loop del mio array associativo in una tabella annidata (senza suffisso INDICE BY) prima; che uccide la performance, ma cosa puoi fare? Se qualcuno conosce un modo migliore, non esitare a contattarci. –

4

Penso che non sia possibile usare la tabella() su una tabella di numeri; deve essere una tabella di oggetti.

+0

Quindi come utilizzare la clausola 'IN' con la tabella dei numeri –

+2

Prova questo: "CREATE TYPE subjectid_tab COME TABELLA INDICE NUMBER BY binary_integer;" invece di dichiarare il tipo in PL/SQL. –

+0

grazie per il tuo suggerimento.Ma ho dichiarato che il tipo nella mia specifica del pacchetto come tipo subjectid_tab è la tabella di indice numero di binary_integer; –

1

si devono lanciare i risultati della query pipeline così:

Se la funzione di pipeline restituisce un rowtype di varchar2 quindi definire un tipo (per esempio)

creare o sostituire TYPE char_array_t è VARRAY (32) di varchar2 (255); seleziona * dalla tabella (cast (fn (x) come user_type_t));

ora funzionerà.

1

Ho appena avuto questo problema ieri.

 
DECLARE 
    TYPE number_table IS TABLE OF NUMBER; 
    result_ids number_table := number_table(); 
BEGIN 
    /* .. bunch of code that uses my type successfully */ 

    OPEN ? AS 
    SELECT * 
    FROM TABLE(CAST(result_ids AS number_table)); /* BOOM! */ 
END; 

Questo fallisce in entrambi i modi descritti in precedenza quando chiamati da una routine java. Ho scoperto che ciò era dovuto al fatto che il tipo numero_table non è definito in modo esportabile rispetto a quello che può essere spedito dal database. Il tipo funziona alla grande internamente alla routine. Ma non appena si tenta di eseguire un recordset restituibile che ne faccia riferimento in qualsiasi modo (incluse le clausole IN?!?) Si ottiene un tipo di dati non definito.

Quindi la soluzione è davvero CREATE TYPE myschema.number_table È TABLE OF NUMBER; Quindi rilasciare la dichiarazione del tipo dal blocco e utilizzare la dichiarazione del livello dello schema. Utilizza il qualificatore dello schema per fare riferimento al tipo solo per essere sicuro di utilizzare quello giusto.

2

Questa è la soluzione migliore. Non è possibile utilizzare una tabella (cast()) se il tipo che si esegue il cast si trova nella parte DECLARE del blocco pl/sql. È DAVVERO necessario utilizzare CREATE TYPE my_type [...]. In caso contrario, genererà l'eccezione "impossibile recuperare la riga [...]".

Problemi correlati