2014年12月10日水曜日

[Oracle] PL/SQLを実行するバッチでORA-03135エラー

問題のあるデータが見つかった時にUTL_SMTPパッケージを使用して
メールを送信するPL/SQLをWindows 2003 Server上に設置して
3時間ごとに動作するよう設定しているのですが、ここ最近、
朝一番の実行時に
 ORA-03135:接続が失われました
が発生するようになりました。


なんでかなーと思って調べてみると、タスクを実行するユーザーで
リモートデスクトップ接続→ログオフすると、Ctrl+Cした時みたいに
バッチ処理が止まってしまうようです。


確かに最近、そういう操作をやってるような気はしますが
まだ原因確定ではないので、ちょっと様子見ですかね。

2014年12月5日金曜日

[Oracle] db_domain と global_name を変更したときのDBLINKの挙動を調べてみた

調査の一環で、db_domain  と global_name を変更したときに
DBLINKがどのような挙動を示すか試してみることにしました。

■前提
 CentOS 6.5 x64
 Oracle 11.2.0.4.0


影響がでないようにVMwareにインストールして、いざ検証開始。

1. db_domain と global_name を確認
SQL> show parameter db_domain

NAME                TYPE      VALUE
------------------- --------- --------------------------
db_domain           string    foo.jp

SQL> select * from global_name;

GLOBAL_NAME
-------------------------------------------------------
HOGE.foo.jp

2. DBLINK作成
CREATE DATABASE LINK dblink_test01
CONNECT TO user
IDENTIFIED BY password
USING 'target_database';

3. 検証用にProcedure1つ作成
CREATE OR REPLACE PROCEDURE proc01
IS
  VAL NUMBER;
BEGIN
  SELECT COUNT(*) INTO VAL FROM table@dblink_test01;
END proc01;
/
コンパイルエラーはなし。

4. DBLINK確認
SELECT DB_LINK FROM DBA_DB_LINKS;

DB_LINK
-------------------------------------------------------
dblink_test01.foo.jp


とりあえず、これで準備は完了。
うまくいきますように。。。

5. db_domain / global_name を変更
SQL> UPDATE global_name SET global_name = 'HOGE.bar.jp';

1 row updated.

SQL> COMMIT;

Commit complete.

SQL> ALTER SYSTEM SET db_domain = 'bar.jp' SCOPE = spfile;

System altered.

6. Oracleを再起動(手順略)

7. もう一度 db_domain と global_name を確認
SQL> show parameter db_domain
NAME                TYPE      VALUE
------------------- --------- --------------------------
db_domain           string    bar.jp

SQL> select * from global_name;

GLOBAL_NAME
-------------------------------------------------------
HOGE.bar.jp

8. もう1つDBLINK作成
CREATE DATABASE LINK dblink_test02
CONNECT TO user
IDENTIFIED BY password
USING 'target_database';

9. 検証用のProcedure変更
CREATE OR REPLACE PROCEDURE proc01
IS
  VAL NUMBER;
  VAL2 NUMBER;
BEGIN
  SELECT COUNT(*) INTO VAL FROM table@dblink_test01;
  SELECT COUNT(*) INTO VAL FROM table@dblink_test02;
END proc01;
/

としたところでコンパイルエラー発生(ORA-00942)。

まあ、ドメイン名が変わっているのですから当然ですよね。

検証したかったのは、ドメイン名を変更したときに
作成済みDBLINKのドメイン付の名前(dblink_test01.foo.jp)が
変わってくれるかどうか、ということでした。


結論:変わってくれない。以上。


2014年12月4日木曜日

[Windows] タスクスケジューラでバッチ実行すると「ファンクションが間違っています。(0x800700001)」が出る

とあるexeに引数を渡して実行させるバッチをタスクスケジューラで
実行させると「ファンクションが間違っています。(0x800700001)」が
履歴に出てしまう現象が発生し、調査依頼を受けました。

調べてみると、カレントディレクトリが設定されていないとか、
リターンコードが1で返ってきていればその対処をすればよいという
内容が多かったのですが、カレントディレクトリは設定済み、
リターンコードは0ということでなかなか原因が判明せず。。


自分で作ったバッチではないので、製作者に確認をとって
動かしてみたところ、どうも引数に記載されている日本語が
文字化けしていたようです。

取り急ぎの対応として、日本語を使わないようにしたところ
問題なく動作したので無事解決。

chcpとか使えば日本語使えるようにできるんでしょうが
あまりこだわりがないようなので、これでクローズかな。

2014年12月3日水曜日

[Oracle] ジョブの管理はSQL Developerが便利?

これまで触ったことがなかったんですが、10g環境にて
ジョブを確認する必要が発生しました。

EnterpriseManagerから詳細を見ていたら、スケジュールを確認するところで
なんと HTTP500エラー。

何度繰り返しても変わらずスタックトレース的なアレが表示される。。。
どうしよう。。。


そうだ、SQL Developerなら・・・SQL Developerならなんとかしてくれる。


ということで、以前作成したCentOS環境からSQL Developer立ち上げて
無事閲覧できましたとさ。

スケジュールとジョブの関連もDeveloperの方がわかりやすくて◎かな