たきるブログ

C#やOracleなどの情報を書いています。

【Oracle】同じ行を複数件取得する

自分で何を言ってるか良く分からないタイトルだけど、言いたいことは以下のようなこと。

問題

通常の検索結果
col1   col2   col3
A      a      1
A      a      2
A      b      1
B      a      1
求めたい検索結果(1行につき、2行出力したい)
col1   col2   col3
A      a      1
A      a      1
A      a      2
A      a      2
A      b      1
A      b      1
B      a      1
B      a      1

解決方法

パッケージを作ればできる。
余計なワークテーブルを作る必要もなく、既存クエリへの影響も少なく済む方法は、以下の通り。

Package ROW_OPERATOR
CREATE OR REPLACE PACKAGE ROW_OPERATOR
IS
  TYPE REC_TYPE IS RECORD (
    ROW_NUM NUMBER
  );
  TYPE REC_TABLE_TYPE IS TABLE OF REC_TYPE;

  /**
   * 検索行した複数行に渡ってコピーするためのテーブルを取得します。
   * @param  A_CLONE_ROW_CNT  コピー件数
   * @return コピー用テーブル
   */
  FUNCTION GET_CLONE_ROW_TABLE(A_CLONE_ROW_CNT IN NUMBER) RETURN REC_TABLE_TYPE PIPELINED;

END;
/
Package Body ROW_OPERATOR
CREATE OR REPLACE PACKAGE BODY ROW_OPERATOR
IS
  /**
   * 検索行した複数行に渡ってコピーするためのテーブルを取得します。
   * @param  A_CLONE_ROW_CNT  コピー件数
   * @return コピー用テーブル
   */
  FUNCTION GET_CLONE_ROW_TABLE(A_CLONE_ROW_CNT IN NUMBER) RETURN REC_TABLE_TYPE PIPELINED
  IS
    L_CNT  NUMBER;
    L_REC  REC_TYPE;

  BEGIN
    L_CNT := 1;

    WHILE L_CNT <= A_CLONE_ROW_CNT LOOP
      L_REC.ROW_NUM := L_CNT;
      PIPE ROW(L_REC);
      L_CNT := L_CNT + 1;
    END LOOP;

    RETURN;
  END;

END;
/
使い方
SELECT WK.ROW_NUM, TBL.*
FROM   table1 TBL,
       TABLE(ROW_OPERATOR.GET_CLONE_ROW_TABLE(4)) WK

単純結合によって、求めたい行を複数行出力させるようにする。

【C#】EnterキーでTabキーを押した時と全く同じフォーカス遷移を行う

EnterキーでTabキーを押した時と同じフォーカス遷移を行いたいという要望は、案外多い。
古いシステムからの名残りだったり、そもそも提案した人が古い人だったりで。
果てはWebシステムでもそれを望むこともあるが、今回はWindows Formsアプリケーションの場合の解決方法を記す。

Enterキーでフォーカス遷移する方法は、難しく考えすぎて意外とハマる。
他のサイトで調べた結果、最適解を導き出した。

参考サイト

Enterキーを押した時、まるでTabキーを押したかのように、次のコントロールにフォーカスを移す - .NET Tips (VB.NET,C#...)
色々あって全部試したわけではないが、コンポーネント単位に継承するのは非効率。
コメント欄に[たきる]ってなってるのは俺^^;

Windowsアプリケーションで[Enter]キーによるフォーカス移動を行うには?:.NET TIPS - @IT
C# - フォームで [Enter] キーが押された時にフォーカスを遷移させる
SelectNextControlメソッドを利用すると、『自分のオブジェクト配下に存在するコントロールを遷移する』だけであり、Tabキーと全く同じにはならない。

続きを読む

【SQL Server】Oracleへのリンクサーバーを作成する

サーバA
Windows Server 2008 R2 x64
SQL Server 2012 R2 x64

サーバB
Windows Server 2003 R2 x86
Oracle 11g 11.2.0.1.0 x86

サーバAのSQL Serverにリンクサーバーを作成し、サーバBを参照できるようにする方法が分かったので、記しておく。
前提としては、当たり前のように、それぞれのDBが、外部からアクセス可能になっていること。(特にOracle側)

続きを読む

【C#】フォーム終了時のValidating、Validatedイベントを制御する

Visual C# 2012
.NET Framework 4.5

入力エリアコントロールにあるCausesValidationプロパティはデフォルトではtrue。
そのため、何も意識しなければ、Validating、Validatedイベントは走行し、フォーカスを失った時に入力値を検証し、OKならフォーカス移動させる、NGならフォーカス移動させないということが可能だ。

その動作を利用して、フォームを閉じた時に制御を加えよう。

続きを読む

こういうの書こうかな

あれができたら便利、これができたら便利、あれができたらなー、これができたらなー

世の中に出回っているアプリを使えばできるものが多いでしょう。
しかし、意外と以下のようなことが往々にしてあります。
 
 - 個人的に使い勝手が好きじゃない。
 - 外部アプリケーションからの呼び出しが行えない。
 - バックグラウンド動作をさせることができない。
 - 使い勝手やライセンスの関係上、客向けに提供できない。
 - 複数のアプリを組み合わせないと実現できない。
 - 古めかしい文化のせいで、自社開発以外のものを受け入れない。


まぁ、そんなことないかもしれませんが、あるかもしれません。


だから


じゃあ自分で作る


アプリを公開するわけではありませんが、アプリを作る方法をちょこちょこ小出しにしていこうかと思います。

もちろん、自分で作るといっても、OSS(オープンソース)のライブラリやフレームワークを使わないわけではありません。
しかし、極力無償の範囲内で実装する方法論をベースに記します。
金を払ってでも無償よりよっぽどいい!というものも記します。

【PHP】xdebugを設定する方法

いっつも忘れるので、サイトを徘徊して見つけるんじゃなくて、ひとまとめにしとこう。

環境

Windows

ダウンロード

Xdebug: Downloads

設定

[XDEBUG]
zend_extension="D:\php-5.6.5-nts-Win32-VC11-x86\ext\php_xdebug-2.2.7-5.6-vc11-nts.dll"
xdebug.remote_enable=on
xdebug.remote_handler=dbgp
xdebug.remote_host=localhost
xdebug.remote_port=9000
xdebug.show_local_vars=1
xdebug.dump_globals=1
xdebug.dump.SERVER=QUERY_STRING, REQUEST_URI
xdebug.dump.GET=*
xdebug.dump.POST=*
;xdebug.profiler_enable=1
;xdebug.profiler_output_dir="D:\php-5.6.5-nts-Win32-VC11-x86\tmp"
;xdebug.auto_trace=1
;xdebug.trace_output_dir="D:\php-5.6.5-nts-Win32-VC11-x86\tmp"


PHPのバージョン、スレッドモードを合わせたxdebugをダウンロードするのが前提で、設定内容は以下の通り。

zend_extension=xdebugのdllが存在するパス
xdebug.remote_enable=onでリモートデバッグ
xdebug.remote_handler=dbgpで固定
xdebug.remote_host=リモートホスト(ローカル開発は大抵localhost)
xdebug.remote_port=9000がデフォルトポート
xdebug.show_local_vars=1で変数の表示を行う
xdebug.dump_globals=1でグローバル変数の表示を行う
xdebug.dump.SERVER=QUERY_STRING, REQUEST_URI $_SEVER["QUERY_STRING"]、$_SERVER["REQUEST_URI"]のみ表示する
xdebug.dump.GET=*で$_GETの中身を全部表示する
xdebug.dump.POST=*で$_POSTの中身を全部表示する
;xdebug.profiler_enable=1でプロファイルを行う
;xdebug.profiler_output_dir=プロファイルの保存先ディレクトリ
;xdebug.auto_trace=1でトレースを行う
;xdebug.trace_output_dir=トレースの保存先ディレクトリ

【フォント】見づらい文字を簡単に見分けるフォント

使うフォントは、ずばり『consolas』ってやつ。

Windows 7以降なら、このフォントは入ってるはず。


人によってはプログラミングの時にもこのフォントを使ってるみたいだ。

個人的には、ダウンロード購入したソフトウェアなどをDVD-Rなどに焼いたあと、プロダクトキーも印刷して保存しておくわけだが、そのプロダクトキーの印刷に、このフォントを利用している。

文字の1つ1つがはっきりしてるし、見やすい。

以下は、見づらい文字の典型。
左からゼロ、小文字オー、大文字オー、イチ、小文字アイ、大文字アイ、小文字ジェイ、大文字ジェイ
f:id:metroit:20190115204059p:plain