忍者ブログ
[PR] ()
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

by
SQLローダー (技術メモ@Oracle)
SQLローダーはファイルの中身をテーブルに
そのまま突っ込む時に使うoracleの付属ツールです。
コマンドでsqlldrって叩くと使えます。

ファイル形式は色々なものに対応しているようですが、
主にcsvファイルを取り込むケースが多いと思います。
csvゆうてもカンマ区切りやタブ区切り、
ダブルコーテーションで括られているかそうでないか、
先頭行にヘッダ行があったりなかったりと
色々種類があります。

けど、SQLローダーはそこら辺も考慮された物になっています。
そういう細かい指定を制御するのがctlファイルと
呼ばれるファイルです。
通常はsqlldrコマンドの引数でこのファイルを指定する事に
なると思います。

ctlファイルの主な使い方は探せば簡単に見つかります。
なのでここでは見つけにくかった事を書きます。
ctlファイルでの指定では基本的にcsvの先頭から順に
テーブルのカラムを割り当てていきます。
ところが、csvにも取り込みたくないカラムが存在する事も
あるかと思います。(備考とか?)
その時の指定は
適当な名前 FILLER
です。
適当な名前の部分はホントに適当なものでいいようです。
大事なのはFILLERの方です。
これを指定するとcsvの現在のカラムはスキップされるようです。
一度覚えてしまえば後はこのキーワードで検索すれば
更に色々と情報が得られると思います。
けど、最初の取っ掛かりがないと中々調べるのも時間がかかります。
というかかかりました。

SQLローダー使ってみた感じ、結構楽ですね。
ctlファイルを書かなければいけないのは面倒ですが、
ダブルコーテーションの有無が混在していたりするものだと
特に効果的だと思います。
PR
by yy3Trackbacks()Comments(3)
セマンティクス (技術メモ@Oracle)
全然知らなかったのですが、今時ってVARCHAR2(5)とかの時に
全角半角問わず5文字入るんですね。
っていうのがこの話の発端です。

これは実はセマンティクスという物に依存しているようです。
今までは全角だとDBの項目長の半分までしか入力できないっていうのが
当たり前なシステムばっかやってたのでセマンティクスなんて知りませんでした。

セマンティクスにはバイトセマンティクスと文字(キャラクタ)セマンティクスがあり、
バイトの方が私が今までやってた方で、今回知ったのがキャラクタの方です。
キャラクタの方は文字数をベースとしているので5文字までだったら
全角も半角も5文字までは入るようです。
バイト指定の方はバイト単位で指定するので文字数制限がかかってきますが、
キャラクタ指定だと文字数制限はかからない分バイトがかさみそうです。

セマンティクスはNLS_LENGTH_SEMANTICSという初期化パラメータで設定されるらしく、
デフォルトではバイトのようです。

ちなみに余り見かけないNVARCHAR2というのはキャラクタセマンティクスで定義した
VARCHR2のようです。
つまり文字数で指定するタイプですね。
VARCHAR2自体もVARCHAR2(5 CHAR)とかすると
キャラクタセマンティクスになるみたいです。

キャラクタセマンティクスだとHTMLのmaxlengthとVARCHAR2で指定するサイズが
一致するので分かりやすいですね。
あと、Java側もただのlengthでいいし。
by yy3Trackbacks()Comments(0)
SQL Injection (技術メモ@Oracle)
私はSQL Injectionの定義をちゃんと知ってる訳ではないけど
大体やる事は分ってます。
・バインドを使用する(シングルコーテーションとかへの対策)
・エスケープ処理を行う(like検索時の%_対策)

今回はこのエスケープ処理に関するメモです。
エスケープ処理は入力値(バインドに渡すパラメータ)に
"%"、"_"が入ってた時に行うものです。
"%"は正規表現でいうところの"*"(%以降はなんでもあり)に、
"_"は同じく"."(1文字分だけなんでもあり)に相当してたと思います。
エスケープ処理としてはこの"%"、"_"の前にエスケープ文字を
付加する訳ですが、ただ付加するだけではダメだったりします。
エスケープ文字は固定の文字ではなく自分で決めれるようですが、
この文字がエスケープだよって事を明示的に書く必要があります。
それが"ESCAPE '文字'"です。

なのでエスケープ処理としては
・"%", "_"の前にエスケープ文字を追加(値編集)
・項目の後ろにESCAPE文を追加(SQL編集)
という2段階に分かれます。

エスケープを行ったあとの具体的な例:
入力値 → エスケープ後
COLUMN_A LIKE 'Orange100%Juice' → COLUMN_A LIKE 'Orange100%Juice%' ESCAPE ''
こんな感じです。
(最初の%は入力値としての%で最後の%は前方一致としてプログラム内部で付加した%)
バインドを絡めると
COLUMN_A LIKE ? → COLUMN_A LIKE ? ESCAPE ''
これがSQLでパラメータは別途エスケープ編集+LIKE文用の%付加処理が必要になります。

ちなみにエスケープ処理としてはこんな感じですが、
実際にはまずそもそもその項目に%という値は入ってるの?
ってとこからまず入っていく事になるんじゃないかな。
そもそも値として%禁止の項目であればSQLにまで到達させずに
事前に入力チェックで弾く事になると思います。
by yy3Trackbacks()Comments(0)
メモとか
MASTER : yy3
カレンダー
04 2025/05 06
S M T W T F S
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
最新記事
(10/28)
(08/18)
(07/27)
(07/27)
(07/15)
ブログ内検索
アクセス解析
OTHERS
Powered by 忍者ブログ
Designed by TABLE ENOCH
[PR]

△ページの先頭へ