Oracleエンジニアを目指す
ORACLE MASTER Gold ポイント解説
第2回 PL/SQLの基本を学ぶ

小野寺智子
2002/1/31

 今回は、ORACLE MASTER Gold(以下、Gold)の取得に必要な「PL/SQL」と「DBA」の2科目のうち、PL/SQLの概要、変数の宣言、実行文の作成のポイントを解説します。なお、Goldに含まれるPL/SQLの範囲には、データベーストリガやストアードファンクションは含まれません。

■PL/SQLの概要

 PL/SQLは、Procedural Language/SQLの略で、オラクルが提供するSQLの拡張型言語です。このPL/SQLでは、SQLのほか、変数(データ)、制御構造、例外処理(エラー処理)の機能を提供しています。

 PL/SQLは、Oracle Server(SQL*Plus、Servermanagerなど)またはDeveloper(Oracle Forms、Oracle Reportなど)などの開発ツールに採用されています。しかし、この2つのPL/SQLでは異なる点があるので、その違いを比較しておきましょう(図1)。

図1 Oracle ServerにおけるPL/SQLの実行とDeveloperなどの開発ツールにおけるPL/SQLでの実行の違い

 PL/SQLは、SQLと違って一文ずつではなく、ブロック単位でサーバに送信できるので、ネットワークを通る通信量(トラフィック)を少なくすることができます(図2)。ネットワークへの通信量を少なくできるということは、パフォーマンスの向上にもつながりますし、そのほかにもさまざまなメリットがあります。

図2 PL/SQLの利点

 それでは、そのブロックとはどのような構造をしているのでしょうか。

■PL/SQLの基本文法(変数の宣言)

 PL/SQLは、「宣言部」「実行部」「例外処理部(エラー処理)」の3つのセクションから構成されています(図3)。この3つのセクションのうち、最低限必要なのが実行部です。つまり、宣言部と例外処理部は必須の項目ではなく、PL/SQLはこの2つがなくとも正常に実行されます。なお、変数と定数は宣言部で宣言する必要があります。PL/SQLの変数では、別のブロックであれば、異なる変数に同じ名前を使用することができます。この変数名の宣言は、命名規則に準じて宣言します。

図3 PL/SQLのブロック構造

スカラーの基本データ型
 スカラーの基本データ型は、ORACLE MASTER Silver(以下、Silver)で学習したデータ型のほか、Goldで学習する次に挙げるPL/SQLの固有のデータ型を含みます。

BOOLEAN: 論理値のTRUE、FALSE、NULLの3つの値を格納
BINARY_INTEGERおよびPLS_INTEGER: 符号付き整数用の基本タイプ(Oracle 7.3以降はPLS_INTEGERの方が高速な処理が可能)
スカラーの基本データ

 それでは、スカラー型の変数宣言の例を挙げましょう。

v_Job VARCHAR2(10); 職種を格納する値を宣言する
v_today DATE := SYSDATE; 変数を今日に初期化する
v_Valid BOOLEAN :=TRUE; データが有効か無効かを示すフラグを宣言し、
変数をTRUEにする
スカラー型の変数宣言の例

%TYPE属性
 %TYPE属性を使うと、以前に宣言された別の変数やデータベースに格納されている表の列に従って変数を宣言することができます。

v_ename emp.ename%TYPE; emp表のename列にデータ型を合わせる
v_today DATE;
v_hiredate v_today%TYPE;
以前に宣言されたv_todayの変数に合わせる
%TYPE属性の例

 %TYPEを使用して宣言された変数には、NOT NULL列制約は適用されません。%TYPE属性を宣言したときにも、変数にはNULLを割り当てることが可能です。

■PL/SQLの命名規則とデータ型の変換

 PL/SQLにも、SQLのオブジェクトと同じように命名規則があります。これは、ORACLE MASTER Silverの学習範囲ですが、ここで簡単に復習しておきましょう。

 まずは識別子です。

・最大30bytesを指定可能
・予約語は、基本的には使用できない(どうしても使用したい場合は「“ ”」ダブルクォーテーションでくくる)
・先頭の文字はアルファベットで開始する
・データベース内に格納されている表名や列名と同じ名前は使用しない(1つのSQL文の中にあるPL/SQL識別子の列名が同じであると、Oracleはその列は参照先と見るため)

 PL/SQL内ではSQL関数のほとんどが使用可能です。しかし、プロシージャ文の中ではグループ関数やDECODE、DUMP、VSIZEは使用できません。

データ型の変換
 1つの文に複数のデータ型が存在しているとデータ型の暗黙的変換が行われます。暗黙的変換は、異なるデータ型に代入するとそれに合うデータ型に自動的に変換されます。このように複数のデータが存在しているとエラーの原因や、パフォーマンスに影響を与えます。そのため、データ型を明示的変換にします。明示的変換は、変換関数を使用してデータ型を変換します。PL/SQLは、このような値の変換ができるのです。

TO_CHAR DATE型とNUMBER型をCHAR型に変換する
TO_DATE CHAR型とNUMBER型をDATE型に変換する
TO_NUMBER CHAR型をNUMBER型に変換する
データ型の変換

 それでは、暗黙的変換と明示的変換の比較を、図で理解しておきましょう(図4)。

図4 暗黙的変換と明示的変換の例

■ネストされたブロック

 PL/SQLは、ブロックの実行部をさらに小さいブロックに分割できます。つまり、入れ子構造にできます。また、実行文を使用できるところであれば、どこでもブロックをネストできます。ネストされたブロックと変数の有効範囲は、上位レベルのブロックで宣言された変数であれば下位レベルのブロック内を参照できますが、下位レベルのブロックで宣言された変数は、上位レベルのブロックで参照することはできません。上位ブロックと同じ名前の変数は、下位ブロックで宣言された変数が優先されます(図5)。

図5 PL/SQLのネスト構造

 最後に、今回取り上げた3つのカテゴリから、間違えやすいものを問題にしてみました。挑戦してみてください(問題の解答は、本連載の最後にあります)。

問題

I PL/SQL環境
PL/SQLの環境に関する記述として、正しいものはどれでしょうか?

1)ブロック処理はすべてOracle Server側で行われる。
2)PL/SQLはISOやANSIの標準に沿って作られた言語である。
3)PL/SQLはSQLよりパフォーマンスが良い。
4)PL/SQLは直接実行できる。

II 変数の宣言
正しい変数宣言はどれでしょうか?

1)V_sal := sum(sal),
2)V_name emp.ename%TYPE := 'SCOTT';
3)C_cnt CONSTANT NUMBER = 3

III 実行文の作成
ネストされたブロック内で変数の正しい有効範囲を説明しているものはどれでしょうか?

1)変数は上位ブロックと下位ブロックの両方を参照し、変数名が上位ブロックと下位ブロックが同じ場合は上位ブロックを参照する。
2)上位ブロックは上位ブロック内で下位ブロックは下位ブロック内でないと参照できない。
3)上位ブロック内の変数は下位ブロックの変数を参照できるが、下位ブロックの変数は下位ブロック内でしか参照できない。


コラム:プログラミングの経験がなくてもできるPL/SQLの突破

 実は、私はプログラミングをした経験がありません。前回、どうして私がORACLE MASTERの取得を考えたのかという動機に触れましたが、取得を考えた時点では、まだ情報は少なく、プログラミングの問題が出るとは思ってもみませんでした。しかし、当時はそれを知らずにGoldを取得するのだと、無謀にも周囲にいい切っていました。

 できるわけがないとバカにされたこともあり、悔しいのと意地も手伝い、何があっても取得してやるという気持ちになりました。そしてSilverの取得後、すぐにPL/SQLの本を買いに行ったところ、「プログラミング」という言葉が目に留まりました。私はプログラミングをしたことがありません。そのときは、ここまでかとも思いましたが、ダメモトで勉強を始め、約3カ月後。無事に一発合格することができました。

 Goldで出題される範囲は、処理の流れとか特徴を問われているため、思ったほど難しいものではなく、もう少し早く受けてもよかったと思いました。しかし、その3カ月は必死で勉強をしました。私の周囲には、プログラマーをしていた人などはいなかったので、「変数って何?」というレベルでしたが、前回紹介した本やプログラミングの入門書を買って勉強しました。私のようにプログラミング経験がなくとも合格できる科目ですから、未経験の人でも取得できるはずです。あきらめずにチャレンジしてみてください。


今回の問題の解答
I:  3
II: 2
III: 3

「連載 ORACE MASTER Goldポイント解説」

自分戦略研究所、フォーラム化のお知らせ

@IT自分戦略研究所は2014年2月、@ITのフォーラムになりました。

現在ご覧いただいている記事は、既掲載記事をアーカイブ化したものです。新着記事は、 新しくなったトップページよりご覧ください。

これからも、@IT自分戦略研究所をよろしくお願いいたします。