「開発メモ」カテゴリーアーカイブ

Oracle-SQLのエラー行を特定する方法

SQLがちょっと複雑になってきたりすると、なんてことないケアレスミスで構文エラーが出る。
そんなの日常茶飯事ですが・・・
どうやらSI Object Browserはエラーのある行を指示してくれないようです。
(参考:公式FAQ)
まあ社外ツールなら仕方ないか。
次期バージョンアップに期待。
SQLEditorTEはかなり的確にエラー行を指定してくれるのですが
これはあくまでストアドでロジックを書いている場合のみの模様。
単純にSELECT文のエラー箇所を特定したいという場合にはどうすりゃいいんだろ?
純正ツールならきっとあるよなエラー行特定機能が。
で、調べってみた。
どうやらSQLPlusを使うといけるらしい。
早速動かないSQLを貼り付けてみると、無事にエラー行を指定してくれた。
よかったよかった。
・・・でもこれなんか面倒くさくね?
ゲ○ツ氏製品との比較ばかりで申し訳ないのだが
SQLServerなら付属ツールだけでエラー行の特定はもちろん
ストアドのデバッグだってできるんだけどな・・・
Oracleさん、色々大変なんだとは思いますが
僕のような低脳でもらくちん開発できるように周辺ツール充実させてください。
ほんとお願いします。


※追記
SQLPlusに長いSQL貼り付けると途中で切れちゃったりしますが
コマンドプロンプトで実行すれば一発OKな模様。(情報元はこちら
こりゃ便利。

PL/SQLストアドのコーディングツールを教えてもらいました

 今まではほとんどSQLServerだったのですが
 最近はひたすらOracle PL/SQLでストアド書いてます。
 この仕事はじめて8年になりますが
 実は僕のストアドのコーディング経験って、みっくりするほど少ない。
 なにしろこれまでは
 クライアントサイドに配置された実行モジュール内にゴリゴリ生SQL書いて
 直接DBにアクセスしてるような時代遅れの2階層C/Sばっかりだったからな。
 APサーバー?
 ORマッピング?
 3階層C/S?
 MVC?
 なにそれ食えんの?
 そんな感じなので、普通のDMLなSQLならそこそこ書いているのですが・・・
 ストアドを書くケースが増えてきたのはここ1年くらいなんですよ。
 三流プログラマバンザイ。
 なので以下まったく空気読めてない発言ですよ。
 先に誤っておきますサーセン。


続きを読む PL/SQLストアドのコーディングツールを教えてもらいました

帳票地獄(EUR)

 新PJのお話。
 今回のシステムでは帳票出力にHITACHIのEURというツールを使ってるんですが。
 コレがまた、操作に癖があって使いにくい。
 取り急ぎやりたい事は「ページ計を出力したい」なのですが・・・
 ヘルプを覗いてもキー毎集計の例が出てくるばかりでページ計のサンプルが見つからない。
 ええぃ面倒だ
 助けてーGoogle先生ー(こればっかり)
 で、出てきたのがHITACHIのQ&A

>ページ計を出力する機能はありません。

 ( ゚д゚)・・・ハイ?
 (つд⊂)ゴシゴシ
 (;゚д゚)・・・
 ・・・そんな帳票ツール聞いたことないよ・・・
 ページ単位で合計出すなんて至極一般的な要件なのに・・・
 いや、言い切ってくれてるだけまだマシなのか?
 一応ページ計の実現方法も記載されているんですが

>1ページに出力する行数を決める。
>使用するデータへ,1ページに出力する行のまとまり別に目印となる値を入れておく。
>帳票設計で,決めておいた行数を繰り返し個数に指定し,データに入れた目印でキー集計を行うように設定する。

 じゃあデータソースになってるテーブル変えなきゃ・・・
 そのテーブルにデータ入れてるストアドも変えなきゃ・・・
 えぇぇぇじゃあもし仕様変更かかったらまた全部手を入れなきゃイカンじゃないかっ
 ダメじゃん・・・

ドメインコントローラーのリプレース(2000→2003)

 会社の新サーバーセットアップメモ。
 目的:
 Windows2000Serverドメインコントローラー(兼ファイルサーバー・プリントサーバー)をWindowsServer2003にリプレースする。
 ドメインコントローラーのコンピュータ名、その他ネットワーク共有資源名は全て旧と同一にする。
 ドメインコントローラー移行についてのドキュメントはMSのKBに色々あるんだけど、どれもが難解すぎてなかなか理解できない・・・
 そんな中
 ■EZ-NET:ドメインコントローラを Windows Server 2003 に置き換える
 を発見。
 これはわかりやすい。
 文書を読み進めながら順を追って作業。
 引っかかった点が1点。
 新サーバー(Windows2003Server)を既存ドメインのドメインコントローラーとして追加する際に以下のエラーが。

>次のエラーにより、操作に失敗しました:
>
>Windows Server 2003 Server のインストール用にフォレストが準備されていないために Active Directory インストール ウィザードを続行できません。
>adprep コマンドライン ツールを使ってフォレストおよびドメインの両方を準備してください。
>Adprep の使用法についての詳細は、Active Directory ヘルプを参照してください。
>
>”ソース フォレストの Active Directory スキーマのバージョンはこのコンピュータの Active Directory のバージョンと互換性がありません。”

 おかしいな、adprepは実行済みなんだけど・・・
 と、MSのKB917385をよく読んでみると

>この問題を解決するには、スキーマ マスタで Windows Server 2003 R2 のインストール ディスク 2 から adprep.exe /forestprep コマンドを実行します。
>コマンドを実行するには、Windows Server 2003 R2 のインストール ディスク 2 を挿入して、次のコマンドを入力します。
>Drive:\CMPNENTS\R2\ADPREP\adprep.exe /forestprep

 コレだあああ
 さっきはDisk1のi386以下にあるadprep使ってた・・・
 ちゃんとDisk2を使わないとダメなんですね。
 2000ServerでDisk2のadprepを実行、2003Serverをドメインコントローラーに追加・・・成功!
 dcpromoコマンドで2000Serverをメンバサーバーに降格して、ドメインコントローラーの移行完了。

​ 2000Server(旧)をネットワークから切り離し、2003Server(新)のコンピュータ名とIPアドレスを旧サーバーの物に変更・・・
 またエラーが。

>コンピュータ名を “HOGE” に変更中に次のエラーが発生しました:
>アカウントは既に存在します。

 あれ?
 ActiveDirectoryユーザーとコンピュータ-ComputersからはHOGE(旧)サーバーは削除済みなんだけど・・・
 よくよく調べてみたら
 Active Directory サイトとサービス
 -Sites-Default
  -First-Site-Name
   -Servers
 にHOGEサーバーの名前が残っていました。
 ポチっと削除。
 無事コンピュータ名の変更に成功。
 仕上げに旧サーバから共有フォルダのデータをコピーし、プリンタをセットアップ。
 共有資源のアクセス権限を設定して、クライアントパソコンから共有資源が使える事を確認。
 無事にサーバー移行完了!!
 はー疲れたぜ。

SQLServer-全テーブルのデータ件数を取得する

 全てのテーブルのデータ件数を取得するT-SQLスクリプト書いたのでメモ。
 DB移行なんかの時の検証用にでも。
 SQLServer7.0で動きました。
 単にテーブル名取ってきてCountした結果を一時テーブルに突っ込んでるだけです。

–すべてのユーザーテーブルのデータ行数を一覧表示する

–テーブル名(サイズは適当です。必要に応じて増やしてね。)
DECLARE @TABLE_NAME NVARCHAR(100)

–集計用SQL(SQL文字列用です。必要に応じてry)
DECLARE @SQL NVARCHAR(100)

–件数取得用
DECLARE @ROW_COUNT int

–集計結果保存用一時テーブル
CREATE TABLE #T_RESULT(
TABLE_NAME NVARCHAR(100),
ROW_COUNT int
)

–sysobjectsに保存されているユーザーテーブルをすべて取り出すカーソル
DECLARE C_TABLES CURSOR FOR
  SELECT name
  FROM sysobjects
  WHERE (type = ‘U’)

OPEN C_TABLES

FETCH NEXT FROM C_TABLES INTO @TABLE_NAME

WHILE @@FETCH_STATUS = 0
BEGIN
  –データ件数集計用SQL文字列の生成
  SET @SQL = N’SELECT @ROW_COUNT = COUNT(*) FROM ‘ + @TABLE_NAME

  –行数をOUTPUTするSQL実行
  EXEC SP_EXECUTESQL @SQL, N’@ROW_COUNT int OUTPUT’, @ROW_COUNT OUTPUT

  –結果を一時テーブルにINSERT
  INSERT INTO #T_RESULT VALUES (@TABLE_NAME, @ROW_COUNT)

  FETCH NEXT FROM C_TABLES INTO @TABLE_NAME
END

CLOSE C_TABLES
DEALLOCATE C_TABLES

SELECT * FROM #T_RESULT ORDER BY TABLE_NAME


 ※後日追記
 人力検索にサンプルソースが。

 ※追記
 SQLServer2005以降はこちらにサンプルが!

SQLServer7.0から2005へバージョンアップ

今月末にお客さんのサーバーリプレースの予定があり、本日からその作業開始。
OSはNT4.0から2003Serverに、SQLServerも7.0から2005へと大幅バージョンアップ。
業務の中心となるサーバーの入れ替えなので慎重にいかねばね。
というわけで色々作業している訳ですが。
SQLServer7.0でバックアップを取り2005で復旧しようとしたらうまくいかない。
バックアップセットは、既存のデータベース’hoge’以外のデータベースのバックアップを保持しています。
RESTORE DATABASEが異常終了しています。(MicrosoftSQLServer、エラー:3154)
うーむ。
SQLServer7.0→2000はすんなり復旧できたのですが2005はそうはいかない模様。
ためしに7.0DBのデタッチ→ファイルコピー→2005でアタッチするとうまくいった。
ヤレヤレ。