ひとこと

― 今日のひとこと ―
年に1回くらい、EVE Onlineやりたくなるのよね。
(2025.12.24)

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番ホームでリーアム・ニーソンに激似の日本人男性を見かけた。

2013年2月3日日曜日

Amazon Web Serviceで仮想サーバ構築 No.9 -MySQLインストール-

後々使う可能性が高いので、AWS-EC2で作成した仮想サーバにMySQLをインストールしておく。




1.No.2にメモした方法でインスタンスに接続する。


2.MySQLをインストールする。
$ sudo apt-get install mysql-server
↓の画面でrootアカウントのパスワードを設定



3.デフォルトだと日本語が文字化けするので、文字コードを変更する。
# /etc/mysql/conf.d に.confファイルを作成する。ファイル名は任意(ここではcharset.cnf)
$ sudo nano /etc/mysql/conf.d/charset.cnf

# charset.cnfに以下の内容を記述

[client]
default-character-set=utf8

[mysqld]
character_set_server=utf8
skip-character-set-client-handshake



4.MySQLを再起動
sudo /etc/init.d/mysqld restart



これでおしまい。確認する時は以下のコマンドを実行する。
# MySQLにログイン
$ mysql -u root -p
Enter the password: パスワード入力

# MySQLの設定を確認
$ status

文字コードが正しく変更されていれば↓のようにutf-8が並ぶ!





ついでにinsertとselectだけできるユーザをひとつ作成しておく。
--grant <与える権限> on *.* to <ユーザ名> identified by '<パスワード>' [with grant option];
grant insert,select on *.* to user identified by 'user';

2013年2月2日土曜日

Amazon Web Serviceで仮想サーバ構築 No.8 -TomcatでBASIC認証-

Tomcatサーバのサーブレットプログラムに対するアクセスにBASIC認証を適応する方法。

プログラムの利用者を限定したい場合、No.7で利用可能になったHTTPS通信と併用する事でより安全に通信を行えるようになる。
っていうかBASIC認証で使用する秘密情報は素でネットワークを流れるから暗号通信と併用しないと危険

今回はデフォルトで用意されている「UserDatabaseRealm」を利用する。




1.No.2にメモした方法でインスタンスに接続する。


2.tomcatのtomcat-users.xmlを編集する。
roleに関する部分のコメントを解除し、必要に応じてロールやユーザを追加する。

ここを


こうする


今回はTomcatにアクセスを許可するユーザには「tomcat」というroleを割り当てる。


3.サーブレットのweb.xmlを編集する。

web-appタグにsecurity-constraintタグとlogin-configタグとsecurity-roleタグを追加する。
↓はJava ServletとAWS-SESでメール送信 No.3 で作成したプログラムにBASIC認証を導入した場合の例





    
    
        SendMail
        send.SendMail
      
    
        SendMail
        /SendMail
     

    

    
     
      html
      /*
     
     
      tomcat
     
    
    
    
     BASIC
     UserDatabaseRealm
    
    
  tomcat
    
    



4.Tomcatを再起動する。



これで設定はおしまい。BASIC認証を設定したプログラムにアクセスしてみると・・・


このように認証ウィンドウが開く。



ただ、いまいちよくわかんないんだけど
web-resource-nameタグで指定したhtmlフォルダ以外のプログラムにアクセスしても認証ウィンドウが出てくるんだよね。
まぁ自分の場合はメール送信プログラムの実行前に認証できてればよかったから別にいいけど。
この辺はきっと未来の自分がなんとかしてくれるだろう。。


追記(2013/02/03_17:22):web-resource-collectionタグ内の記述について
web-resource-nameタグに記述するのは「リソース名」ではなく、
「アクセス制限ルールを適用するリソースに対する任意の名称」です。つまり何でもいいようです。
また、url-patternタグに記述するのは「web-resource-nameで指定したリソースからのパス」ではなく、
単純に「アクセスを制限するリソースのURL」でした。servlet-mappingタグでのurl-patternの指定と同じ記法です。

たとえば、「http://xxx.xxx.xxx.xxx/SendMail/html/」以下のプログラムに対するアクセスに認証を設ける場合は、
     
      まろ最高
      /html/*
     
 
とするのが正解です。


貴重なアドバイスを下さった越冬老師様に、大変感謝いたします。