sql >> データベース >  >> RDS >> Oracle

Oracleのselectステートメントでストアドプロシージャを実行できないのはなぜですか?強い理由はありますか?

    宣言型プログラミングスタイルと命令型プログラミングスタイルを混在させると混乱するため、SQLステートメントでのプロシージャは許可されていません。

    SQLステートメントは条件のリストです。これらの条件に一致する結果セットを生成する方法を決定するのはOracle次第です。 PL / SQLストアド・プロシージャは、非常に予測可能な方法で物事を変更する一連の命令です。

    以下の例では、prを何回行う必要がありますか 処刑されますか? id = 1の前または後に実行されますか ? SQLステートメントに事前定義された順序がある場合、オプティマイザーは述語をプッシュしたり、サブクエリをマージしたりすることができず、パフォーマンスは許容できません。

    select *
    from table1
    where id = 1
        and pr;
    

    selectでプロシージャが使用された場合でも リスト、それは意味をなさないかもしれません。たとえば、select exists内のリスト 常に無視されます。

    select * from dual where exists (select pr from dual);
    

    しかし実際には、SQLステートメントは外部と対話する必要がある場合があり、いくつかの手続き型ロジックが必要です。関数は通常で許可されます 何かを計算して値を返すだけです。通常、関数はプログラムの状態に依存せず、多くの副作用があります。あなたの機能はできた セッション変数を使用し、テーブルを更新します(PRAGMA AUTONOMOUS TRANSACTIONに設定されている場合) )、コンテキストを設定するなど。Oracleはこれらの処理を停止することはできませんが、SQLステートメントでプロシージャを許可しないと、少なくともそのようなコードは推奨されません。



    1. GroupBy句を使用した条件付き集計

    2. SCDタイプ1

    3. MariaDBでのWEEK()のしくみ

    4. MSSQLの自己参照制約