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

2021年12月10日金曜日

SQL Serverのリンクサーバ Oracle設定内容

 サーバ側にORACLE Client & OLEDBがインストールされていること

リンクサーバーの設定をする

SQL Server Management Studioからの設定方法。
1. SQL Serverに接続して、サーバーオブジェクト->リンクサーバー->プロバイダーを開く
2. OraOLEDB.Oracleをダブルクリック
3. InProcess許可にチェックを付けてOKとする
4. リンクサーバーで右クリックして、新しいリンクサーバーを作成
5. 以下の様に設定してOKとする

ページ項目設定値
全般リンクサーバー任意

サーバーの種類その他のデータソース

プロバイダーOracle Provider for OLE DB

製品名Oracle

データソースサーバ(IP等):ポート番号/サービス (例:192.168.11.1:1521/oradb)

プロバイダー文字列
セキュリティローカルサーバーのログインとリモートサーバーのログインのマッピングなし

上記一覧で定義されないログインの接続方法このセキュリティコンテキストを使用する

リモートログインOracle接続時のユーザー名

パスワードOracle接続時のパスワード

2021年10月1日金曜日

Oracle SQLPlusでCSV出力

 Oracle SQL PlusでCSV出力

SET MARKUP CSV ON
SET HEADING OFF

SET ARRAYSIZE 100
SET FLUSH OFF
SET LINESIZE 200
SET PAGESIZE 0
SET SQLPROMPT OF
SET FEEDBACK OFF
SET TIMING ON
SET TERMOUT OFF
SET TRIMSPOOL ON
SET SERVEROUTPUT OFF

SPOOL c:\temp\WRK_JYUSHOMO.csv
SELECT * FROM WRK_JYUSHOMO;
SPOOL OFF

 

1行目のMARKUP CSV ONでCSV出力形式にしてくれる

2行目のHEADING  OFFで出力レコードに項目名レコード出力を無しにする

 

2018年11月6日火曜日

DataPump(expdp,impdp)処理をCtrl+C押しでキャンセルさせてしまった時の対処方法

DataPump(expdp,impdp)処理をCtrl+C押しでキャンセルさせてしまった時の対処方法

OracleでexpdpやimpdpといったData Pumpを実行中に、expコマンドのようにCtrl+Cで処理をキャンセルしてはいけません。 そこがややこしいところ。
もしCtrl+Cでキャンセルしても、処理はバックグラウンドで動き続けます
というわけで、Data Pumpを実行中に誤ってCtrl+Cでキャンセルしてしまった時の対処方法をご紹介です。

JOB名から停止する

処理のJOB名を確認します。
1$ sqlplus sys as sysdba
2select * from DBA_DATAPUMP_JOBS;
3----
4job_expdp1
5----
動作中のJOB名が job_expdp1 ということが分かりました。
あとはこのJOBを指定してコマンドモードに接続して kill_job を発行すれば完了です。
1$ expdp hoge/hogepass attach = job_expdp1
2Export> kill_job
3このジョブを停止しますか([yes]/no)yes
これでバックグラウンドで動作していたData Pump処理が強制終了されます。

元ネタ http://www.lesstep.jp/step_on_board/oracle/77/

2018年11月2日金曜日

Oracle ExpDpのパラメータ and ImpDpのパラメータ

batch file
expdp user/pass@ORCL parfile=exp_m.txt

exp_m.txt
DIRECTORY=ORA_EXP
DUMPFILE=exp_m
LOGFILE=exp_m.log
reuse_dumpfiles=YES
TABLES=(hogehome)



batch file
impdp user/pass@ORCL parfile=imp_m.txt


imp_m.txt
directory=ORA_EXP
dumpfile=exp_m.dmp
logfile=impdp_m.log
TABLE_EXISTS_ACTION=REPLACE
TABLES=(hogehoge)

2018年10月23日火曜日

Oracle Sqlplusで余計な出力をしない方法

set echo off
set linesize 1000
set pagesize 0
set trimspool on
set feedback off
set colsep ','
spool c:\temp\tab.csv
select * from tab;
spool off

2018年10月22日月曜日

VBSCript Oracle接続

VBScript Oracle接続の例
' *********************************************************** ' Oracle 2 CSV ' ADO : 文字列更新 ' FileSystemObject : CSV出力 ' *********************************************************** strTarget = "Oracle11gMS" strUser = "lightbox" strPass = "LIGHTBOX" ' *********************************************************** ' ADO + FileSystemObject ' *********************************************************** Set Cn = CreateObject( "ADODB.Connection" ) Set Rs = CreateObject( "ADODB.Recordset" ) Set Fso = CreateObject( "Scripting.FileSystemObject" ) ' ********************************************************** ' 接続文字列 ' ********************************************************** ConnectionString = _ "Provider=MSDASQL" & _ ";DSN=" & strTarget & _ ";UID=" & strUser & _ ";PWD=" & strPass & _ ";" ' ********************************************************** ' 接続 ' クライアントカーソル(3)を使う事が推奨されます ' ********************************************************** Cn.CursorLocation = 3 on error resume next Cn.Open ConnectionString if Err.Number <> 0 then WScript.Echo Err.Description Wscript.Quit end if on error goto 0 Query = "select * from 社員マスタ" ' ********************************************************** ' レコードセット ' オブジェクト更新時はレコード単位の共有的ロック(3)を ' 使用します( デフォルトでは更新できません ) ' ※ デフォルトでも SQLによる更新は可能です ' ********************************************************** 'Rs.LockType = 3 on error resume next Rs.Open Query, Cn if Err.Number <> 0 then Cn.Close Wscript.Echo Err.Description Wscript.Quit end if on error goto 0 ' ********************************************************** ' 出力ファイルオープン ' ********************************************************** Set Csv = Fso.CreateTextFile( "社員マスタ.csv", True ) ' ********************************************************** ' タイトル出力 ' ********************************************************** Buffer = "" ' 社員コードと氏名のみ For i = 0 to 1 if Buffer <> "" then Buffer = Buffer & "," end if Buffer = Buffer & Rs.Fields(i).Name Next Csv.WriteLine Buffer ' ********************************************************** ' データ出力 ' ********************************************************** UpdateCnt = 0 Do While not Rs.EOF Buffer = "" Buffer = Buffer & Rs.Fields("社員コード").Value Buffer = Buffer & "," & Rs.Fields("氏名").Value ' 更新 strDay = (UpdateCnt mod 10) + 1 Query = "update 社員マスタ set 生年月日 = TO_DATE('2005/01/" & strDay & "')" Query = Query & " where 社員コード = '" Query = Query & Rs.Fields("社員コード").Value Query = Query & "'" Cn.Execute( Query ) Csv.WriteLine Buffer Rs.MoveNext UpdateCnt = UpdateCnt + 1 Loop ' ********************************************************** ' ファイルクローズ ' ********************************************************** Csv.Close ' ********************************************************** ' レコードセットクローズ ' ********************************************************** Rs.Close ' ********************************************************** ' 接続解除 ' ********************************************************** Cn.Close

2018年9月5日水曜日

OracleClientのDataReaderとDapperは共存出来なかった

OracleClientのDataReaderとDapperは共存出来なかった

OracleClientのDataReaderを使って read.ExecuteReader(); を実行しても
レコードを取得しなかった。

Dapperをusingから除外したら、動作しました。

2018年6月19日火曜日

Oracle expdpでdump fileの上書きオプション

Oracle expdpでdump fileの上書きオプション

REUSE_DUMPFILES=YES

このオプションが無いと、上書きしていなかった。
バックアップファイルの確認をして良かった。


2017年12月19日火曜日

久々にOrcaleチューニング
設定方法忘れたので、他からメモを拝借
DBAの知識ないから、DBの設定ぶっ壊して、1から入れなおしかなーなんて思える状態から脱却できたので、メモっておこう!

SGAの現在のメモリ割当を確認。
sqlplus / as sysdba
show parameter sga_;
NAME TYPE VALUE
------------- ------------ -------
sga_max_size big integer 2G
sga_target big integer 2G
ここで、以下のように容量変更を実行するのはダメ。
sqlplus / as sysdba
alter system set sga_max_size = 4G scope=spfile;
alter system set sga_target = 4G scope=spfile;
なぜなら、メモリの物理的な割当を超過したSGAを設定すると、壊れる
以下を実行し、memory_max_target、memory_targetがそれにあたる。
メモリ割当容量を変更する場合には、この物理的な割当容量を確認する手順は必須だ。
sqlplus / as sysdba
show parameter memory_;
NAME TYPE VALUE
------------------------- ------------ --------
hi_shared_memory_address integer 0
memory_max_target big integer 3G
memory_target big integer 3G
shared_memory_address integer 0

MEMORY_MAX_TAEGETMEMORY_TARGETの説明によると、MEMORY_TARGETがOracleが利用するメモリ割当量で、その範囲内でSGAやPGAを設定する。
つまり、いきなりSGAのメモリ割当量を変更し、MEMORY_TARGET割当量≦SGA割当量となると、設定としてはNGだ。
よって、まず変更すべきはSGAではなくMEMORY_TARGETだ。
また、SGAに4GBを割り当てたいなら、MEMORY_TARGETは4GBより大きくなければならない
それぞれの項目の説明はSGA_MAX_SIZESGA_TARGETを参照してほしい。
sqlplus / as sysdba
alter system set memory_max_target = 5G scope=spfile;
alter system set memory_target = 5G scope=spfile;
そのあとにSGAを変更する。
sqlplus / as sysdba
alter system set sga_max_size = 4G scope=spfile;
alter system set sga_target = 4G scope=spfile;
んでインスタンス再起動
sqlplus / as sysdba
shutdown immediate
startup
これで、Oracleで利用する物理メモリ容量の増加と、SGA容量の増加を行える。

で、これから俺がやらかした状態と、解消手順。
壊した経緯
1.もともと物理的に1.6GBくらいしか割り当ててない。
2.物理割当を確認せずにSGAを4GBに変更。
3.インスタンスの再起動ができなくなる。
再起動すると、こんなメッセージが。
ORA-00844: Parameter not taking MEMORY_TARGET into account
ORA-00851: SGA_MAX_SIZE 4294967296 cannot be set to more than MEMORY_TARGET 1690304512.
SGA_MAX_SIZEがMEMORY_TARGETを超えてんぞコラってことみたい。
こうなると、もうインスタンスへの接続もできないので、以下の手順を踏まないと直せない。
1.spfileからpfileを生成する。
/ as sysdba
create pfile from spfile;

  %ORACLE_HOME%\database\INIT<SID>.ORAが作成されます。
  %ORACLE_HOME%は、11gのデフォルトなら「D:\app\Administrator\product\11.2.0\dbhome_1」とかで、
  INIT<SID>.ORAは、インスタンス名が「HOGE」なら「INIThoge.ORA」ってファイルがある。
2.INIT<SID>.ORAをテキストエディタで編集する。
  以下では、MEMORY_TARGETを5GB、SGAを4GBに設定してみる。
<SID>.__sga_target=4294967296
*.memory_target=5368709120
*.sga_max_size=4294967296
*.sga_target=4294967296

3.INIT<SID>.ORAを利用してインスタンスを起動する。
  注意する点は、指定するのはファイル名だけではなくてフルパスで指定する。
sqlplus / as sysdba
startup pfile="D:\app\Administrator\product\11.2.0\dbhome_1\database\INIT<SID>.ORA"

4.起動できたら、pfileの設定をspfileに書き戻す。
  注意する点は、指定するのはファイル名だけでいい。
/ as sysdba
create spfile='SPFILE<SID>.ORA' from pfile='INIT<SID>.ORA';

5.んでいつも通りのインスタンスの再起動をしてみて、起動すればOK。
sqlplus / as sysdba
shutdown immediate
startup

2017年6月28日水曜日

php + oracle 環境で、接続出来ない

php + oracle 環境で、接続出来ない

PHP5.6の場合
http://windows.php.net/downloads/pecl/releases/oci8/2.0.12/php_oci8-2.0.12-5.6-ts-vc11-x86.zip

上記よりdlしたdllを pphp/extのフォルダにコピーする

2017年3月28日火曜日

Oracle -> MySQL SQL変換メモ

http://terukizm.hatenablog.com/entry/20110801/1312181426

■システム日付
・Oracle
SYSDATE

・MySQL
NOW()
■日付型→文字列型変換(YYYY/MM/DD)
・Oracle:
TO_DATE(TO_CHAR(SYSDATE), 'YY-MM-DD')

・MySQL:
DATE_FORMAT( SYSDATE() , '%Y-%m-%d')
■TRUNC(日付)
・Oracle
TRUNC(SYSDATE)

・MySQL
DATE(SYSDATE())
■ADD_MONTH
・Oracle
ADD_MONTHS(SYSDATE, 1)

・MySQL
DATE_ADD(SYSDATE(),INTERVAL 1 MONTH)
■MONTHS_BETWEEN
・Oracle
MONTHS_BETWEEN(SYSDATE, SYSDATE+1)

・MySQL
DATEDIFF(SYSDATE(), SYSDATE()+1)
■TO_NUMBER
・Oracle
TO_NUMBER('-100')

・MySQL
CAST('-0008000' as signed)
■TO_DATE
・Oracle
TO_DATE('9999/12/31', 'YYYY/MM/DD')

・MySQL
STR_TO_DATE('9999/12/31', '%Y/%m/%d')
■NULL文字変換
・Oracle: 
NVL(exp1,exp2)

・MySQL:
IFNULL(exp1, exp2)

■外部結合
・Oracle:
WHERE
 A.id(+) = B.id

・MySQL:
 FROM A
  RIGHT OUTER JOIN B
    ON (A.id = B.id)


・Oracle:
WHERE
 A.id = B.id(+)

・MySQL:
 FROM A
  LEFT OUTER JOIN B
    ON (A.id = B.id)

2016年4月20日水曜日

c# OracleテーブルをCSVで出力

OracleテーブルをCSVで出力
C#で作成

using System;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Windows;
using System.IO;
using Oracle.DataAccess.Client;

namespace Ora2CSV
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow() {
            InitializeComponent();
        }

        private void button_Click(object sender, RoutedEventArgs e) {
            using(var conn = new OracleConnection(ConfigurationManager.ConnectionStrings["LogisConnStr"].ToString())) {

                conn.Open();

                //データ取得
                var cmd = new OracleCommand();
                cmd.Connection = conn;
                cmd.CommandText = "SELECT * FROM " + txtTable.Text;

                var dr = cmd.ExecuteReader();
                var Enc = Encoding.GetEncoding("Shift-JIS");
                var wr = new StreamWriter(@"c:\temp\" + txtTable.Text + ".csv", false, Enc);

                string strRec = "";

                for (int i = 0; i < dr.FieldCount - 1; i++) {
                    strRec = strRec + @"""" + dr.GetName(i).ToString() + @"""" + ",";
                }

                //行末の[,]を削除
                strRec = strRec.Remove(strRec.Length - 1, 1);

                //ヘッダ1行出力
                wr.WriteLine(strRec);

                //データ行
                while(dr.Read()) {
                    strRec = "";

                    for (int i = 0; i < dr.FieldCount - 1; i++) {

                        string vName = dr.GetName(i);
                        string vType = dr.GetProviderSpecificFieldType(i).ToString();

                        if (dr.GetProviderSpecificFieldType(i).ToString() == "Oracle.DataAccess.Types.OracleDecimal") {
                            strRec = strRec + dr[i].ToString() + ",";
                        }
                        else {
                            strRec = strRec + @"""" + dr[i].ToString() + @"""" + ",";
                        }
                    }

                    //行末の[,]を削除
                    strRec = strRec.Remove(strRec.Length - 1, 1);

                    //データ1行出力
                    wr.WriteLine(strRec);
                }

                wr.Close();
                conn.Close();

                MessageBox.Show("Complete!");
            }
        }
    }
}

2016年1月5日火曜日

visual studioのcrystal reportは修正すると実行版をversionUPしないとNG

visual studioのcrystal reportは修正すると実行版をversionUPしないとNG

visual studio 2008で作成したcrystal reportを visual studio 2012で修正すると
レポートをversionUPしないと、保存出来ない。

レポートをversionUPすると、実行版もversionUPしないといけないとは

以下のurlから最新の実行版をdownload
http://scn.sap.com/docs/DOC-7824

windows 2012r2は64bitだから crystal repotも64bitと考えていたら
接続先のDBがOracleで、Oracle clinetが32bitだった。

上記の場合、crystal reportの実行版も32bitにしないとOracleに接続出来ない。

2015年4月14日火曜日

Oracle検索で大文字小文字を区別なく検索する

 Oracle検索で大文字小文字を区別なく検索する

WHERE NLSSORT(得意先名,'NLS_SORT=JAPANESE_M_CI') like '%'||NLSSORT('ガ','NLS_SORT=JAPANESE_M_CI')||'%'


上記だと、うまく行かなかった

select namefrom 製品マスタ
whereUTL_I18N.TRANSLITERATE(UPPER(TO_MULTI_BYTE(name)),'kana_fwkatakana')like '%' || UTL_I18N.TRANSLITERATE(UPPER(TO_MULTI_BYTE( 検索文字 )),'kana_fwkatakana') || '%'
※'kana_fwkatakana'はすべてのタイプの仮名文字を全角カタカナに変換します。

2014年9月10日水曜日

Oracle Undo領域の縮小

Oracle Undo領域の縮小

別のUndo領域を作成

Undo2などを新規に作成する

現在使っているundoを新規に作成したundoに切り替える

ALTER SYSTEM SET UNDO_TABLESPACE = 'UNDO2';
 
その後、前のundoを削除する
 

2014年8月26日火曜日

Oracle 監査設定(AUDIT_TRAIL)の変更・不要データの削除方法

監査設定(AUDIT_TRAIL)の変更・不要データの削除方法

高度セキュリティ設定を維持 を指定すると、パスワード有効期限や
失敗許容回数など、プロファイルが厳格になりセキュリティが強化される。
よって運用ルールに合わせて設定値の見直しを行ったりする。
DBCAの高度セキュリティ設定維持
詳細内容はOracle11gのDBCAで高度セキュリティ設定を維持を選択すると?で前に書いたが、
11gR2からは有無を言わさず必須となった模様。
プロファイル系のセキュリティ設定のみとうっかりスルーしていたが、
監査設定が有効になるのを忘れてはいけなかった(恥)。
初期化パラメータ audit_trail を確認すると、 VALUE が DB 。
DB監査が設定されていることが分かる。
SQL> show parameter audit_trail

NAME            TYPE   VALUE
--------------- ------ ---------------
audit_trail     string DB
ちなみに OS 監査なら VALUE が OS 、未設定なら NONE となる。

何を懸念したか

監査設定(DB)がされていると、システム表領域の SYS.AUD$ テーブルに
ログが Insert され続ける。低スペックだったり、こじんまりとした共用環境なんかだと、
パフォーマンス低下や、領域圧迫に繋がる可能性も否定できない。
監査機能そのものは有用だが、そもそも監査が必要ない環境も有ると言うわけで、、
ちょっと掃除をしてみる。

監査無効化とデータ削除手順

では本題の、監査設定(AUDIT_TRAIL)の変更と、不要データの削除方法について。

SYS.AUD$ テーブルの件数を確認

$ sqlplus / as sysdba

SQL> select count(*) from AUD$;

  COUNT(*)
----------
     60127
確認すると6万件程度。作成間もない環境なので、大した件数ではなかった。
もしバックアップが必要ならこのタイミングで、ダンプを取得しておけばよい。

初期化パラメータ audit_trail を変更する

SQL> alter system set AUDIT_TRAIL = none scope = spfile;

データベースを再起動

SQL> shutdown immediate

$ sqlplus / as sysdba

SQL> startup

初期化パラメータが変更されたことを確認

SQL> show parameter audit_trail

NAME            TYPE   VALUE
--------------- ------ ---------------
audit_trail     string NONE
→ 無効(NONE)となった。

データを削除

truncate table SYS.AUD$;

SYS.AUD$ テーブルの件数

SQL> select count(*) from AUD$;

  COUNT(*)
----------
         0