オラクる。

oracle専門ブログにしてみようかな~っと

2014年10月

Oracle 12cより新たにSELECT文の結果として返される行の数を制限することが出来るようになりました。
行の数を制限するにはSELECT文にOFFSET句とFETCH句を使用します。
OFFSET句はスキップする行数を指定します。
例えば「OFFSET 1 ROWS」と指定した場合は、先頭の1行をスキップします。
FETCH句は返される行数もしくは行の割合を指定します。
例えば「FETCH FIRST 3 ROWS」と指定した場合は、3行分を取り出します。

SQL> SELECT empno,ename,sal
  2  FROM employees
  3  ORDER BY sal DESC;

     EMPNO ENAME                                           SAL
---------- ---------------------------------------- ----------
      1001 佐藤                                         500000
      1004 田中                                         355000
      1003 高橋                                         300000
      1009 小林                                         300000
      1006 伊藤                                         300000
      1012 吉田                                         295000
      1007 山本                                         285000
      1005 渡辺                                         280000
      1013 山田                                         280000
      1008 中村                                         245000
      1014 佐々木                                       230000

     EMPNO ENAME                                           SAL
---------- ---------------------------------------- ----------
      1002 鈴木                                         200000
      1010 斉藤                                         150000
      1011 加藤                                         110000

14行が選択されました。

行制限する前の表には14行のデータが存在しています。
ソートキーをSAL列にして、大きい順にソートしています。

SQL> SELECT empno,ename,sal
  2  FROM employees
  3  ORDER BY sal DESC
  4  OFFSET 5 ROWS
  5  FETCH FIRST 3 ROWS ONLY;

     EMPNO ENAME                                           SAL
---------- ---------------------------------------- ----------
      1012 吉田                                         295000
      1007 山本                                         285000
      1005 渡辺                                         280000
 
先頭5行をスキップ(OFFSET)して、 3行分取り出し(FETCH)ています。

SQL> SELECT empno,ename,sal
  2  FROM employees
  3  ORDER BY sal DESC
  4  OFFSET 5 ROWS
  5  FETCH FIRST 3 ROWS WITH TIES;

     EMPNO ENAME                                           SAL
---------- ---------------------------------------- ----------
      1012 吉田                                         295000
      1007 山本                                         285000
      1005 渡辺                                         280000
      1013 山田                                         280000 
 
FETCH句の最後にWITH TIESを付与すると、取り出した最後の行のソートキーの値と同じ値の行が全て返されます。

SQL> SELECT empno,ename,sal
  2  FROM employees
  3  ORDER BY sal DESC
  4  OFFSET 5 ROWS
  5  FETCH FIRST 50 PERCENT ROWS ONLY;

     EMPNO ENAME                                           SAL
---------- ---------------------------------------- ----------
      1012 吉田                                         295000
      1007 山本                                         285000
      1005 渡辺                                         280000
      1013 山田                                         280000
      1008 中村                                         245000
      1014 佐々木                                       230000
      1002 鈴木                                         200000

7行が選択されました。 
 
5行スキップした後の、上位50%を取り出しています。

SQL> SELECT empno,ename,sal
  2  FROM employees
  3  ORDER BY sal DESC
  4  FETCH FIRST 3 ROWS ONLY;

     EMPNO ENAME                                           SAL
---------- ---------------------------------------- ----------
      1001 佐藤                                         500000
      1004 田中                                         355000
      1003 高橋                                         300000 

OFFSET句を省略した場合、FETCH句で先頭の行から取り出します。

SQL> SELECT empno,ename,sal
  2  FROM employees
  3  ORDER BY sal DESC
  4  OFFSET 5 ROWS;

     EMPNO ENAME                                           SAL
---------- ---------------------------------------- ----------
      1012 吉田                                         295000
      1007 山本                                         285000
      1005 渡辺                                         280000
      1013 山田                                         280000
      1008 中村                                         245000
      1014 佐々木                                       230000
      1002 鈴木                                         200000
      1010 斉藤                                         150000
      1011 加藤                                         110000

9行が選択されました。 

FETCH句を省略した場合、スキップした後の全ての行が取り出されます。
 

OracleのSQL Plusでは置換変数を利用することによって、SQL実行時の値をユーザー指定の値に置き換えることが出来ます。
置換変数には2種類あり&置換変数と&&置換変数というのがあります。

・&置換変数

以下の例のようにwhere条件式に置換変数を利用することによって、SQL実行時に値の入力が求められます
置換変数は指定の値に置き換えられ、SQLが実行されます。

SQL> SELECT empno,ename,sal,deptno
  2  FROM employees
  3  WHERE deptno = &deptno;
deptnoに値を入力してください: 10
旧   3: WHERE deptno = &deptno
新   3: WHERE deptno = 10

     EMPNO ENAME                                           SAL     DEPTNO
---------- ---------------------------------------- ---------- ----------
      1001 佐藤                                         500000         10
      1008 中村                                         245000         10
      1014 佐々木                                       230000         10
 
また、SQL実行時に置換変数の置き換え前後の値が表示されますが、VERIFY変数をOFFに設定することで表示を抑制することが出来ます。

SQL> SET VERIFY OFF
SQL> SELECT empno,ename,sal,deptno
  2  FROM employees
  3  WHERE deptno = &deptno;
deptnoに値を入力してください: 10

     EMPNO ENAME             SAL     DEPTNO
---------- ---------- ---------- ----------
      1001 佐藤           500000         10
      1008 中村           245000         10
      1014 佐々木         230000         10 


・&&置換変数

&置換変数で置き換えられた値はSQL実行後に破棄されますが、&&置換変数の場合はSQL実行後も値が保持されます。

SQL> SELECT empno,ename,sal,deptno
  2  FROM employees
  3  WHERE deptno = &&deptno;
deptnoに値を入力してください: 20

     EMPNO ENAME             SAL     DEPTNO
---------- ---------- ---------- ----------
      1002 鈴木           200000         20
      1005 渡辺           280000         20
      1009 小林           300000         20
      1011 加藤           110000         20
      1013 山田           280000         20

保持された値は次回のSQL実行時にも利用されます。

SQL> SELECT empno,ename,sal,deptno
  2  FROM employees
  3  WHERE deptno = &&deptno;

     EMPNO ENAME             SAL     DEPTNO
---------- ---------- ---------- ----------
      1002 鈴木           200000         20
      1005 渡辺           280000         20
      1009 小林           300000         20
      1011 加藤           110000         20
      1013 山田           280000         20 
 
&&置換変数の値はDEFINEコマンドで確認し、UNDEFINEコマンドで破棄します。

SQL> DEFINE deptno
DEFINE DEPTNO          = "20" (CHAR)
SQL> UNDEFINE deptno
SQL> DEFINE deptno
SP2-0135: 記号 deptnoは定義されていません。
SQL>
 

20141001_030332836_iOS

今日のお昼は池袋で打ち合わせだったので、「ラーメン二郎池袋店」に行ってまいりました。
今回で池袋二郎は4回目ぐらい
今日は夏季限定のつけ麺を食べました

この池袋二郎は池袋駅から近い、通し営業、夜遅くまで開店している・・・という理由で「気軽に行けるラーメン二郎」と言った感じです
今日食べた、つけ麺は夏になったら提供されるメニューです
普通の「つけ麺」と大盛りの「大つけ麺」の2種類があります

提供された「つけ麺」は野菜増しにしたからなのか、スープと麺の両方に野菜が入っています
またスープには海苔、メンマが入っています
スープの味は通常のラーメンよりも酸味が効いています
麺は二郎随一の極太麺
うどんに見紛うようです
豚肉は薄いものが3切れほど
どちらかと言うと普通のラーメン屋さんのチャーシュー
ラーメン屋さんとしては美味しい部類に入るけれど、二郎としてはイマイチな方だと思います
すっごい分厚いチャーシューが食べたい

そんなこんなで完食
麺量は少ない方です
大盛りでイケてしまいそう 

今、bashで発見された脆弱性「shellshock」に関して、その重大性から大騒ぎになっています。
この脆弱性を利用することによって、任意のコードを実行できてしまいます。
さらに、その影響が広範囲におよぶため、opensslの脆弱性「heartblead」以上のインパクトではないかと言われています。
影響がおよぶのはlinuxのほぼ全てのディストリビューションが対象で、インターネットにサーバを公開している場合は至急に対策を施す必要があります。
各ディストリビューションから、修正パッチがリリースされ、ルーターなどの内部でbashを利用している製品でも情報が公開されています。
すでにこの脆弱性を利用した攻撃も行なわれているようです。

日本語のサイトはこちらが一番詳しいです。

bashの脆弱性(CVE-2014-6271) #ShellShock の関連リンクをまとめてみた - piyolog

--
各ディストリビューションで公開されている最新のrpmを適用する方法もありますが、今回は脆弱性の対処がされているソースコードを利用したbuildの手順を確認してみます。

1.脆弱性とバージョンの確認 

[root@oratest bash-fix]# env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
vulnerable ← これが表示されればNG
this is a test

[root@oratest ~]# bash --version
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

2.ソースコードとパッチのダウンロード

4.1のソースコードに最新までのパッチを適用してbuildします。

[root@oratest ~]# mkdir /tmp/bash-fix
[root@oratest ~]# cd /tmp/bash-fix/
 
[root@oratest bash-fix]# wget http://ftp.gnu.org/pub/gnu/bash/bash-4.1.tar.gz

[root@oratest bash-fix]# ls
bash-4.1.tar.gz
[root@oratest bash-fix]# tar zxf bash-4.1.tar.gz

[root@oratest bash-4.1]# cd bash-4.1
[root@oratest bash-4.1]# wget http://ftp.gnu.org/pub/gnu/bash/bash-4.1-patches/bash41-{001..014}

[root@oratest bash-4.1]# cat bash41-{001..014} | patch -p0

[root@oratest bash-4.1]# ./configure
[root@oratest bash-4.1]# make
[root@oratest bash-4.1]# make install
 
3.バイナリファイルの入れ替え

buildしたバイナリファイルは/usr/local/bin配下に存在するので、/bin配下にコピーします。

[root@oratest bash-4.1]# /usr/local/bin/bash --version
GNU bash, version 4.1.14(1)-release (x86_64-unknown-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

[root@oratest ~]# mv /bin/bash /bin/bash.old
[root@oratest ~]# cp /usr/local/bin/bash /bin/

[root@oratest ~]# chmod -x /bin/bash.old
[root@oratest ~]# ls -al /bin/bash*
-rwxr-xr-x. 1 root root 2863238 10月  1 00:09 2014 /bin/bash
-rw-r--r--. 1 root root  938832  7月  9 22:24 2013 /bin/bash.old 

4.確認

4.1.2から4.1.14にバージョンアップし、vulnerableは表示されなくなりました。
ただ、これでも修正が不十分なようですが、さらに最新のパッチがリリースされた場合でも同様の手順でアップデートが可能です。

[root@oratest ~]# bash --version
GNU bash, version 4.1.14(1)-release (x86_64-unknown-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
[root@oratest ~]# env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
this is a test  

このページのトップヘ