質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.80%

Postgre SQL から外部ファイルを実行する方法

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 4,850

score 12

Postgre SQLからEXEファイルなどの外部ファイルを呼び出ししたい。
PL/pgSQLからの呼び出し方法を教えて頂けると助かります。

宜しくお願いいたします。

PL/pgSQLのプログラム

CREATE OR REPLACE FUNCTION public.test()
 RETURNS integer
 LANGUAGE plpgsql
AS $function$

BEGIN

COPY empty_table FROM PROGRAM 'C:/WINDOWS/system32/notepad.exe';

END ;
$function$
;

このプログラムを実行しても、動作がフリーズした状態になります。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2018/10/04 16:01

    何のために呼び出したいのでしょうか。また自身で調べて何か試したことがあればそれも記載してください。

    キャンセル

  • Sato_y

    2018/10/04 16:04

    Javaプログラム(形式はexe)を実行させるために呼び出したいです。一度このサイトの書いている通りに実行してみたのですが、上手く動作しなかったです。https://www.ecomott.co.jp/tech_blog/?p=1419

    キャンセル

  • m.ts10806

    2018/10/04 16:07

    質問は編集できるので追記してください。「うまくいかなかった」部分は具体的な手順やコードと起きた現象を。

    キャンセル

  • Sato_y

    2018/10/04 16:26

    ご確認して頂けると有難いです。

    キャンセル

回答 2

checkベストアンサー

+1

おそらくですが、フリーズしているのではなくnotepad.exeが起動していて、notepad.exeが終了するのを待っているのではないかと思います。
フリーズしていると思われる状態でタスクマネージャーからプロセスを確認してみてください。

また、下記のbatファイルでCOPYコマンドの動作を確認することができるのでお試しください。
{ ... }の部分はご自身の環境に合わせて書き換えてください。
このbatを実行するとnotepad.exeが起動し、notepad.exeを閉じるとbatに制御が戻りbatが終了すると思います。

@echo off
cd /d %~dp0

set PGHOST={ホスト名}
set PGDATABASE={データベース名}
set PGUSER={ユーザー名}
set PGPASSWORD={パスワード}
set PSQL_COMMAND="{path\to\}psql.exe"

%PSQL_COMMAND% -c "COPY empty_table FROM PROGRAM 'notepad.exe'"

pause

ちなみにPROGRAMの部分を下記のように'dir /b'とすると、その結果がempty_tableに書き込まれ、batに制御が戻ってくると思います。

"COPY empty_table FROM PROGRAM 'dir /b'"

同様にechoでも確認できます。

"COPY empty_table FROM PROGRAM 'echo hello world!'"

empty_tableは下記のddlで作成しています。

CREATE TABLE empty_table (
  data varchar(516)
);

最後にPL/pgSQLからの実行したい外部プログラムが入力待ちにならない種類のプログラムであれば上記の方法で対応できるかもしれませんのでご確認ください。
しかし、notepad.exeのような入力待ちになる種類のプログラムや、常駐型のプログラムということであれば、申し訳ないですがわからないです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

SQLから外部プログラムを実行する方法はないと先の回答には書きましたが、
ご指摘の通りCOPY文で起動することが出来るようです。

COPY

PROGRAMが指定された場合、サーバは指定したコマンドを実行しその標準出力を読み取る、または、プログラムの標準入力に書き出します。 コマンドはサーバからの視点で指定しなければならず、また、PostgreSQLユーザによって実行できなければなりません。 STDINやSTDOUTが指定された場合、データはクライアントとサーバ間を流れます。 

って話からすると、起動したプログラムの標準入力に与えてその結果を待つのではないかと思われます。
notepad.exeごときが標準入出力を処理できたかどうかはわかりませんが、
javaで書いたプログラムに引き渡すのであれば標準入出力を意識して組むとよいかと。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る