-2

質問:

一度に設定される操作とは何ですか? また、アプリケーション プログラムで一連のデータを処理する必要があるのはどのような状況ですか?

乾杯。

4

1 に答える 1

1

関連するすべてのデータが Oracle データベースにある場合、処理に手続き型コードは必要ありません。

Oracle SQL には、インライン ビュー、分析関数、MODEL句、WITH句など、データを処理するための多くの方法があります。これらを組み合わせることで、プログラミングの問題を解決できます。これは、必ずしもすべてを 1 つの SQL ステートメントで実行する必要があるという意味ではありません。これらの機能に慣れてくると、SQL ステートメントはより大きく高速になり、全体的なコード量は少なくなります。しかし、通常の古い手続き型コードの方が理にかなっている点が常にあります。


元のステートメントは部分的に正しいです。「カーソルは、DBMS の「一度に設定するプロセス」で機能します。」通常、カーソルを使用した行単位の処理は、セットベースの処理とは逆です。しかし、オラクルは、プロセスの一部をセットベースにするために、いくつかのことを行うことができます。

たとえば、EMPLOYEE テーブルと DEPARTMENT テーブルを結合して結果を出力するこの単純なコードを見てください。

begin
    for employee_and_departments in
    (
        select employee.employee_name, department.department_name
        from employee
        join department
            on employee.department_id = department.department_id
        order by employee_name
    ) loop
        dbms_output.put_line(employee.employee_name||', '||
            department.department_name);
    end loop;
end;
/

これは匿名ブロックの処理方法ではありません。

For each row:
    1) Use index to retrieve one employee record, in order
    2) Use index to lookup relevant row in department record
    3) return one row
    4) print one result

詳細は実行計画によって異なりますが、これは無名ブロックを処理する可能性が高い方法です。

1) Hash the department table and store it in memory
2) Join it with employee table
3) Order results
4) Retrieve 100 rows at a time, and for each row:
    4a) Print one result

SQL 操作とデータ取得は、要求されていない場合でも、頻繁に一括で実行されます。ステートメントの一部は引き続き行ごとに実行されますが、ほとんどの重い作業はバッチで自動的に実行されます。手続き型 PL/SQL を宣言型 SQL に変換する場合、大幅な改善の余地がまだあります。しかし、多くのコードは、知らないうちにセットベースの処理の恩恵を受けています。

于 2014-10-18T22:59:24.037 に答える