物流・倉庫・WMS・プログラマ日記

物流・倉庫・WMS・プログラマ日記

在庫管理・倉庫管理を扱う事が多いプログラマの備忘録です。

【データベース解説】排他制御

こんにちは、EightyEightRiceです。

今日の記事は、データベース解説です。

データベースで扱う上で必要な考え方を解説しています。

今回は

排他制御

です。

一般には、論理学などで登場する用語ですが、

データベースの中ではとても重要な言葉です。

データベースを運用する上で欠かせない考え方なので、

ぜひ解説をご覧ください。

 

以下、解説です。

 

排他とは

まず結論からお話しすると、

データに対して、登録・更新・削除をしても、

データに矛盾が生じないようにする事を

排他処理

と呼びます。

具体例

具体例として、銀行口座から現金を引き出す処理を考えましょう。

2台のATMがあります。自分の口座には現金1000円が預けてあります。

1台目のATMにはキャッシュカード

2台目のATMには預金通帳

を挿入し、残高を確認すると、どちらも1000円と表示されます。

 

それぞれのATMから1000円ずつ引き出すと、合計2000円が引出されてしまいます。

これはおかしいですね。1000円の口座から2000円引出せています。

このような矛盾は発生してはいけません。

排他処理をして矛盾を発生させないようにします。

 

排他処理には楽観排他と悲観排他があります。

これはまた次の機会に解説したいと思います。

ここまでお読み頂きありがとうございました。

以上、排他処理の解説でした。

関連記事

eightyeightrice.hatenablog.com

eightyeightrice.hatenablog.com

【SQLを丁寧に理解する】ROWNUM と ORDER BY ~PART1:ROWNUMとは~

こんにちは、EightyEightRiceです。

 

今日の記事は、【SQLを丁寧に理解する】ROWNUM と ORDER BY ~PART1:ROWNUMとは~  です。

データベースを扱い場合に、よくハマってしまう項目について、丁寧に説明していきます。

ざっと読み飛ばすだけでも、

「へぇーそうなんだ」

と、思っていただけるような構成を心がけています。

 

今回は

ROWNUM と ORDER BY ~PART1:ROWNUMとは~

です。

こんな話を聞いた事はありませんか?

「ROWNUMとORDER BY を一緒に使ってはいけない」

 

結論は、「ROWNUMとORDER BYは、一緒に使って良い場合と悪い場合がある」です。

あるSQLの結果に対して、

ORDER BY でソートして、WHERE句で「ROWNUM = 1」のような使い方

は、かなり危険です。 

しっかりと理解する為に、以下の2つのポイントに分けて解説していきます。

・ROWNUMとは

SQLの実行順序

 

今回はROWNUMについて解説します。

 

ROWNUMとは正式名称をROWNUM疑似列といいます。

"疑似"というくらいなので、実際にデータとして存在するでありません。

SQL文のSELECT句に、通常の列を選択するように、

 

SELECT

    会社コード

  , 社員コード

,   ROWNUM

とROWNUMを記述できます。

SELECTの直後でも列Aと列Bの間でも任意の場所でOKです。

 

このSELECT文の実行結果に1から重複しない連番(※)として抽出されるのがROWNUMです。

具体的に、例えば上記SELECT文の結果が999行であった場合、以下のようなROWNUM列の値が得られます。

 

会社コード   会社コード    ROUNUM

A001             B003                  1

A002             B004                  2

A002             B005                  3

A100             B200              999

 

ここで 1から重複しない連番と意味についてですが以下のようになります。

"1から"        :0から100から始まったりせず必ず1から始まる

"重複しない" :番号全体の中で同じ番号がない、同じ番号は1度しか使えない

"連番"            :1の次は2、2の次は3というように飛び番号がない

 

今回解説したポイント

「ROWNUMの 1から重複しない連番

と、次回のポイントの 「SQLの実行順序」から、なぜ

ORDER BY でソートして、WHERE句で「ROWNUM = 1」のような使い方

は、かなり危険なのか解説していきます。

 

以上、解説でした。

 

/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_

SQLについて質問があれば随時募集しています。

ご遠慮なくお問い合わせください.

/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_

 

【SQLを丁寧に理解する】CHARとNCHAR PART1【ORACLEの場合】

こんにちは、EightyEightRiceです。

 

今日の記事は、【SQLを丁寧に理解する】CHARとNCHAR【ORACLEの場合】です。

データベースを扱い場合に、よくハマってしまう項目について、丁寧に説明していきます。

ざっと読み飛ばすだけでも、

「へぇーそうなんだ」

と、思っていただけるような構成を心がけています。

 

今回は

CHARとNCHAR PART1【ORACLEの場合】

です。

(VARCHAR2とNVARCHAR2も同じ考え方でOKなので、以下の文章を、

CHAR➡VARCHAR2、NCHAR➡NVARCHAR2に置き換えて読んでください。)

 

よくこんなセリフを聞きます。

「CHARの制約はバイト数で、NCHARの制約は文字数」

 

結論から言うと、普通にPLSQLを書いていれば上記は正しいです。

 以下、解説です。

 

ある変数が CHAR(3) と宣言してある場合、3バイトになります。

なぜでしょうか?

実は、CHARの正確な宣言は、

 CHAR( 3 BYTE) や、CHAR( 3 CHAR)

になります。

ただし、"()"の中の「BYTE」や「CHAR」を省略した場合、

デフォルトで「BYTE」を選択した事になり、

CHAR(3)は3バイトになります。

 

一方で、

 NCHAR(3) と宣言してある場合、3文字になります。

NACHARも実際は、

 NCHAR( 3 BYTE) や、NCHAR( 3 CHAR)

のように宣言できます。

NCHARの場合は「BYTE」や「CHAR」を省略した場合、

デフォルトで「CHAR」を選択した事になり、

NCHAR(3)は3バイトになります。

 

・結論

「CHAR(3)の制約は3バイト」

「NCHAR(3)の制約は3文字」

 

以上、解説でした。

 

/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_

SQLについて質問があれば随時募集しています。

ご遠慮なくお問い合わせください.

/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_

 

プライバシーポリシー

はじめに

物流・倉庫・WMSプログラマ日記

( https://blog.hatena.ne.jp/EightyEightRice/eightyeightrice.hatenablog.com/、以下当サイト)は、個人情報に関する法令等を順守し、個人情報を適切に取り扱います。

広告の配信について

当サイトは第三者配信の広告サービス「Google Adsense グーグルアドセンス」を利用しています。

広告配信事業者は、ユーザーの興味に応じた広告を表示するためにCookie(クッキー)を使用することがあります。

Cookie(クッキー)を無効にする設定およびGoogleアドセンスに関する詳細は「広告 – ポリシーと規約 – Google」をご覧ください。

また、[サイト名]は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイトプログラムである、Amazonアソシエイト・プログラムの参加者です。

三者がコンテンツおよび宣伝を提供し、訪問者から直接情報を収集し、訪問者のブラウザにCookie(クッキー)を設定したりこれを認識したりする場合があります。

アクセス解析ツールについて

当サイトでは、Googleによるアクセス解析ツール「Googleアナリティクス」を利用しています。

このGoogleアナリティクスはトラフィックデータの収集のためにCookieを使用しています。このトラフィックデータは匿名で収集されており、個人を特定するものではありません。この機能はCookieを無効にすることで収集を拒否することが出来ますので、お使いのブラウザの設定をご確認ください。この規約に関して、詳しくはここをクリックしてください。

当サイトへのコメントについて

当サイトでは、スパム・荒らしへの対応として、コメントの際に使用されたIPアドレスを記録しています。

これはブログの標準機能としてサポートされている機能で、スパム・荒らしへの対応以外にこのIPアドレスを使用することはありません。また、メールアドレスとURLの入力に関しては、任意となっております。全てのコメントは管理人が事前にその内容を確認し、承認した上での掲載となりますことをあらかじめご了承下さい。加えて、次の各号に掲げる内容を含むコメントは管理人の裁量によって承認せず、削除する事があります。

・特定の自然人または法人を誹謗し、中傷するもの。

・極度にわいせつな内容を含むもの。

・禁制品の取引に関するものや、他者を害する行為の依頼など、法律によって禁止されている物品、行為の依頼や斡旋などに関するもの。

・その他、公序良俗に反し、または管理人によって承認すべきでないと認められるもの。

免責事項

当サイトで掲載している画像の著作権・肖像権等は各権利所有者に帰属致します。権利を侵害する目的ではございません。記事の内容や掲載画像等に問題がございましたら、各権利所有者様本人が直接メールでご連絡下さい。確認後、対応させて頂きます。

当サイトからリンクやバナーなどによって他のサイトに移動された場合、移動先サイトで提供される情報、サービス等について一切の責任を負いません。

当サイトのコンテンツ・情報につきまして、可能な限り正確な情報を掲載するよう努めておりますが、誤情報が入り込んだり、情報が古くなっていることもございます。

当サイトに掲載された内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。

【物流用語】荷役料



こんにちは、プログラマのEightyEightRiceです。

 

今日の記事は、物流用語解説です。

物流システム(WMS:Warehouse Management System)を扱う場合に、よく使う用語を解説しています。

 

今回は

 

荷役料(にやくりょう)

 

です。

 

物流業界でない人たちには、あまり馴染みのない言葉かも知れません。

実はかなり古くから使われている言葉で、江戸時代でも使用していたそうです。

 

以下、解説です。

 

荷役料とは

ある荷主さんのアイテムがあります。

このアイテムを

1.倉庫に格納する為に行う作業

2.倉庫から運び出す為に行う作業

 

荷役といいます。

この倉庫を運営しいる倉庫倉庫会社は、荷主さんに対し、荷役の料金を請求します。

この料金を荷役料と言います。

 

具体例

大まかには、アイテムを倉庫に格納する為に

・トラック等から荷物を下ろす

・下ろした荷物を棚に格納する

 ➡入庫料

 

アイテムを倉庫から搬出する為に

・棚からアイテムを取り出す(ピッキング検品)

・トラックにアイテムを積み込む(出庫検品・積込検品)

 ➡出庫料

 

の2つが荷役料になります。

アイテムによって重さや大きさが異なる為、

アイテムごとに荷役料を設定する事もあります。 

 

また、いずれ出庫する事を前提にして、入庫の際に出庫料も請求するという運用もあるそうです。

 

f:id:EightyEightRice:20200425043513p:plain

フォークリフトによる在庫移動

 

以上、荷役料(にやくりょう)の解説でした。

関連記事


【SQLを丁寧に理解する】SQL文の大文字小文字【ORACLEの場合】PART1

こんにちは、EightyEightRiceです。

 

今日の記事は、【SSQLを丁寧に理解する】SQL文の大文字小文字【ORACLEの場合】PART1です。

データベースを扱い場合に、よくハマってしまう項目について、丁寧に説明していきます。

ざっと読み飛ばすだけでも、

「へぇーそうなんだ」

と、思っていただけるような構成を心がけています。

 

今回は

SQL文の大文字小文字【ORACLEの場合】PART1

です。

 

SQLやPLSQLをみると、大文字と小文字を両方見かけますね。

 

例えば、

SLECT * FROM DUAL
case when COLUMN_A = 'abc' then ...

などがあり、

極端な例で言えば、こんなのもありますね。

if A = b ThEn ...

 

実際ORACLEはどのようにSQL文やPLSQLを解釈しているか、

疑問に思うと思います。

 

これをすっきり理解する為に、以下のルールを覚えましょう。

SQL文の大文字小文字

SQL文は実行時にすべて大文字に変換される」

 

意外と簡単ですね。

実際SQL文は実行時に一部例外を除いて、すべて大文字に変換されます。

よって、先ほどの例は、以下の様に変換されて実行されます。

SELECT * FROM DUAL
➡ SELECT * FROM DUAL /* 変換なし */
case when COLUMN_A = 'abc' then ...
➡ CASE WHEN COLUMN_A = 'abc'  THEN ... /* 'abc'は値なので変換されない */
if A = b ThEn ...
➡ IF A = B THEN...

 関数名やテーブル名も大文字に変換されます。

trim(columna)
➡ TRIM(COLUMNA)
UPDATE tableA SET... 
➡ UPDATE TABLEA SET...

つまり、PLSQLにおいて以下の点に注意が必要です。

DECLARE
  intA NUMBER(10);
  INTa NUMBER(10);
   ・
   ・
BEGIN
   ・

上記の場合、以下のように変換されます。

intA ➡ INTA
INTa ➡ INTA

 宣言での変数名が重複し、コンパイルエラーになってしまいます。

 

以上、解説でした。

関連記事

記事一覧

【SQLを丁寧に理解する】CHARとVARCHAR2【ORACLEの場合】PART6

こんにちは、EightyEightRiceです。

 

今日の記事は、【SQLを丁寧に理解する】CHARとVARCHAR【ORACLE】PART6です。

データベースを扱い場合に、よくハマってしまう項目について、丁寧に説明していきます。

ざっと読み飛ばすだけでも、

「へぇーそうなんだ」

と、思っていただけるような構成を心がけています。

 

今回は

 

CHARとVARCHAR2【ORACLEの場合】PART6

 

です。

 

前回までで、

 

CHAR同士のSQLの等式

「CHAR同士の比較は後ろの空白は無視して比較して良い」

 

VARCHAR2同士のSQLの等式

「VARCHAR2同士の比較は後ろの空白は無視してはいけない」

 

を解説しました。

ちなみにCHARとVARCHAR2の等式は、

VARCHAR2同士の比較ルールが適用されるのでした。

 

今回は応用編です。

関数を絡めた文字列の等式についてさらに深堀していこうと思います。

 

以下のSQLの等式はTRUでしょうか、FALSEでしょうか。

・TRIM('A  ') = 'A          '

(右辺左辺ともにCHAR型としています。)

 

左辺のTRIMは文字列の前後の空白を取り除く関数なので、

・TRIM('A  ') ➡ 'A'

となりますね。

 

すると、最初のSQLの等式は以下のように書き換えられます。

・TRIM('A  ') = 'A          ' ➡ 'A' = 'A          '

したがって、CHAR同士の比較ルール 

「CHAR同士の比較は後ろの空白は無視して比較して良い」

 を適用し、TRUEでしょうか。

 

実はこれは間違いです。なぜでしょうか。

 

理由は簡単です。TRIM()という関数の戻り値の型が、

VARCHAR2なんですね。

つまり、

・TRIM('A  ') = 'A          ' ➡ 'A' = 'A          '

 (左辺 CHAR型、右辺 VARCHAR2型)

 となりますね。

比較しているのは、CHARとVARCHAR2なので、

VARCHAR2同士の比較ルール

「VARCHAR2同士の比較は後ろの空白は無視してはいけない」

 が適用されます。

よって、結果はFALSEとなります。

 

以下に、何パターンかSQLの等式を示します。

 (両辺がCHARとします。)

・TRIM('ABC') = 'ABC'    (TRUE)

・TRIM('ABC      ') = 'ABC'    (TRUE)

・TRIM('A          ') = TRIM('A          ')  (TRUE)

・TRIM('A    ') || ' ' = 'A '  (TRUE)

  

CHAR同士、VARCHAR2同士の比較ルールを理解し、

どのパターンを当てはめるかを意識していきましょう。

 

以上、解説でした。