ひとこと

― 今日のひとこと ―
気付けば前回更新してから2年以上経ってた
(2023.10.25)

2013年6月1日土曜日

Oracle PL/SQL開発 No.2-指定したテーブルの主キーを表示-

普段は社用PCのローカルにインストールしたOracle DBでプログラムを書いていて、
テストテーブルや変更履歴を自動保存するトリガなんかを色々と作って使っている。

面倒なので自宅PCのOracle DBではデフォルトのサンプルを使ってなんやかんやしているわけだが
サンプルのテーブルは僕が作ったわけではないのでテーブル構造がわからない。

型とNot Null制約の有無くらいならdescribeで分かるけどね・・・
主キーが知りたいんだよ!っていう場合が多々ある。

主キーを判別する方法はいくつかあるようだが
user_cons_columnsテーブルを使ってユーザが指定したテーブルの主キーを列挙するPL/SQLプログラムを作ってみた。


declare
  -- レコード型コレクション(結合配列)変数
  type column_data is table of user_cons_columns%rowtype index by pls_integer;
  col column_data;
  -- カーソル変数
  type refcs is ref cursor;
  cs refcs;
  -- ループカウンタ
  lc number default 1;
begin
  -- カーソルにSQL文を設定してオープン
  open cs for
   'select * from user_cons_columns
    where constraint_name = (
      select constraint_name from user_constraints
      where table_name = :table_name_input
      and constraint_type = ''P''
    )' using upper('&table_name_input');  -- ユーザ入力値を大文字に変換してバインド

    -- Fetchループ
    loop
      fetch cs into col(lc);
        exit when cs%notfound;
        -- 所有者と対象テーブル名は一度だけ出力
        if 1 = cs%rowcount then
          dbms_output.put_line('所有者:'||col(lc).owner||' / '||
                               'テーブル:'||col(lc).table_name);
        end if;
        dbms_output.put_line('主キー:'||col(lc).column_name);
        lc := lc + 1;
    end loop;
  
    -- 結果セットが0行だった場合はエラーメッセージを表示する
    if 0 = cs%rowcount then   -- !カーソルをcloseした後はカーソル属性を使用できない!
      raise_application_error(
        -20999,
        '指定した表またはビューが存在しないか、データが空です。'
      );
    else
      dbms_output.put_line(CHR(13)||CHR(10)||'正常に処理が終了しました。');
    end if;
  close cs;
exception
  -- テーブルに主キーが無い場合はエラーメッセージを出力
  when no_data_found then
    dbms_output.put_line('主キーがありません。');
  -- その他のエラーが発生した場合は対応するエラーメッセージを出力
  when others then
    dbms_output.put_line(sqlerrm);
end;
/


実行すると入力要求が出る


主キーを知りたいテーブルの名前を入力する。
たとえばサンプルのEMP表だと結果はこうなる。

EMPNO列が主キーだということがわかる。


複合主キーのテーブルを作ってみた。

このDOUBLE_PRIME表の主キーは

COMP_ID列とEMP_ID列。複合主キーにも対応していることがわかる。



大したこと無いプログラムだけど、作りたい物が作れた時の達成感は味わえた。






データがinsertされてない表には使えないのはご愛嬌!
(もう疲れ果てました)

Oracle PL/SQL開発 No.1-SQL Developerインストール-

こうして投稿するのは4ヶ月ぶりくらいか
2~4月はDBスペシャリストの勉強と社内研修、4~5月は社内研修とPL/SQL研修で死ぬほど忙しかった。

PL/SQL研修といっても「現場出る前にこれやっとけ」って上長から言われて
『プロとしてのOracle PL/SQL入門』をやってただけなんだけどね(僕だけしかも社内研修と並行してたった3週間で)
昼休みは昼食を摂る暇もなくすべて勉強に費やし、毎日終業後は定時で帰る同僚たちを背に居残り。
土日も課題が出るからストレスたまりまくり。合間にはネットワークスペシャリストの勉強もしてるわけで
他の新人と比べて学習の量も難度も高すぎやしないか・・・特に平日なんか気の休まる時がまるで無いんだが。。
今日もバルク処理やら何やらのプログラム作らないといけないんだよ月曜提出だよ



まぁ愚痴はこの辺にして、SQL版Eclipseのような開発環境SQL Developerのインストール方法をメモ。
※事前にJavaとOracle SQL環境の用意が必要です。

1.ここからファイルをダウンロードする



2.ダウンロードしたファイルを解凍し、『sqldeveloper.exe』を起動

初回起動時はjava.exeのパスを尋ねられるので入力する。
Javaをデフォルトの位置にインストールしたならProgram Files内にJavaフォルダがあるはずなので、
その中にあるjdkのbinフォルダにjava.exeがあります


3.画面左側の「接続」を右クリックし、「接続の作成」をクリックする



4.Oracleデータベースへの接続情報を登録する

接続情報を入力したら、「テスト」ボタンをクリックして接続確認をする。
正しくDBに接続できたらステータス欄に「成功」と表示される。



ここまでやれば開発できる状態になる。
sqlスクリプトはメニューの「ファイル」->「新規」から作成する。



Terapadとかメモ帳で作ったsqlファイルって、SQL*Plusで実行するとコメント内外問わず日本語が文字化けして
プログラムによってはちゃんと動かないんよね。
その点SQL Developerで作ったsqlファイルはしっかり動くからいいよね
入力補完機能もあるしF5かF9押せば実行できるし開発作業も楽



ちなみに、DBMS_OUTPUTの出力内容を確認する方法は以下の通りだ

1.メニューの「表示」->「DBMS出力」をクリック



2.緑色十字マークの「接続のDBMS_OUTPUTを有効化」ボタンをクリック


これだけ。


複数の上司から聞いた話では、JavaとPL/SQLとShellプログラミングができるとかなり重宝されるとのこと。
特にPL/SQLは若い人はやりたがらないから人材が全然足りないんだと。
だから早いうちにPL/SQLを覚えておくと今後大きな武器になるらしい





関係ないけど、さっき京急蒲田駅の6番ホームでリーアム・ニーソンに激似の日本人男性を見かけた。