PL/SQL 雖強大,但處理檔案操作、呼叫外部程式、複雜文本解析、物件導向開發等任務時顯得力不從心。Python 以簡潔易讀、動態型別、豐富標準庫與跨平台免費開源特性,成為延伸 Oracle 能力的最佳夥伴。其「可執行的偽代碼」風格讓代碼極易維護,無論新手或專家皆能快速上手。
>>> initFile = open('init_orcl.ora')
>>> firstLine = initFile.readline().strip() # 記得加 () 呼叫方法
>>> firstLine
'FAST_START_MTTR_TARGET=300'
# 內省發現字串方法
>>> dir(firstLine)
['split', 'strip', ...]
>>> param, val = firstLine.split('=')
>>> param, val
('FAST_START_MTTR_TARGET', '300')
# readInitOra.py
def read(fileName):
initParams = {}
with open(fileName, 'r') as f:
for line in f:
param, val = line.strip().split('=')
initParams[param] = val
return initParams
# compareInitOra.py
import readInitOra
initParams = {}
for fname in ['init_orcl.ora', 'init_default.ora']:
initParams[fname] = readInitOra.read(fname)
print(initParams)
# 輸出巢狀字典,便於後續處理
安裝對應版本的 cx_Oracle (Windows 提供安裝程式),即可使用標準 DB-API 2.0 介面。
import cx_Oracle, readInitOra
conn = cx_Oracle.connect('scott/tiger@orcl')
curs = conn.cursor()
curs.execute("""CREATE TABLE INIT_PARAMS
(fileName VARCHAR2(30), param VARCHAR2(64), value VARCHAR2(512))""")
for fname, params in readInitOra.read(fname).items():
for param, val in params.items():
curs.execute("INSERT INTO INIT_PARAMS VALUES (:1, :2, :3)", (fname, param, val))
conn.commit()
curs.close()
curs.execute('SELECT name, value FROM V$PARAMETER')
liveParams = {row[0].upper(): row[1] for row in curs.fetchall()}
fileParams = readInitOra.read('init_orcl.ora')
for param, val in fileParams.items():
if liveParams.get(param) != val:
print(f"{param}: 參數檔={val}, 實例={liveParams.get(param)}")
若偏好物件導向操作,可評估:SQLObject (即將支援 Oracle)、forgetSQL、ll.orasql、Modeling Object-Relational Bridge、sqlWrap 等。
import cherrypy, readInitOra, cx_Oracle
def readLiveParams(instance):
live = {}
conn = cx_Oracle.connect(f'scott/tiger@{instance}')
curs = conn.cursor()
curs.execute('SELECT name, value FROM V$PARAMETER')
for row in curs.fetchall():
live[row[0].upper()] = row[1]
return live
def Html(initOraFile, instance):
result = ""
fileParams = readInitOra.read(initOraFile)
liveParams = readLiveParams(instance)
for param, val in fileParams.items():
lv = liveParams.get(param)
if lv == val:
result += f'{val}
\n'
else:
result += f'{val} (file) {lv} (live)
\n'
return result
class WebApp:
@cherrypy.expose
def index(self, initOraFile='init.ora', instance='orcl'):
return Html(initOraFile, instance)
cherrypy.quickstart(WebApp()) # 預設 https://localhost:8080
Python 賦予 Oracle 專家檔案處理、文本分析、Web 開發、XML/Web Services、GUI、單元測試等全方位能力,且無需切換語言。從今天開始,將 Python 加入您的工具箱,體驗「簡單即是強大」的開發樂趣。