エラーの意味は非常に明確です。SELECTステートメントから関数を呼び出すと、DMLステートメント、つまりINSERT、UPDATE、またはDELETEを実行できないか、実際にDDLステートメントがそれになります。
これで、投稿したコードのスニペットにPIPE ROWの呼び出しが含まれているため、これをSELECT * FROM TABLE()と呼んでいます。ただし、DELETEステートメントとINSERTステートメントが含まれているため、SELECTステートメントの関数に必要な純度レベルに違反していることは明らかです。
したがって、これらのDMLステートメントを削除する必要があります。それらを使用してグローバル一時テーブルにデータを入力していますが、これは朗報です。実際にGTTを使用するコードが含まれていないため、確認するのは困難ですが、GTTを使用する必要がない場合がよくあります。詳細については、回避策を提案できます。
これは
完全を期すために、SELECTステートメントで呼び出される関数にDMLステートメントとDDLステートメントを含めることができます。回避策は、AUTONOMOUS_TRANSACTIONプラグマを使用することです。これが良い考えになることはめったになく、このシナリオでは確かに役に立ちません。トランザクションは自律的であるため、トランザクションが行う変更は呼び出し元のトランザクションからは見えません。この場合、関数はGTTでの削除または挿入の結果を確認できないことを意味します。