Raspberry pi OS取得Oracle DB的資料

 因為要做監控Oracle DB狀況的一個小型專案,想用樹莓派來當做Server,以節省建置成本。


一開始在我的電腦上測試,是以python+cx_oracle+Oracle Client來設計,使用上並沒有問題。


把程式轉到Raspberry pi時發現Oracle Clinet並沒有ARM CPU版本,也就是說無法由python直接讀取Oracle DB


最後是用paramiko,以SSH連線至DB Server,由DB Server執行Script來取得資料並回傳給Raspberry pi上的python


首先在Raspberry pi OS 安裝python模組paramiko

# pip3 install paramiko


接著程式分為兩個部份,第一個是Raspberry pi OS的python程式


import paramiko


port =22

username = test

password = 123456

IP = 192.168.1.10

oraonCom = "./test.sh" #DB Server上欲執行的Script檔,此檔放在家目錄底下


ssh = paramiko.SSHClient()

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

ssh.connect(IP,port,username, password)

stdin, stdout, stderr = ssh.exec_command(oraonlineCom)

oradata = stdout.readlines()


print( str(oradata[0].strip('\n')) )


stdout.close()

stdin.close()

stderr.close()

ssh.close()  



第二個是DB Server的Script程式,主要是利用sqlplus來執行SQL並傳回資料。

因為sqlplus會有一些檔頭等我們不需要的資訊,所以必需用一些參數來避掉。


#!/bin/bash

sqlplus -s USERNAME/PASSWORD << EOF

SET SERVEROUTPUT ON

SET FEEDBACK OFF

DECLARE

   reVal varchar(30);

BEGIN

   SELECT count(DISTINCT icx.session_id) into reVal 

     FROM apps.icx_sessions icx 

     WHERE disabled_flag != 'Y'

     AND icx.pseudo_flag = 'N'

     AND  ( last_connect +( 30 / 60 / 24)) > SYSDATE

     AND icx.counter < limit_connects;


   DBMS_OUTPUT.PUT_LINE(reVal);

END;

/

EXIT

EOF