

SQL PLUS実行時にマイナスの値を返却値としたいです。  
実行結果として以下のようになればよいのですが、

[code]

    > sqlplus -L user/pass@sid @DATA.SQL
    > echo $?
    > -1
    
[/code]

単純にDATA.SQLファイルに  
EXIT -1  
としても、以下のようにSQL
PLUSの仕様上不可能のような記述がありましたが、SPなどを利用して実現可能でしょうか。方法があれば教えてください。OSはRedhatLinuxです。

> **EXIT（戻り値）の上限**
>
> UNIX 系の EXIT のステータスコードは 下位の 8ビットでマスクされるために 256 以上の数値を指定しても違う値に変換される。特に  
>  256 の倍数は 下位 8ビットでマスクされると 0 になるので正常終了と誤認する危険がある。 Windows 系だからといって 256  
>  以上の戻り値を使用するとプラットフォームの互換性が無くなるので控える方がよい。

[SQL*Plus > EXIT、QUIT](http://www.shift-the-
oracle.com/sqlplus/command/exit.html)


CC BY-SA 3.0
2015-02-10T06:11:32.480
6238
2015-02-13T09:12:54.617
2015-02-10T06:20:30.397
2329
question
sql oracle
SQLPLUSでSQLファイル実行時にマイナスの値を返したい


回答ではないのですが、シェル(bash/zsh)の `exit status` に関して少し書きます。

[code]

    $ bash -c 'exit -1'; echo $?
    255
    $ bash -c 'exit -2'; echo $?
    254
    $ bash -c 'exit -3'; echo $?
    253
    
[/code]

上記の例は `bash` ですが、`zsh` でも同様の結果になります。

> man bash(1)
>
> EXIT STATUS
>
> The exit status of an executed command is the value returned by the waitpid
> system call or equivalent function. **Exit statuses fall between 0 and 255**
> , though, as explained below, the shell may use values above 125 specially.

exit status は `unsigned char` として扱われていますので、負の値になることはありません。何らかの方法で sqlplus に -1
の 戻り値を持たせたとしても、シェルでの exit status は 255 となってしまいます。まぁ、

> exit status 255 は -1 と見做す

とでもすれば良いのかもしれませんが、もしかすると sqlplus がエラーなどで exit status 255
を返す場合も無いとは言えず、適切ではないと思われます。


CC BY-SA 3.0
2015-02-10T13:17:07.460
6269
2015-02-10T13:17:07.460
2020-06-17T08:14:45.997
-1
6238
answer


リターンコードに限定すると8ビットでマスクされると記述されているので不可能でしょう。

検索してみると幾つかのUNIX系のOSも同様のQ&A記述がありますね。  
無理に負数ビットを立ててもマスクされると255辺りになってしまうようです。

リターンコードとしては無理ですが、シェルの標準出力や  
select句の実行結果としてなら無理やり返せますね。

[code]

    set ret=`sqlplus -S user/pass@sid ` << END
    set head off;
    set termout off
    @DATA.SQL
    set termout on
    select '-1' from dual;
    exit;
    END
    
[/code]

の後で

[code]

    echo $ret
    
[/code]

するとかね。

* * *

**追記** ： 私の回答では動作部分を省略して答えだけにしていたので、  
以下は実験結果を記入したheliac2001さんの回答に対する補足のつもりでした。

「8ビットでマスク」というのは2進数のビット演算によって  
下位8ビット以外を切り捨てるということを意味します。

**-1** を「左端を負数ビットにした2の補数形式」の2進数で表すと  
**1111 ～省略～ 1111 1111** と桁数分1が並ぶ事になります。

8ビットマスクによって下位8ビット以外が切り捨てられると **1111 1111** となります。  
これを10進数に直すと **255** になり、 **EXIT -1** の結果にこの数値が入ります。

他の負数はこうなります。  
**-2** (10進数) = **1111 ～省略～1111 1110** (2進数) -> 下位8ビットでマスク -> **254** (10進数)  
**-3** (10進数) = **1111 ～省略～1111 1101** (2進数) -> 下位8ビットでマスク -> **253** (10進数)

上位ビットが全て桁落ちしている状態ですので **511** 、 **767** 、 **1023** 、 **1777** といった  
「 **256の倍数 -1** 」の数字が入ると **255** になってしまいます。  
この辺は他の数値でも同じ状況です。

以上の理由で **255** を **-1** とみなすのは避けたほうが宜しいかと思います。


CC BY-SA 3.0
2015-02-11T09:36:04.290
6311
2015-02-13T09:12:54.617
2015-02-13T09:12:54.617
5479
5479
6238
answer