こんにちは。よこやんです。
今回は、AndroidアプリでOracleのプロシージャーを実行してみたいと思います。
以前投稿した、「AndroidアプリでJDBCを介してOracleDBに接続する」の延長です。AndroidStudioの設定、環境等は、こちらの投稿を参考にしてください。
・プロシージャーの準備
以下のようなプロシージャーを用意します。
INとOUTのパラメーターが、それぞれ1つずつの超絶シンプルなものです。
INパラメーターにデータが入っていた時、「データ有」と返してくれます。
create or replace PROCEDURE test
(
p1 IN VARCHAR2
, p2 OUT VARCHAR2
) AS BEGIN
DECLARE
BEGIN
--初期化
p2 := '';
IF p1 IS NOT NULL THEN
p2 := 'データ有';
ELSE
p2 := 'データ無';
END IF;
EXCEPTION
WHEN OTHERS THEN
p2 := 'エラー';
END;
END test;
・AndroidStudioでプロシージャーを呼び出す
以下のようなプロシージャーを呼び出す関数を作りました。
INパラメーターに「1」を渡しています。
INパラメーターがNULLではないため、「データ有」が返ってくるかと思います。(name変数に入る)
public void Procedure(){
String SQL = "{call test(?,?)}";
ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.execute(() -> {
try {
CallableStatement cs = null;
con = connectionClass.Conn();
cs = con.prepareCall(SQL);
cs.setString(1, "p1");
cs.registerOutParameter(2, Types.VARCHAR, 1000);
cs.executeQuery();
name = cs.getString(2);
} catch (Exception e){
throw new RuntimeException(e);
}
runOnUiThread(() -> {
try{
Thread.sleep(1000);
} catch (InterruptedException e){
e.printStackTrace();
}
TextView txtList = findViewById(R.id.textview);
txtList.setText(name);
});
});
}
onCreateは以下のようになっています。
Connectionクラスと、connect関数については前回の投稿を参考にしてください。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
connectionClass = new ConnectionClass();
connect();
Button btnConnect = (Button)findViewById(R.id.button);
btnConnect.setOnClickListener(onClick_button);
}
以下のように「データ有」と表示されました。
やったね。
コメントを残す