kkkkkmo
@kkkkkmo (あさみ 佐藤)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

sqlplus実行後のコマンドが動作しない事象について

シェルスクリプトでsqlplusからSQLを実行し、exit後にコマンドをいくつかたたきたいのですがどのコマンドも反応しません。結果が返ってきません。

以下のような事象です。

echo 1

sqlplus hoge/hoge@hoge << END

select * from dba_tables;

exit
END

echo 2

最初のechoは正常に動きますが、sqlplus実行後のecho 2は反応しません。

何故でしょうか。。

1

3Answer

SELECT文の末尾にセミコロン(;)がないので実行待ちになっている(exitがSELECT文の続きと認識されている)のでは?

0Like

Comments

  1. @kkkkkmo

    Questioner

    実際はセミコロン付けてました、、
    (修正しました)

exitを入れてるから?(exitはSQLではなく、sqlplusの制御コマンドです)

(
 echo 'select * from dba_tables;'
) | sqlplus hoge/hoge@hoge 

別の書き方では、こんな感じです。
 カッコは複数行対策

仮説:
sqlplusはexitの直前でもどり、(有りえない)
シェルがexitを実行し、この時点でシェルが終了して echo 2 が実行されない?

exit を echo 2に置き換えると【2】が表示されるの? 興味深いので試して下さい。

0Like

Comments

  1. @kkkkkmo

    Questioner

    exitを消し実行したら正常終了しました!
    何故なのか不思議です。

    (上記の例ではselect文ですが実際は下記プロシージャなのでそれが原因なのでしょうか…)

    DECLARE
    obj_list DBMS_STATS.ObjectTab := DBMS_STATS.ObjectTab() ;
    BEGIN
    DBMS_STATS.GATHER_SCHEMA_STATS(ownname=>'TRY', objlist=> obj_list, options=>'LIST STALE') ;
    FOR i in obj_list.FIRST.. obj_list.LAST LOOP
    dbms_output.put_line(obj_list(i).objtype || ' ' ||
    obj_list(i).ownname || '.' ||
    obj_list(i).objname || ' ' ||
    nvl(obj_list(i).partname, 'NonPartition') || ' – ' ||
    nvl(obj_list(i).subpartname, '*'));
    END LOOP;
    END;
    /

    アドバイスありがとうございました。
  2. おめでとうございます。
    p.s. exit を echo 2 に置き換えくれないの?
  3. @kkkkkmo

    Questioner

    置き換えなくて大丈夫です🙆

Your answer might help someone💌