Arti kesalahannya cukup jelas:jika kita memanggil fungsi dari pernyataan SELECT, itu tidak dapat mengeksekusi pernyataan DML, yaitu INSERT, UPDATE atau DELETE, atau memang pernyataan DDL datang ke sana.
Sekarang, potongan kode yang telah Anda posting berisi panggilan ke PIPE ROW, jadi Anda menyebutnya sebagai SELECT * FROM TABLE(). Tapi itu termasuk pernyataan DELETE dan INSERT dengan sangat jelas sehingga tidak memenuhi tingkat kemurnian yang diperlukan untuk fungsi dalam pernyataan SELECT.
Jadi, Anda perlu menghapus pernyataan DML tersebut. Anda menggunakannya untuk mengisi tabel sementara global, tetapi ini adalah kabar baik. Anda belum memasukkan kode apa pun yang benar-benar menggunakan GTT sehingga sulit untuk memastikannya, tetapi menggunakan GTT seringkali tidak diperlukan. Dengan detail lebih lanjut, kami dapat menyarankan solusi.
Apakah ini terkait dengan pertanyaan Anda yang lain ini ? Jika demikian, apakah Anda mengikuti saran saya untuk memeriksa jawaban yang saya berikan untuk pertanyaan serupa ?
Demi kelengkapan, dimungkinkan untuk menyertakan pernyataan DML dan DDL dalam fungsi yang disebut dalam pernyataan SELECT. Solusinya adalah dengan menggunakan pragma AUTONOMOUS_TRANSACTION. Ini jarang merupakan ide yang bagus, dan tentu saja tidak akan membantu dalam skenario ini. Karena transaksi bersifat otonom, perubahan yang dibuatnya tidak terlihat oleh transaksi pemanggilan. Artinya dalam hal ini fungsi tidak dapat melihat hasil penghapusan atau penyisipan di GTT.