“よくあるファイル命名ルール”でデータ消失の危機?
http://www.itmedia.co.jp/enterprise/articles/1702/14/news046.html
システムに限らず
ただのエクセルのファイルなんかでもいえることで
とある共有フォルダなどで見たときに
最新電話帳.XLSX
NEW電話帳.XLS
電話帳.XLS
電話帳2015版 .XLSX
となんだか似たような名前が並んでいたとき
さてどれが本当に最新なのか
よく分からずに適当に修正しちゃうと
更新日時も新しくなってしまうため
本当に新しいものではないものを最新として更新してしまうことがある
専門学校などでたまに見かけるのが
サーバーの名前を
Silver
Gold
などの名前や
Saturn
Venus
などの明らかに違う名前にしていることがある
業務で見かける名前でいうと
適当に担当者がつけてしまったり
あまり規約が準拠されていない場合
上記の記事にあるように
DB1SV
DB2SV
と間違いやすい名前になることがある
プログラムでも叱り
変数名を
FLG1
FLG2
IDX1
IDX2
IX1
IX2
用途がまったく不明なものが
古いプログラムだと多い
本当にテスト環境だと思ってたら
本番環境ということが起こりえるので
せめて
せめて
テストサーバーの場合
サーバー名は
●●●TEST
など明らかに分かりやすいものにしておかないと
引きついだ時にも痛い目をみるので注意したい
2017年2月15日水曜日
2016年9月23日金曜日
oracle ora-12516
初期設定のまま導入したoracleの場合
セッション数やプロセス数という
oracleと処理をやり取りする窓口が小さい場合がある
具体的には 150セッション程度の場合がある
このとき
プログラムを起動している先
(サバクラの場合クライアント)
(winターミナル接続のアプリサーバー側)
のイベントビューアーに
ORA-12516: TNS: リスナーは、一致するプロトコル・スタックが使用可能なハンドラを検出できませんでした
というエラーが出力される
状況の確認用sql
SELECT
RESOURCE_NAME リソース名,
CURRENT_UTILIZATION 現在数,
MAX_UTILIZATION 最大数,
LIMIT_VALUE 上限
FROM
V$RESOURCE_LIMIT
WHERE
RESOURCE_NAME IN ('processes','sessions');
SELECT
S.machine,
TO_CHAR(S.LOGON_TIME, 'YYYY/MM/DD HH24:MI:SS') LOGON_TIME,
S.sid,
S.serial#,
P.PID ORACLE_PID,
P.SPID OS_PID,
S.STATUS,
S.USERNAME ORACLE_USER,
S.OSUSER OS_USER,
S.TERMINAL,
S.PROGRAM
FROM
V$PROCESS P
LEFT OUTER JOIN V$SESSION S
ON P.ADDR = S.PADDR
WHERE
P.BACKGROUND IS NULL AND
P.PID > 1
ORDER BY
S.machine,
TO_CHAR(S.LOGON_TIME, 'YYYY/MM/DD HH24:MI:SS');
などで現在どのくらい接続されているかなど確認する必要がある
上記SQLの最大値と上限に現在数が達している場合
プロセス数又はセッション数の増強を考える必要がある
セッション数やプロセス数という
oracleと処理をやり取りする窓口が小さい場合がある
具体的には 150セッション程度の場合がある
このとき
プログラムを起動している先
(サバクラの場合クライアント)
(winターミナル接続のアプリサーバー側)
のイベントビューアーに
ORA-12516: TNS: リスナーは、一致するプロトコル・スタックが使用可能なハンドラを検出できませんでした
というエラーが出力される
状況の確認用sql
SELECT
RESOURCE_NAME リソース名,
CURRENT_UTILIZATION 現在数,
MAX_UTILIZATION 最大数,
LIMIT_VALUE 上限
FROM
V$RESOURCE_LIMIT
WHERE
RESOURCE_NAME IN ('processes','sessions');
SELECT
S.machine,
TO_CHAR(S.LOGON_TIME, 'YYYY/MM/DD HH24:MI:SS') LOGON_TIME,
S.sid,
S.serial#,
P.PID ORACLE_PID,
P.SPID OS_PID,
S.STATUS,
S.USERNAME ORACLE_USER,
S.OSUSER OS_USER,
S.TERMINAL,
S.PROGRAM
FROM
V$PROCESS P
LEFT OUTER JOIN V$SESSION S
ON P.ADDR = S.PADDR
WHERE
P.BACKGROUND IS NULL AND
P.PID > 1
ORDER BY
S.machine,
TO_CHAR(S.LOGON_TIME, 'YYYY/MM/DD HH24:MI:SS');
などで現在どのくらい接続されているかなど確認する必要がある
上記SQLの最大値と上限に現在数が達している場合
プロセス数又はセッション数の増強を考える必要がある
2016年9月1日木曜日
データベースとプログラムの文字コード
某お客の話
データベースが sjis
業務のプログラムが UNICORD
になっており
共通になる文字は問題ないが
特殊文字 ○13 などが
画面では入力できるが
データベースを経由すると
文字化けがおきることがあった
基本的なことではあるが
文字化けする場合の見落としがちなことなので
文字がばける
と連絡があった場合
確認してみるとよい
データベースが sjis
業務のプログラムが UNICORD
になっており
共通になる文字は問題ないが
特殊文字 ○13 などが
画面では入力できるが
データベースを経由すると
文字化けがおきることがあった
基本的なことではあるが
文字化けする場合の見落としがちなことなので
文字がばける
と連絡があった場合
確認してみるとよい
2016年8月10日水曜日
プログラムとSQLの文字列結合
JAVAの場合
手法1プラス演算子(時間がかかる)
String s1 = "aaa";
String s2 = "bbb";
String s = s1 + s2;
手法2String#concat()(時間がかかる)
String s1 = "aaa";
String s2 = "bbb";
String s = s1.concat(s2);
手法3StringBuffer
String s1 = "aaa";
String s2 = "bbb";
StringBufferbuf = new StringBuffer();
buf.append(s1);
buf.append(s2);
String s = buf.toString();
手法4StringBuilder(一番速度が速い)
String s1 = "aaa";
String s2 = "bbb";
StringBuilder buf = new StringBuilder();
buf.append(s1);
buf.append(s2);
String s = buf.toString();
VB.NETの場合
Dim s1 As String = "文字列1"
Dim s2 As String = "文字列2"
'2つの文字列を連結する
Dim s3 As String = s1 & s2
'Concatを使っても全く同じ
Dim s4 As String = String.Concat(s1, s2)
Dim sb As New System.Text.StringBuilder()
sb.Append(s1)
sb.Append(s2)
Dim s5 As String = sb.ToString()
COBOLの場合
01 TXTREC2 PIC X(600).
01 WK-POINTER PIC 9(10).
MOVE 1 TO WK-POINTER.
STRING
"文字列1" DELIMITED BY SIZE
INTO TXTREC2 WITH POINTER WK-POINTER
END-STRING.
"文字列2" DELIMITED BY SIZE
INTO TXTREC2 WITH POINTER WK-POINTER
END-STRING.
STRING
--------
END-STRING.
ORACLEの場合
CONCAT(文字列1 , 文字列2 )
SQL-Serverの場合
文字列1 + 文字列2
PostgerSQLの場合
'文字列1' || '文字列2'
手法1プラス演算子(時間がかかる)
String s1 = "aaa";
String s2 = "bbb";
String s = s1 + s2;
手法2String#concat()(時間がかかる)
String s1 = "aaa";
String s2 = "bbb";
String s = s1.concat(s2);
手法3StringBuffer
String s1 = "aaa";
String s2 = "bbb";
StringBufferbuf = new StringBuffer();
buf.append(s1);
buf.append(s2);
String s = buf.toString();
手法4StringBuilder(一番速度が速い)
String s1 = "aaa";
String s2 = "bbb";
StringBuilder buf = new StringBuilder();
buf.append(s1);
buf.append(s2);
String s = buf.toString();
VB.NETの場合
Dim s1 As String = "文字列1"
Dim s2 As String = "文字列2"
'2つの文字列を連結する
Dim s3 As String = s1 & s2
'Concatを使っても全く同じ
Dim s4 As String = String.Concat(s1, s2)
Dim sb As New System.Text.StringBuilder()
sb.Append(s1)
sb.Append(s2)
Dim s5 As String = sb.ToString()
COBOLの場合
01 TXTREC2 PIC X(600).
01 WK-POINTER PIC 9(10).
MOVE 1 TO WK-POINTER.
STRING
"文字列1" DELIMITED BY SIZE
INTO TXTREC2 WITH POINTER WK-POINTER
END-STRING.
"文字列2" DELIMITED BY SIZE
INTO TXTREC2 WITH POINTER WK-POINTER
END-STRING.
STRING
--------
END-STRING.
ORACLEの場合
CONCAT(文字列1 , 文字列2 )
SQL-Serverの場合
文字列1 + 文字列2
PostgerSQLの場合
'文字列1' || '文字列2'
2016年8月9日火曜日
ORACLE よく使うコマンド2
--項目追加
ALTER TABLE テーブル名 ADD (
追加項目名 型(桁) DEFAULT 'xxx' NOT NULL ,
number_col NUMBER(10) DEFAULT 0 NOT NULL
);
--項目名前変更
ALTER TABLE テーブル名 RENAME COLUMN 元の項目名 TO 新しい項目名 ;
--
--項目桁変更
ALTER TABLE テーブル名 MODIFY (
変更したい項目名 VARCHAR2(新しい桁),
number_col NUMBER(14)
);
--プライマリKEY削除
ALTER TABLE テーブル名 DROP CONSTRAINT 消したいPK名 ;
--プライマリKEY作成
ALTER TABLE テーブル名 ADD
CONSTRAINT 作りたいPK名
PRIMARY KEY (項目1, 項目2 ..) ;
--インデックス削除
DROP INDEX 消したいインデックス名;
--インデックス作成
CREATE INDEX 作りたいインデックス名
ON テーブル名 (項目1,項目2)
ALTER TABLE テーブル名 ADD (
追加項目名 型(桁) DEFAULT 'xxx' NOT NULL ,
number_col NUMBER(10) DEFAULT 0 NOT NULL
);
--項目名前変更
ALTER TABLE テーブル名 RENAME COLUMN 元の項目名 TO 新しい項目名 ;
--
--項目桁変更
ALTER TABLE テーブル名 MODIFY (
変更したい項目名 VARCHAR2(新しい桁),
number_col NUMBER(14)
);
--プライマリKEY削除
ALTER TABLE テーブル名 DROP CONSTRAINT 消したいPK名 ;
--プライマリKEY作成
ALTER TABLE テーブル名 ADD
CONSTRAINT 作りたいPK名
PRIMARY KEY (項目1, 項目2 ..) ;
--インデックス削除
DROP INDEX 消したいインデックス名;
--インデックス作成
CREATE INDEX 作りたいインデックス名
ON テーブル名 (項目1,項目2)
ORACLE よく使うコマンド
--定義が同じテーブルで全件 INSERT する場合
INSERT INTO テーブルA
SELECT *
FROM テーブルB
--列を指定して INSERT する場合
INSERT INTO テーブルA(
列1
,列2
)
SELECT 列1
,列2
FROM テーブルB
--条件を指定して SELECT した結果を INSERT する場合
INSERT INTO テーブルA(
列1
,列2
)
SELECT 列1
,列2
FROM テーブルB
WHERE テーブルB.列3 = 条件値1
AND テーブルB.列4 = 条件値2
--同じ定義の別名テーブルを作成(データ一時退避 など)
CREATE TABLE テーブル名 AS SELECT * FROM 既存のテーブル名;
--☆テーブルにコメントを作成する。
COMMENT ON TABLE テーブル名 IS 'コメント';
一時退避テーブル等には「コメント」をつけておかないと
あとで消していいワークなのか、プログラムで定期に利用しているか不明になるので
つけておいたほうがよい
--☆カラムにコメントを作成する。
COMMENT ON COLUMN テーブル名.カラム名 IS 'コメント';
いつ追加したか、なんの項目か、区分の場合区分の説明等をつけると
あとでわかりやすい
INSERT INTO テーブルA
SELECT *
FROM テーブルB
--列を指定して INSERT する場合
INSERT INTO テーブルA(
列1
,列2
)
SELECT 列1
,列2
FROM テーブルB
--条件を指定して SELECT した結果を INSERT する場合
INSERT INTO テーブルA(
列1
,列2
)
SELECT 列1
,列2
FROM テーブルB
WHERE テーブルB.列3 = 条件値1
AND テーブルB.列4 = 条件値2
--同じ定義の別名テーブルを作成(データ一時退避 など)
CREATE TABLE テーブル名 AS SELECT * FROM 既存のテーブル名;
--☆テーブルにコメントを作成する。
COMMENT ON TABLE テーブル名 IS 'コメント';
一時退避テーブル等には「コメント」をつけておかないと
あとで消していいワークなのか、プログラムで定期に利用しているか不明になるので
つけておいたほうがよい
--☆カラムにコメントを作成する。
COMMENT ON COLUMN テーブル名.カラム名 IS 'コメント';
いつ追加したか、なんの項目か、区分の場合区分の説明等をつけると
あとでわかりやすい
2016年7月26日火曜日
oracle現存テーブルから再作成sql
oracleでテーブルを作り直したい時に使うsql
CREATE TABLE テーブル名 AS SELECT * FROM 既存のテーブル名;
で既存のテーブルから新規に別名のテーブルを作成する方法
(上記の場合、データも引き継がれる)
まったく空で新規につくるときに使っているsql
SELECT
CASE DB.COLUMN_ID
WHEN 1 THEN 'CREATE TABLE ' || DB.TABLE_NAME || '( '
ELSE ' '
END
||
TRIM(DB.COLUMN_NAME) || ' ' || TRIM(DB.DATA_TYPE) || '(' ||
CASE DB.DATA_TYPE
WHEN 'NUMBER' THEN TO_CHAR(DB.DATA_PRECISION,'FM000') || ',' || TO_CHAR(DB.DATA_SCALE,'FM00')
ELSE TO_CHAR(DB.DATA_LENGTH,'FM000')
END
|| ')' || ' DEFAULT ' ||
CASE DB.DATA_TYPE
WHEN 'NUMBER' THEN '0'
ELSE ''' '''
END
||
CASE DB.NULLABLE
WHEN 'N' THEN ' NOT NULL'
ELSE ' NULL'
END
||
CASE MAX_NO.MAX_GYO
WHEN DB.COLUMN_ID THEN ');'
ELSE ','
END
SQL_DATA
FROM user_tab_columns DB
LEFT JOIN (SELECT TABLE_NAME , MAX(COLUMN_ID) MAX_GYO FROM user_tab_columns GROUP BY TABLE_NAME) MAX_NO
ON DB.TABLE_NAME = MAX_NO.TABLE_NAME
LEFT JOIN user_col_comments DB_COL
ON DB.TABLE_NAME = DB_COL.TABLE_NAME
AND DB.COLUMN_NAME = DB_COL.COLUMN_NAME
WHERE DB.TABLE_NAME = 'もとのテーブル名'
ORDER BY DB.TABLE_NAME,DB.COLUMN_ID
;
でテーブルcreate文が生成できるので
最初のcreateの後のテーブル名称を新しい名前にしてテーブルを作成する
意外と使う
CREATE TABLE テーブル名 AS SELECT * FROM 既存のテーブル名;
で既存のテーブルから新規に別名のテーブルを作成する方法
(上記の場合、データも引き継がれる)
まったく空で新規につくるときに使っているsql
SELECT
CASE DB.COLUMN_ID
WHEN 1 THEN 'CREATE TABLE ' || DB.TABLE_NAME || '( '
ELSE ' '
END
||
TRIM(DB.COLUMN_NAME) || ' ' || TRIM(DB.DATA_TYPE) || '(' ||
CASE DB.DATA_TYPE
WHEN 'NUMBER' THEN TO_CHAR(DB.DATA_PRECISION,'FM000') || ',' || TO_CHAR(DB.DATA_SCALE,'FM00')
ELSE TO_CHAR(DB.DATA_LENGTH,'FM000')
END
|| ')' || ' DEFAULT ' ||
CASE DB.DATA_TYPE
WHEN 'NUMBER' THEN '0'
ELSE ''' '''
END
||
CASE DB.NULLABLE
WHEN 'N' THEN ' NOT NULL'
ELSE ' NULL'
END
||
CASE MAX_NO.MAX_GYO
WHEN DB.COLUMN_ID THEN ');'
ELSE ','
END
SQL_DATA
FROM user_tab_columns DB
LEFT JOIN (SELECT TABLE_NAME , MAX(COLUMN_ID) MAX_GYO FROM user_tab_columns GROUP BY TABLE_NAME) MAX_NO
ON DB.TABLE_NAME = MAX_NO.TABLE_NAME
LEFT JOIN user_col_comments DB_COL
ON DB.TABLE_NAME = DB_COL.TABLE_NAME
AND DB.COLUMN_NAME = DB_COL.COLUMN_NAME
WHERE DB.TABLE_NAME = 'もとのテーブル名'
ORDER BY DB.TABLE_NAME,DB.COLUMN_ID
;
でテーブルcreate文が生成できるので
最初のcreateの後のテーブル名称を新しい名前にしてテーブルを作成する
意外と使う
oracle テーブルの構成内容確認SQL
ORACLEで テーブルの項目名、桁数などを確認したいとき
ファイル仕様が見れない!!!!
でも!データベースを操作できる状況!
と言うときに以下のSQLで内容を確認することができる
SELECT
DB.TABLE_NAME テーブル名称
, MAX_NO.MAX_GYO
, DB.COLUMN_ID NO
, DB.COLUMN_NAME 項目名称
, DB.DATA_TYPE 項目型
, CASE DB.DATA_TYPE
WHEN 'NUMBER' THEN TO_CHAR(DB.DATA_PRECISION,'FM00000') || ',' || TO_CHAR(DB.DATA_SCALE,'FM0000')
ELSE TO_CHAR(DB.DATA_LENGTH,'FM00000')
END 項目桁数
, DB.DATA_DEFAULT デフォルト
, CASE DB.NULLABLE
WHEN 'N' THEN 'NOT NULL'
ELSE 'NULL'
END NULL許可
, DB_COL.COMMENTS
FROM user_tab_columns DB
LEFT JOIN (SELECT TABLE_NAME , MAX(COLUMN_ID) MAX_GYO FROM user_tab_columns GROUP BY TABLE_NAME) MAX_NO
ON DB.TABLE_NAME = MAX_NO.TABLE_NAME
LEFT JOIN user_col_comments DB_COL
ON DB.TABLE_NAME = DB_COL.TABLE_NAME
AND DB.COLUMN_NAME = DB_COL.COLUMN_NAME
WHERE DB.TABLE_NAME = '見たいテーブル名称' -----------見たいテーブルを指定する
ORDER BY DB.TABLE_NAME,DB.COLUMN_ID
;
実行結果
結構重宝する
ファイル仕様が見れない!!!!
でも!データベースを操作できる状況!
と言うときに以下のSQLで内容を確認することができる
SELECT
DB.TABLE_NAME テーブル名称
, MAX_NO.MAX_GYO
, DB.COLUMN_ID NO
, DB.COLUMN_NAME 項目名称
, DB.DATA_TYPE 項目型
, CASE DB.DATA_TYPE
WHEN 'NUMBER' THEN TO_CHAR(DB.DATA_PRECISION,'FM00000') || ',' || TO_CHAR(DB.DATA_SCALE,'FM0000')
ELSE TO_CHAR(DB.DATA_LENGTH,'FM00000')
END 項目桁数
, DB.DATA_DEFAULT デフォルト
, CASE DB.NULLABLE
WHEN 'N' THEN 'NOT NULL'
ELSE 'NULL'
END NULL許可
, DB_COL.COMMENTS
FROM user_tab_columns DB
LEFT JOIN (SELECT TABLE_NAME , MAX(COLUMN_ID) MAX_GYO FROM user_tab_columns GROUP BY TABLE_NAME) MAX_NO
ON DB.TABLE_NAME = MAX_NO.TABLE_NAME
LEFT JOIN user_col_comments DB_COL
ON DB.TABLE_NAME = DB_COL.TABLE_NAME
AND DB.COLUMN_NAME = DB_COL.COLUMN_NAME
WHERE DB.TABLE_NAME = '見たいテーブル名称' -----------見たいテーブルを指定する
ORDER BY DB.TABLE_NAME,DB.COLUMN_ID
;
実行結果
結構重宝する
登録:
投稿 (Atom)