ラベル oracle の投稿を表示しています。 すべての投稿を表示
ラベル oracle の投稿を表示しています。 すべての投稿を表示

2017年2月15日水曜日

別の記事から参照 命名規約

“よくあるファイル命名ルール”でデータ消失の危機?
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
など明らかに分かりやすいものにしておかないと
引きついだ時にも痛い目をみるので注意したい

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の最大値と上限に現在数が達している場合
プロセス数又はセッション数の増強を考える必要がある


2016年9月1日木曜日

データベースとプログラムの文字コード

某お客の話

データベースが 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'

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)

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 'コメント';
  いつ追加したか、なんの項目か、区分の場合区分の説明等をつけると
  あとでわかりやすい

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の後のテーブル名称を新しい名前にしてテーブルを作成する

意外と使う

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
;

実行結果
 

結構重宝する