備忘録 – こみなのメモ帳 / 趣味と実益のネタ帳 Sun, 29 Nov 2020 21:00:00 +0000 ja hourly 1 https://wordpress.org/?v=6.1.1 [oracle]全角変換、半角変換 /archives/605/ /archives/605/#respond Sun, 29 Nov 2020 21:00:00 +0000 https://www.komina.info/?p=605
【注意】
この記事は過去に別サイトで執筆したものを再掲載したものです。
内容が古くなっていて現在では適用できない場合や、もっと良い方法が出来ている場合があります。
 

全角へ変換

SELECT TO_MULTI_BYTE('2013-11-28(thu) 11:02:35 変換.') "result" FROM DUAL;

実行結果

result                     
----------------------------
2013-11-28(thu) 11:02:35 変換.

半角へ変換

SELECT TO_SINGLE_BYTE('2013-11-28(thu) 11:02:35 変換.') "result" FROM DUAL;

実行結果

result                     
----------------------------
2013-11-28(thu) 11:02:35 変換. 

]]>
/archives/605/feed/ 0
[oracle]UNDO領域 /archives/603/ /archives/603/#respond Sat, 28 Nov 2020 21:00:00 +0000 https://www.komina.info/?p=603
【注意】
この記事は過去に別サイトで執筆したものを再掲載したものです。
内容が古くなっていて現在では適用できない場合や、もっと良い方法が出来ている場合があります。
 

トランザクション内の変更をロールバックするための情報を保持する領域のことをUNDO領域という。

UNDO領域はトランザクションがコミットされた後はロールバック用、リカバリ用としては不要となるが、しばらくは保存される。
これは、読み込み一貫性を保証するために古いロールバック情報が必要になることがあるからである。
保存期間は、UNDO_RETENTIONで設定する。

http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19224-02/undo.htm

]]>
/archives/603/feed/ 0
[oracle][plsql]カーソル属性 /archives/601/ /archives/601/#respond Fri, 27 Nov 2020 21:00:00 +0000 https://www.komina.info/?p=601
【注意】
この記事は過去に別サイトで執筆したものを再掲載したものです。
内容が古くなっていて現在では適用できない場合や、もっと良い方法が出来ている場合があります。
 

明示カーソルのカーソル属性では、直前のFETCHに対して、行が取り出せたか否か、これまでに取り出された行数、カーソルのオープン状態などを得ることができる。

%NOTFOUND直前のFETCHで行を取り出せた場合はFALSE、取り出せた場合はTRUEを返す。
%FOUND%NOTFOUNDの逆論理を返す。
%ROWCOUNTこれまでに取り出した行数を返す。(FETCH回数)
%ISOPENカーソルのオープン状態を返す。オープンしているときはTRUE。

<カーソル変数>%NOTFOUND のように参照する。

明示的にカーソルを使っていない場合(暗黙カーソル)のカーソル属性では、直前に実行したDML文が影響を与えた行数、SELECT文の取得件数などを得ることができる。

%NOTFOUND直前のDML文(INSERTやUPDATEやDELETE)が何も影響を与えなかった場合、TRUEを返す。
または、直前のSELECT文がなにも取得できなかった場合、TRUEを返す。
%FOUND%NOTFOUNDの逆論理を返す。
%ROWCOUNT直前のDML文が影響を与えた行数を返す。または、SELECT文が取得出来た行数を返す。
%ISOPEN常にFALSEを返す。

SQL%NOTFOUNDのように参照する。

]]>
/archives/601/feed/ 0
[oracle][plsql]エスケープシーケンス /archives/599/ /archives/599/#respond Thu, 26 Nov 2020 21:00:00 +0000 https://www.komina.info/?p=599
【注意】
この記事は過去に別サイトで執筆したものを再掲載したものです。
内容が古くなっていて現在では適用できない場合や、もっと良い方法が出来ている場合があります。
 

plsqlでは¥マークのようなエスケープ文字は存在しない。
文字として入力できない文字を使用する場合は、CHR関数を用いる。

TABなら9、CRなら13、LFなら10、といったように文字コードで指定する。

v$message := v$message || 'Hello' || chr(13) || chr(10) || 'PL/SQL';
dbms_output.put_line(v$message);
]]>
/archives/599/feed/ 0
[mysql]端数処理(四捨五入、切り捨て、切り上げ) /archives/596/ /archives/596/#respond Wed, 25 Nov 2020 21:00:00 +0000 https://www.komina.info/?p=596
【注意】
この記事は過去に別サイトで執筆したものを再掲載したものです。
内容が古くなっていて現在では適用できない場合や、もっと良い方法が出来ている場合があります。
 

四捨五入として round()関数があるが、挙動が好ましくないようなので truncate()関数を利用する。
truncate関数は端数を切り捨てる関数だが、切り捨て前に切り上げ分を加算することで四捨五入や切り上げを実現する。

四捨五入

3.45を小数第2位で四捨五入して、小数第1位までの値を得る。

select truncate(3.45 + 0.05, 1)

切り捨て

3.45を小数第1位までの値を得る。

select truncate(3.45, 1)

切り上げ

3.45を小数第1位位までの値を得る。

select truncate(3.45 + 0.09, 1)

0.09は3.401以上の値を切り捨て対象にすることになる。
3.4001以上の値も対象にしたいときは0.099を加算する。

]]>
/archives/596/feed/ 0
[mysql]文字列の結合 /archives/594/ /archives/594/#respond Tue, 24 Nov 2020 21:00:00 +0000 https://www.komina.info/?p=594
【注意】
この記事は過去に別サイトで執筆したものを再掲載したものです。
内容が古くなっていて現在では適用できない場合や、もっと良い方法が出来ている場合があります。
 

文字列を結合するとき、直感的に「+」を使いたくなるところだが、concatという専用の関数があるのでこれを使用する。

mysql> select concat(123,456) as concat, 123+456 as plus;
+--------+------+
| concat | plus |
+--------+------+
| 123456 |  579 |
+--------+------+
1 row in set (0.00 sec)

なお引数の数は可変。

mysql> select concat(123,456,78,90);
+-----------------------+
| concat(123,456,78,90) |
+-----------------------+
| 1234567890            |
+-----------------------+
1 row in set (0.00 sec)
]]>
/archives/594/feed/ 0
[mysql]ユーザ操作 /archives/592/ /archives/592/#respond Mon, 23 Nov 2020 21:00:00 +0000 https://www.komina.info/?p=592
【注意】
この記事は過去に別サイトで執筆したものを再掲載したものです。
内容が古くなっていて現在では適用できない場合や、もっと良い方法が出来ている場合があります。
 

ユーザ作成

GRANTコマンドで権限とパスワードを同時に設定する。

mysql> GRANT SELECT,INSERT,DELETE,UPDATE,CREATE,DROP,FILE,ALTER,INDEX ON *.* to

sample_user IDENTIFIED BY 'ABC123';
Query OK, 0 rows affected (0.00 sec)

自身のオプションを継承して、adminというユーザを作成し、パスワード'pass'を設定する。

mysql> GRANT ALL PRIVILEGES ON *.* TO admin@"192.168.0.%" IDENTIFIED BY 'pass' WITH GRANT OPTION;

"192.168.0.%"は、"192.168.0."からのログオンを許すという意味。同PC内であれば、"localhost"と書く。 ".*"はアクセスできるテーブルを指す。”データベース名.テーブル名” の形式。
"WITH GRANT OPTION"は、GRANT構文の実行権限を付与する意味。
"ALL PRIVILEGES"は全ての実行権限という意味、selectのみだったら"SELECT"と書く。

変更事項の即時反映

mysql> FLUSH PRIVILEGES;

ユーザ一覧

ユーザ情報もデータとして保存されているのでSELECT文を使って問い合わせる。

mysql> SELECT user, host, password FROM MYSQL.USER;
+-------+-----------+-------------------------------------------+
| user  | host      | password                                  |
+-------+-----------+-------------------------------------------+
| root  | localhost |                                           |
| root  | 127.0.0.1 |                                           |
| root  | ::1       |                                           |
| admin | localhost |                                           |
+-------+-----------+-------------------------------------------+
4 rows in set (0.00 sec)

パスワードはハッシュ値なので紛失パスワードを知ることは出来ない。
ハッシュ値なので同じワードを使えば同じハッシュ値になる。

]]>
/archives/592/feed/ 0
[mysql]パディング /archives/589/ /archives/589/#respond Sun, 22 Nov 2020 21:00:00 +0000 https://www.komina.info/?p=589
【注意】
この記事は過去に別サイトで執筆したものを再掲載したものです。
内容が古くなっていて現在では適用できない場合や、もっと良い方法が出来ている場合があります。
 

前後に空白などを付け足して桁数をそろえたいとき。
左側に付け足したいときはlpad関数、右側はrpad関数を使う。

引数は、元となる値、望む桁数、埋める文字の3つ。

mysql> select lpad('abc', 5, '#') as hidari, rpad('abc', 5, '#') as migi;
+--------+-------+
| hidari | migi  |
+--------+-------+
| ##abc  | abc## |
+--------+-------+
1 row in set (0.00 sec)
]]>
/archives/589/feed/ 0
[mysql]トリガ作成例 /archives/577/ /archives/577/#respond Thu, 19 Nov 2020 21:00:00 +0000 https://www.komina.info/?p=577
【注意】
この記事は過去に別サイトで執筆したものを再掲載したものです。
内容が古くなっていて現在では適用できない場合や、もっと良い方法が出来ている場合があります。
 

トリガの書式

テーブル作成のようにcreatedropコマンドを用いる。

CREATE
    [DEFINER = { user | CURRENT_USER }]
    TRIGGER trigger_name trigger_time trigger_event
    ON tbl_name FOR EACH ROW trigger_stmt
DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name
  • trigger_time には、AFTER(事後)/BEFORE(事前)を指定する。
  • trigger_event は、有効化するステートメントの種類を指定する。
    • INSERT指定:insertやreplaceなどで新しい行が挿入されたとき。
    • UPDATE指定:updateなどで行が修正されたとき。
    • DELETE指定:deleteやreplaceで行が削除されたとき。truncateやdrop tableは除く。
  • 同じtrigger_timetrigger_eventで複数の処理を登録することは出来ない。

自動的に変更ログを取る方法

あるテーブルへの変更をトリガ機能を使って逐一ログを取には。

準備

説明用テーブル構成、アドレス帳っぽいものを想定。

カラム名データ型備考
idintegerPK
namevarchar(30)
addressvarchar(255)
upd_usrvarchar(10)
table_x

ログ用テーブルはほとんど同じ構成で操作日時や操作者を記録できるようにしておく。また、PK指定は外しておく。

カラム名データ型備考
idintegerPK指定しない
namevarchar(30)
addressvarchar(255)
upd_usrvarchar(10)
ope_timetimestamp操作日時
ope_usrvarchar(10)操作者
table_log

テーブル作成クエリはこんな感じ。PKを指定し忘れたので後付してます。

mysql> CREATE TABLE table_x (
    ->  id integer,
    ->  name varchar(30),
    ->  address varchar(255),
    ->  upd_user varchar(10)
    -> );
Query OK, 0 rows affected (0.21 sec)
mysql> ALTER TABLE table_x ADD PRIMARY KEY (id);
Query OK, 0 rows affected (0.30 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> CREATE TABLE table_log (
    ->  id integer,
    ->  name varchar(30),
    ->  address varchar(255),
    ->  upd_user varchar(10),
    ->  ope_time timestamp,
    ->  ope_user varchar(10)
    -> );
Query OK, 0 rows affected (0.06 sec)

レコード追加時に動くトリガ

table_xへのレコード追加に連動して動く処理を書きます。NEWで更新後の情報を得られます。

mysql> delimiter $$
mysql> CREATE TRIGGER trg_x_insert BEFORE INSERT ON table_x
    ->  FOR EACH ROW
    ->  BEGIN
    ->   INSERT INTO table_log (id, name, address, upd_user, ope_user)
    ->     VALUES (NEW.id, NEW.name, NEW.address, NEW.upd_user, NEW.upd_user);
    ->  END;
    -> $$
Query OK, 0 rows affected (0.08 sec)

区切り記号の変更も一緒にしています。トリガとして登録する内容の区切り記号を誤認してしまわないための措置です。

動作テスト

mysql> insert into table_x (id, name, address, upd_user) values 1,'john','tokyo','user001');
Query OK, 1 row affected (0.05 sec)
mysql> select * from table_x;
+----+------+---------+----------+
| id | name | address | upd_user |
+----+------+---------+----------+
|  1 | john | tokyo   | user001  |
+----+------+---------+----------+
1 row in set (0.00 sec)
mysql> select * from table_log;
+------+------+---------+---------------------+----------+----------+
| id   | name | address | ope_time            | ope_user | upd_user |
+------+------+---------+---------------------+----------+----------+
|    1 | john | tokyo   | 2012-04-03 15:23:03 | user001  | user001  |
+------+------+---------+---------------------+----------+----------+
1 row in set (0.00 sec)

レコード更新時に働くトリガ

trigger_eventをUPDATEとして同様に登録します。今回は使用していませんが、OLDで更新前の情報が得られます。

mysql> CREATE TRIGGER trg_x_update BEFORE UPDATE ON table_x
    ->  FOR EACH ROW
    ->  BEGIN
    ->   INSERT INTO table_log (id, name, address, upd_user, ope_user)
    ->     VALUES (NEW.id, NEW.name, NEW.address, NEW.upd_user, NEW.upd_user);
    ->  END;
    -> $$
Query OK, 0 rows affected (0.06 sec)

レコード削除時に働くトリガ

trigger_eventをDELETEとして登録します。ただし操作ユーザは取得できないため、NULLのままとしています。また、deleteですとNEW情報は使えません。OLD情報のみとなります。

mysql> CREATE TRIGGER trg_x_delete BEFORE DELETE ON table_x
    ->  FOR EACH ROW
    ->  BEGIN
    ->   INSERT INTO table_log (id, name, address, upd_user, ope_user)
    ->     VALUES (OLD.id, NULL, NULL, NULL, NULL);
    ->  END;
    -> $$
Query OK, 0 rows affected (0.06 sec)

追加→変更→削除を行うと、table_logには下記のようなデータが残ります。

mysql> select * from table_log;
+------+-------+---------+---------------------+----------+----------+
| id   | name  | address | ope_time            | ope_user | upd_user |
+------+-------+---------+---------------------+----------+----------+
|    1 | john  | tokyo   | 2012-04-03 15:23:03 | user001  | user001  |
|    1 | jimmy | tokyo   | 2012-04-03 16:11:45 | user001  | user001  |
|    1 | NULL  | NULL    | 2012-04-03 16:12:13 | NULL     | NULL     |
+------+-------+---------+---------------------+----------+----------+
3 rows in set (0.00 sec)
]]>
/archives/577/feed/ 0
[mysql]データベース操作 /archives/573/ /archives/573/#respond Wed, 18 Nov 2020 21:00:00 +0000 https://www.komina.info/?p=573
【注意】
この記事は過去に別サイトで執筆したものを再掲載したものです。
内容が古くなっていて現在では適用できない場合や、もっと良い方法が出来ている場合があります。
 

データベース一覧表示

mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
4 rows in set (0.00 sec)

データベース作成

CREATE DATABASEコマンドを用いる。

mysql> CREATE DATABASE sample_db;
Query OK, 1 row affected (0.00 sec)

データベース削除

DROP DATABASEコマンドを用いる。

mysql> DROP DATABASE sample_db;
Query OK, 0 rows affected (0.00 sec)

その他

  • 使用するデータベースを切り替えるには下記のようにデータベース名を指定してuseコマンドを実行する。
    mysql> use sample_db
    Databse changed

  • 使用中のデータベース内のテーブル一覧を参照したいとき。
    mysql> show tables;
  • テーブルのフィールドを確認したいとき。
    mysql> desc tablename;
  • 区切り記号を変更したいとき。(デフォルトはセミコロン)
    mysql> delimiter $$
]]>
/archives/573/feed/ 0