はじめに
Sakura Script Transfer Protocolな方のSSTPです。
これはblogの残骸から移植した投稿です。
PL/SQLからSSTP飛ばせるのか気になって試しに実装してみたら
すんなり行っちゃったときのコード。誰得。
こんなかんじで
CREATE OR REPLACE FUNCTION TEST_SSTP_NOTIFY
RETURN VARCHAR2
IS
conn UTL_TCP.CONNECTION;
x PLS_INTEGER;
scripts VARCHAR2(4000);
BEGIN
-- 毒電波送信準備
conn := utl_tcp.open_connection(
remote_host => 'localhost',
remote_port => 9821,
charset => 'JA16SJIS');
-- 毒電波本体
scripts := '\h\s[0]SCOTTさんは星になりました。';
scripts := scripts || '\u\_w[1500]……おい。';
scripts := scripts || '\h\n\_w[1500]…はい?';
scripts := scripts || '\u\n\_w[1500]…せつないな。';
scripts := scripts || '\e';
-- 電波ゆんゆん
x := utl_tcp.write_line(conn, 'NOTIFY SSTP/1.1');
x := utl_tcp.write_line(conn, 'Sender: 毒電波 from PL/SQL');
x := utl_tcp.write_line(conn, 'Event: onSendMessage');
x := utl_tcp.write_line(conn, 'Script: ' || scripts);
x := utl_tcp.write_line(conn, 'Charset: Shift_JIS');
x := utl_tcp.write_line(conn);
-- 例外?なにそれおいしいの?
BEGIN
LOOP
dbms_output.put_line(utl_tcp.get_line(conn, TRUE));
-- 本来ならばここで色々しないといけない
END LOOP;
EXCEPTION
WHEN utl_tcp.end_of_input THEN
NULL; -- end of input
END;
utl_tcp.close_connection(conn);
RETURN 'OK';
EXCEPTION
WHEN OTHERS THEN
RETURN 'あなたの意に反してこのエラーが見えているでしょうか?';
END;
これをご家庭のOracleインスタンスに食わせた上で、sqlplusなりで
SELECT TEST_SSTP_NOTIFY FROM DUAL;
って発行したら毒電波が飛ぶはず。
もし懐かしのApache風のエラーメッセージが出るなら「ACL設定」でググればいいかも。
[追記 2015.11]
今風だと、PL/SQLからslackに投稿とかのほうがウケがいい気もするネタだと思った。
えんいー。