PL/SQL - カーソル:データ操作のゲートウェイ
こんにちは、未来のデータ魔术師たち!今日は、PL/SQLのカーソルの世界に興味深く飛び込んでみましょう。プログラミングが初めてであっても心配しないでください。私はあなたの親切なガイドとして、このトピックをステップバイステップで探求します。このチュートリアルの終わりには、プロのようにカーソルを操ることができるようになるでしょう!
カーソルとは?
まず、カーソルとは何かを理解しましょう。比如、ビュッフェ(お腹が空いたかもしれませんね!)にいるとしましょう。あなたにはプレート(あなたのプログラム)があり、美味しい料理(あなたのデータベーステーブル)が目の前にあります。カーソルはあなたの手のようなものです。ビュッフェから特定のアイテムを選んでプレートに載せるのを助けます。データベースの言葉では、カーソルはデータベースからデータを一行ずつ取得して操作することを可能にします。
それでは、PL/SQLにおける2つのカーソルの種類を見てみましょう。
暗黙的なカーソル
暗黙的なカーソルは、スマートフォンカメラの自動機能のようなものです。背景で動作して、あなたが太多いことをする必要はありません。Oracleは、SQL文を実行するときにこれらのカーソルを作成し、管理します。
以下に例を示します:
BEGIN
UPDATE employees SET salary = salary * 1.1 WHERE department_id = 20;
IF SQL%FOUND THEN
DBMS_OUTPUT.PUT_LINE('従業員に10%の賃金アップがされました!');
ELSE
DBMS_OUTPUT.PUT_LINE('部署20に従業員がいません。');
END IF;
END;
/
このコードでは:
- 部署20の従業員の給料を10%増加させます。
-
SQL%FOUND
は暗黙的なカーソルの属性で、UPDATEが行に影響を与えた場合にTRUEを返します。 - これを使って適切なメッセージを表示します。
他にも便利な暗黙的なカーソルの属性があります:
-
SQL%ROWCOUNT
:影響を受けた行数 -
SQL%ISOPEN
:常にFALSEを返します(暗黙的なカーソルの場合) -
SQL%NOTFOUND
:SQL%FOUND
の反対
明示的なカーソル
明示的なカーソルは、カメラのマニュアルモードのようなものです。あなたはより多くの制御を持ちますが、自分で管理する必要があります。行を一つずつ処理する必要があるときや、データ取得プロセスに対してより多くの制御をしたいときに最適です。
明示的なカーソルのライフサイクルを分解してみましょう。
カーソルの宣言
まず、PL/SQLブロックがどのデータで作業を行うかを決定します。これは、ビュッフェで何を食べたいかを決める前にプレートを満たすようなものです。
DECLARE
CURSOR c_emp IS
SELECT employee_id, first_name, last_name
FROM employees
WHERE department_id = 30;
ここでは、部署30の従業員の詳細を取得するカーソルc_emp
を宣言しました。
カーソルの開き
次に、ビュッフェに近づく(または、私たちの場合はデータベースに近づく)ときです。
OPEN c_emp;
この行は、OracleにSELECT文を実行し、結果セットを準備するように指示します。
カーソルの取得
これは、実際にプレートに食べ物を載せる(または、プログラミング用語では、データを行ごとに取得する)場所です。
DECLARE
v_emp_id employees.employee_id%TYPE;
v_first_name employees.first_name%TYPE;
v_last_name employees.last_name%TYPE;
BEGIN
OPEN c_emp;
LOOP
FETCH c_emp INTO v_emp_id, v_first_name, v_last_name;
EXIT WHEN c_emp%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_emp_id || ' - ' || v_first_name || ' ' || v_last_name);
END LOOP;
CLOSE c_emp;
END;
/
この例では:
- データを保持するための変数を宣言します。
- カーソルを開きます。
- ループを使用して行を一つずつ取得します。
- もう行がない場合(c_emp%NOTFOUND)にループを終了します。
- 各従業員の詳細を表示します。
カーソルの閉じ
ビュッフェを楽しめた後、プレートを返すように、カーソルを閉じます。
CLOSE c_emp;
これは、カーソルに関連するリソースを解放します。
カーソルFORループ:ショートカット
さて、カーソルをさらに簡単に操作する方法を教えます。それがカーソルFORループです。これは、ビュッフェで親切な友達があなたのプレートを満たしてくれるようなものです!
BEGIN
FOR emp_rec IN (SELECT employee_id, first_name, last_name
FROM employees
WHERE department_id = 30) LOOP
DBMS_OUTPUT.PUT_LINE(emp_rec.employee_id || ' - ' ||
emp_rec.first_name || ' ' ||
emp_rec.last_name);
END LOOP;
END;
/
この魔法のループはすべての作業をあなたの代わりに行います:
- 行を保持するための記録変数(
emp_rec
)を宣言します。 - カーソルを開き、各行を取得し、カーソルを閉じる操作を自動的に行います。
- ループ内で各行に対して何をすべきかだけに集中します。
カーソルメソッド:あなたのハンディツールキット
カーソルで使用できるメソッドを整理した表を以下に示します:
メソッド | 説明 |
---|---|
DECLARE | カーソルとそのSELECT文を定義 |
OPEN | SELECT文を実行し、結果セットを準備 |
FETCH | 結果セットの次の行を取得 |
CLOSE | カーソルを閉じ、リソースを解放 |
忘れないでください、力とともに責任も伴います。カーソルを使用が終わったら、必ずカーソルを閉じてリソースを解放してください!
そして、ここまでで、亲爱的な学生们!あなたはPL/SQLカーソルの世界への第一歩を踏み出しました。これらの概念を練習し、さまざまなシナリオを試してみてください。間もなく、熟練したプログラマーのようにデータベースをナビゲートするスキルを身につけるでしょう。
覚えておいてください、プログラミングにおいても人生においても、鍵は学びと実験を続けることです。それでは、コードを書き、間違えを犯し、最も重要なことは、楽しむことです!誰 knows? 次の偉大なデータベースアプリケーションがあなたの手元にあるかもしれません。ハッピーコーディング!
Credits: Image by storyset