PL/SQLの理解と利用に関するシリーズ記事のパート5 このPL/SQL入門シリーズの前回までの記事では、PL/SQLベースのアプリケーションで文字列と数値を操作する方法について取り上げました。間違いなく、文字列と数値は重要ですが、それに加えて日付を使用しないアプリケーションはほぼ存在しません。イベントの実施日、生年月日などを追跡する必要があるからです。 そのため、次のことがかなり頻繁に必要になります。 日付の変数と定数を宣言する 日付の値を表示、変更するための組込みファンクションを使用する 日付に対して計算を実行する また、日付は、文字列や数値よりもかなり複雑なデータ型です。複数の要素(年、月、日、時など)で構成され、有効な日付に関する多くのルールが存在します。この記事では、PL/SQLプログラムで日付の操作を始めるために必要となるすべての情報を提供します。 PL/SQLでの日付、タイム
Access,SQLServerの場合 AccessとSQLServerは +演算子を使用して文字列を連結します. SELECT '文字列1' + '文字列2' + ... Oracleの場合 OracleはCONCAT関数を使用するか ||演算子を使用して文字列を連結します. SELECT CONCAT('文字列1', '文字列2') SELECT '文字列1' || '文字列2' || ... MySQLの場合 MySQLはCONCAT関数を使用して文字列を連結します.なお,||演算子はMySQLでは論理和(OR)として解釈されるため,文字列連結の用途には使用できません. SELECT CONCAT('文字列1', '文字列2', ...) PostgreSQLの場合 PostgreSQLは ||演算子を使用して文字列を連結します. SELECT '文字列1' || '文字列2' ||
日付に関する関数の逆引き SQLリファレンス、日付に関する関数の逆引き SQLリファレンス
今、家計簿アプリケーション作成の中でとりあえずOracleにテーブルを作成してデータを格納しようとしていたところうまくいかない箇所があった。 一旦自分のWindowsマシンにあるOracleにSQL*Plusを経由して接続するところまでは問題なく進み、その後テーブル(Category_mst:項目マスタ)を作成した。 項目マスタのテーブル設定 Category_idには項目IDを設定(例:K01) Category_nameには項目名を設定(例:給料) ここまでは普通に出来たので、SQLファイルにInsert文を作成して実行したのだけど、何度やっても失敗してしまう。 ↓ 何故か(?)失敗してしまう。 調べた結果、上記のSQLの書き方はOracleでは実行できないことがわかった。(端的にいうと、MySQL用の書き方だったようだ) なので、Oracle用のやり方を調べてSQL文を書き直した。
プロプログラマ プログラマーを職業としてます。 Flex,Air,C#,Oracle,HTML+JSの言語ノウハウを中心に情報発信していきます ある日、Oracleデータベースにログインしようとしたところ、ログインはできましたが、以下のようなメッセージが同時に表示されました。 ERROR: ORA-28002: パスワードは、3日以内に期限切れになります。 調べてみたところ、Oracle11gではパスワードの有効期限がデフォルトで180日になっているようです。 セキュリティ上は必要な機能ですが、企業内で使用するDBのパスワードはあまり変更しないですよね。 使用するアプリ側にもパスワードを記載したりしますので、変更するといろいろなところに問題が発生します。 10gまでのように、デフォルトのパスワード有効期限を無期限にするには、以下のSQLをSYSユーザーなどで実行します。 alter pro
GROUP BYするときに、countだけでは、うまく集計できないことが多々ある。 それはもう結構ある。 そういうときは、sumとCASEもしくは、sumとDECODEである。 CASEとDECODEの違いは、 CASE と DECODE 関数の違い - オラクル・Oracleをマスターするための基本と仕組み を参考にしていただくとして、ここでは書式に慣れたいと思う。 リンク先で 引用: DECODE( expr, comparison_expr1, ret_expr1, comparison_expr2, ret_expr2, default_expr ); CASE expr WHEN comparison_expr1 THEN ret_expr1 WHEN comparison_expr2 THEN ret_expr2 ELSE default_expr ENDと とてもわかりやすく
CASE 式 と DECODE 関数の違い 標準 SQL の CASE 式 とオラクルの SQL 特有の DECODE 関数は、ほぼ同じ機能をもち、CASE 式 も DECODE 関数 も短絡評価(※)であるが、この2つは NULL の取り扱い方で大きく異なっている。 (※) 短絡評価(ショートサーキット:short circuit evaluation):条件に該当するものが見つかると後続の条件は評価しない DECODE 関数 よく知られた非常に便利な変換関数、引数がある値のときに別の値に変換する関数である。 DEOCDE のパラメータ数の上限は 255 であり、当然条件指定はそれ以下(条件と結果で 2 パラメータのため 127 以下)になる。 CASE 式 もほぼ同数の上限がある。 検索 CASE 式 のように評価する式が個々に設定できないため、範囲指定などの条件指定が基本的に行えない
INSTR、INSTRB 関数の内容 文字列 string 中の 検索文字列 substring を検索し、その検索文字列が現れた 文字、または、バイトの位置を示す正数を戻す (1 オリジン) 開始位置 position、検知回数 occurrence のデフォルトはともに 1 開始位置 position にマイナス値を指定すると 文末から文頭 に向けて検索する。マイナスを指定しても戻り値の出現位置は先頭からの正数となる。 INSTR、INSTRB 以外にも各国語キャラクタセットに使用する特定のコードポイント向けの関数がある。 INSTRC : 完全な Unicode 用 INSTR2 : UCS2 用 INSTR4 : UCS4 用 注意点 INSTR、INSTRB の 検索対象文字列の検索開始位置 position は 開始位置を 0 に指定してもエラーにならないが SUBSTR の
PL/SQLはストアドプロシージャの事で、プログラミング言語でプログラムを書くような感じでSQL文を記述することが出来ます。なので、普通にSQLを記述するよりは遥かに複雑な処理を記述する事ができます。 また、記述したPL/SQLはデータベース内にコンパイルされた状態で置かれるので、実行時の処理速度が速いです。実行する時はそのPL/SQLを呼び出すだけでよいので、一度作成しておけば実行が非常に簡単で、またSQLをネットワーク上に流さないためネットワークにかける負荷を減らす事ができます。 複雑なSQLを記述する必要がある場合や、同じような処理を沢山実行する場合、バッチ系の処理をする時には非常に有効です。 PL/SQL基本構成 PL/SQLは以下のような構成をしてます。 PL/SQL構文の構成 DECLARE 宣言部; BEGIN 実行部; EXCEPTION 例外処理部; END; 基本構成
PL/SQLは、SQLをプログラムのように書いて実行できる、Oracleの独自言語。 一時的に実行するだけでなく、関数やプロシージャ(といったサブルーチン)の形にして保存して何度でも実行できる。 そうして保存したサブルーチンの事をRDBの世界では(?)ストアドプロシージャと呼ぶ。 「ストアド」とは「stored」の事なので、日本語としては「ストアード」と言うべきだと思うのだが「ストアド」と書かれる(少なくとも切り方は「スト・アド」ではなく「ストア・ド」)。メモリーをメモリと書く人も多いので、その流れか。 (一時的な)実行方法 SQL*Plusから入力して実行できる。 SQL> BEGIN 2 DBMS_OUTPUT.PUT_LINE('test'); 3 END; 4 / test PL/SQLプロシージャが正常に完了しました。 DBMS_OUTPUT.PUT_LINE()は文字列を出力す
[2014/08/21修正]SQLの例文をいくらか読みやすい形に修正しました。 前書き私はSQLを書くこと自体は別に嫌いじゃないんですが、ストアドを作ったり使ったりするのは大嫌いです。理由は性にあったIDEを知らないからです。逆に言うとそれだけです。 とは言え、やむにやまれぬ事情で何らかの関数を自作しないとやってられないことが多々あります。「嫌いだから作りません」じゃ話にならないので、SQL Serverでストアドプロシージャを作ることがあるんですが、いつも通りドキュメントがうんこすぎて毎回「これどーやって書くんだっけ?」とネットの海を彷徨うことになります。 いい加減嫌になったので、よく使う基本文法的なあれとかtipsみたいなあれを個人的にメモしておきます。 CREATE文を作る大体こんな感じのテンプレがあればOKです。 CREATE PROCEDURE [dbo].[TEST_PROC]
忘れない内にメモメモ。 [テーブル定義] /* テーブル定義情報を取得 */ SELECT SYS_CONTEXT('USERENV', 'DB_NAME') AS db_name ,USER AS schema_name ,tbls.TABLE_NAME AS table_name ,comments.TABLE_TYPE AS table_type ,comments.COMMENTS AS table_comment FROM USER_TABLES tbls LEFT OUTER JOIN USER_TAB_COMMENTS comments ON tbls.TABLE_NAME = comments.TABLE_NAME ORDER BY tbls.TABLE_NAME [カラム定義] /* カラム定義情報を取得 */ SELECT SYS_CONTEXT('USERENV',
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く