per fare una lunga storia breve mi propongo di discutere il codice che vedi qui sotto.Oracle 12 ha problemi con i tipi di raccolta locali in SQL?
Quando si esegue esso:
Oracle 11 compilatore genera
"PLS-00306: numero errato o tipi di argomenti suggerimenti in chiamata a 'PIPE_TABLE'"
"PLS -00642: Tipi di raccolta locali non consentiti nell'istruzione SQL "
Oracle 12 compila il seguente pacchetto con tali avvertimenti, ma abbiamo una sorpresa in runtime
durante l'esecuzione del blocco anonimo come è - tutto va bene (potremmo tubo di alcune righe nella funzione
pipe_table
- doesn 't effetto)ora diamo il commento dalla riga con
hello;
o mettere lì una chiamata a qualsiasi procedura, ed eseguire il blocco anonumous cambiato di nuovo otteniamo "oRA-22163: la mano sinistra e collezioni lato destro non sono dello stesso tipo"
E la domanda è: Ha Oracle 12 permette tipi di raccolta locali in SQL? Se sì allora cosa c'è di sbagliato con il codice di PACKAGE buggy_report
?
CREATE OR REPLACE PACKAGE buggy_report IS
SUBTYPE t_id IS NUMBER(10);
TYPE t_id_table IS TABLE OF t_id;
TYPE t_info_rec IS RECORD (first NUMBER);
TYPE t_info_table IS TABLE OF t_info_rec;
TYPE t_info_cur IS REF CURSOR RETURN t_info_rec;
FUNCTION pipe_table(p t_id_table) RETURN t_info_table PIPELINED;
FUNCTION get_cursor RETURN t_info_cur;
END buggy_report;
/
CREATE OR REPLACE PACKAGE BODY buggy_report IS
FUNCTION pipe_table(p t_id_table) RETURN t_info_table PIPELINED IS
l_table t_id_table;
BEGIN
l_table := p;
END;
FUNCTION get_cursor RETURN t_info_cur IS
l_table t_id_table;
l_result t_info_cur;
BEGIN
OPEN l_result FOR SELECT * FROM TABLE (buggy_report.pipe_table(l_table));
RETURN l_result;
END;
END;
/
DECLARE
l_cur buggy_report.t_info_cur;
l_rec l_cur%ROWTYPE;
PROCEDURE hello IS BEGIN NULL; END;
BEGIN
l_cur := buggy_report.get_cursor();
-- hello;
LOOP
FETCH l_cur INTO l_rec;
EXIT WHEN l_cur%NOTFOUND;
END LOOP;
CLOSE l_cur;
dbms_output.put_line('success');
END;
/
Gli esempi includono due funzionalità Oracle insolite: raccolte locali e funzioni pipeline. Potrebbe essere altrettanto valido dire "Oracle ha un bug con le funzioni pipeline". Nella mia esperienza, le implementazioni che utilizzano le funzioni pipeline di solito avranno comunque problemi; a causa di bug Oracle o a causa delle limitazioni dell'elaborazione riga per fila. –