ORACLE中CX_ORACLE庫(kù)怎么用

小編給大家分享一下ORACLE中CX_ORACLE庫(kù)怎么用,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

成都創(chuàng)新互聯(lián)長(zhǎng)期為超過(guò)千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為革吉企業(yè)提供專業(yè)的成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè),革吉網(wǎng)站改版等技術(shù)服務(wù)。擁有十載豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。

1、安裝cx_Oracle包:

pip install cx_Oracle

         當(dāng)前版本7.0

2、創(chuàng)建數(shù)據(jù)庫(kù)連接的三種方式:

方法一:用戶名、密碼和監(jiān)聽(tīng)分開(kāi)寫(xiě)

import cx_Oracle

db=cx_Oracle.connect('username/password@host/orcl')

db.close()

方法二:用戶名、密碼和監(jiān)聽(tīng)寫(xiě)在一起

import cx_Oracle

db=cx_Oracle.connect('username','password','host/orcl')

db.close()

方法三:配置監(jiān)聽(tīng)并連接

import cx_Oracle

tns=cx_Oracle.makedsn('host',1521,'orcl')

db=cx_Oracle.connect('username','password',tns)

db.close()

3、建立cursor并執(zhí)行SQL語(yǔ)句:查詢、更新、插入、刪除

創(chuàng)建數(shù)據(jù)庫(kù)連接,創(chuàng)建游標(biāo)cursor,然后執(zhí)行sql語(yǔ)句,執(zhí)行完成后,關(guān)閉游標(biāo),關(guān)閉數(shù)據(jù)庫(kù)連接

創(chuàng)建連接后,建立cursor,并執(zhí)行SQL語(yǔ)句

#encoding=utf-8

# 示例

import cx_Oracle

conn = cx_Oracle.connect('system/oracle@192.0.2.7/orcl')

cursor = conn.cursor()

#執(zhí)行語(yǔ)句的兩種方式,預(yù)處理和直接執(zhí)行

# 首先準(zhǔn)備該語(yǔ)句,然后利用改變的參數(shù)執(zhí)行 None。根據(jù)綁定變量時(shí)準(zhǔn)備一個(gè)語(yǔ)句即足夠這一原則,Oracle 將如同在上例中一樣對(duì)其進(jìn)行處理。準(zhǔn)備好的語(yǔ)句可執(zhí)行任意次。

sql = "select * from dba_users where user_id = :dbv"

cursor.prepare(sql)

rs = cursor.execute (None,{'dbv':63})

rsa = cursor.fetchall()

print (rsa)

# 直接執(zhí)行

cursor.execute ("select * from dba_users where user_id=62")

row = cursor.fetchone ()

print (row[0])

cursor.close ()

conn.close()

import cx_Oracle

# 創(chuàng)建連接后,建立cursor,并執(zhí)行SQL語(yǔ)句

db=cx_Oracle.connect('system','oracle','10.98.156.148/oral')

# db.close()

cr =  db.cursor() # 創(chuàng)建cursor

sql =  'select * from v$version'

cr.execute(sql) # 執(zhí)行sql語(yǔ)句

# 一次返回所有結(jié)果集 fetchall

rs = cr.fetchall()

print("print all:(%s)" %rs)

for x in rs:

    print (x)

# 一次返回一行 fetchone

print("fetchone")

cr.execute(sql)

while (1):

    rs = cr.fetchone()

    if rs == None:

        break

    print(rs)

#使用參數(shù)查詢

pr = {'dbv':'61'}

cr.execute('select * from dba_users where user_id = :dbv',pr)

# 這里將參數(shù)作為一個(gè)字典來(lái)處理

rs = cr.fetchall()

print("parameter print all:(%s)" %rs)

cr.execute('select * from dba_users where user_id =  :dbv',dbv = '61')

# 這里直接寫(xiě)參數(shù)

rs = cr.fetchall()

print("parameter print all: (%s)" %rs)

cr.close()

db.close()

#  插入、更新、刪除操作后需要提交commit

#  查詢include:select

def sqlSelect(sql,db):

    cr=db.cursor()

    cr.execute(sql)

    rs=cr.fetchall()

    cr.close()

    return rs

# 插入、更新、刪除操作后需要提交include:insert,update,delete

def sqlDML(sql,db):

    cr=db.cursor()

    cr.execute(sql)

    cr.close()

    db.commit()

# execute dml with parameters

def sqlDML2(sql,params,db):

    cr=db.cursor()

    cr.execute(sql,params)

    cr.close()

    db.commit()

#增刪改查 示例

#1、單條插入:

sql = "INSERT INTO T_AUTOMONITOR_TMP(point_id) VALUES(:pointId)"

cursorObj.prepare(sql)

rown = cursorObj.execute(None, {'pointId' : pointId})

connectObj.commit()

#2、多條插入:

sql = "INSERT INTO T_AUTOMONITOR_TMP(point_id) VALUES(:pointId)"

cursorObj.prepare(sql)

rown = cursorObj.executemany(None, recordList)

connectObj.commit()

#刪

sql = "DELETE FROM T_AUTOMONITOR_TMP t WHERE t.point_id = :pointId "

cursorObj.prepare(sql)

rown = cursorObj.execute(None, {'pointId' : pointId})

connectObj.commit()

#改

sql = "UPDATE t_automonitor_other t\

      SET t.active = '2'\

      WHERE t.active = '1'\

      AND t.point_id = :pointId\

      "

cursorObj.prepare(sql)

cursorObj.execute(None, {'pointId' : pointId})

connectObj.commit()

#查

sql = "SELECT t.describ FROM t_automonitor_tmp t WHERE t.point_id = :pointId"

cursorObj.prepare(sql)

cursorObj.execute(None, {'pointId' : pointId})

#在綁定時(shí),您可以首先準(zhǔn)備該語(yǔ)句,然后利用改變的參數(shù)執(zhí)行 None。根據(jù)綁定變量時(shí)準(zhǔn)備一個(gè)語(yǔ)句即足夠這一原則,Oracle 將如同在上例中一樣對(duì)其進(jìn)行處理。準(zhǔn)備好的語(yǔ)句可執(zhí)行任意次。

r1 = cursor.execute('SELECT * FROM locations WHERE country_id=:1 AND city=:2', ('US', 'Seattle'))

#數(shù)據(jù)庫(kù)操作簡(jiǎn)單工具

class baseUtilsX():

    """baseUtils"""

    def __init__(self):

        self.connectObj = ""

        self.connCnt = 0

        self.cursorCnt = 0

    def initOracleConnect(self):

        oracle_tns = cx_Oracle.makedsn('XXX.XXX.XXX.XXX', 1521,'XX')

        if self.connCnt == 0:

            self.connectObj = cx_Oracle.connect('oracleUserName', 'password', oracle_tns)

            self.connCnt += 1

    def getOracleConnect(self):

        self.initOracleConnect()

        return self.connectObj

    def closeOracleConnect(self, connectObj):

        connectObj.close()

        self.connCnt -= 1

    def getOracleCursor(self):

        self.initOracleConnect()

        self.cursorCnt += 1

        return self.connectObj.cursor()

    def closeOracleCursor(self, cursorObj):

        cursorObj.close()

        self.cursorCnt -= 1

        if self.cursorCnt == 0:

            print "will close conn"

            self.closeOracleConnect(self.connectObj)

    def selectFromDbTable(self, sql, argsDict):

        # 將查詢結(jié)果由tuple轉(zhuǎn)為list

        queryAnsList = []

        selectCursor = self.getOracleCursor()

        selectCursor.prepare(sql)

        queryAns = selectCursor.execute(None, argsDict)

        for ansItem in queryAns:

            queryAnsList.append(list(ansItem))

        self.closeOracleCursor(selectCursor)

        return queryAnsList

# 摘錄oracle官方文檔https://www.oracle.com/technetwork/cn/articles/dsl/mastering-oracle-python-1391323-zhs.html 

# oracle 日期函數(shù)

# 使用 EXTRACT 語(yǔ)句通過(guò) SQL 查詢將年、月、日這些字段提取出來(lái)

SELECT EXTRACT(YEAR FROM hire_date) FROM employees ORDER BY 1;

使用 Python 的 datetime.date、datetime.time 和 datetime.datetime 對(duì)象作為綁定變量來(lái)查詢?nèi)掌?/p>

如果您需要將現(xiàn)有的字符串分析為 date(time) 對(duì)象,可以使用 datetime 對(duì)象的 strptime() 方法。

>>> from datetime import datetime

>>> datetime.strptime("2007-12-31 23:59:59", "%Y-%m-%d %H:%M:%S")

datetime.datetime(2007, 12, 31, 23, 59, 59)

>>> import datetime

>>> d = datetime.datetime.now()

>>> print d

2007-03-03 16:48:27.734000

>>> print type(d)

<type 'datetime.datetime'>

>>> print d.hour, d.minute, d.second

(16, 48, 27)

--EXTRACT() 函數(shù)用于提取日期/時(shí)間的單獨(dú)部分,比如年、月、日、小時(shí)、分鐘等等。 

select sysdate,

       extract(year from sysdate),

       extract(month from sysdate),

       extract(day from sysdate)

  from dual s;

SELECT EXTRACT(HOUR FROM TIMESTAMP '2010-01-10 11:12:13'),

       EXTRACT(minute FROM TIMESTAMP '2010-01-10 11:12:13'),

       EXTRACT(second FROM TIMESTAMP '2010-01-10 11:12:13')

  FROM DUAL;

#精通 Oracle+Python,第 3 部分:數(shù)據(jù)解析

https://www.oracle.com/technetwork/cn/articles/dsl/prez-python-dataparsing-087750-zhs.html

有關(guān)使用正則表達(dá)式的最好建議是盡可能地避免使用它們。在將它們嵌入代碼前,請(qǐng)確定沒(méi)有字符串方法可以完成相同的工作,因?yàn)樽址椒ǜ烨也粫?huì)帶來(lái)導(dǎo)入以及正則表達(dá)式處理這些額外的開(kāi)銷。在字符串對(duì)象上使用 dir() 就可以看到可用的內(nèi)容。

下例展示了在 Python 這樣一種動(dòng)態(tài)語(yǔ)言中看待正則表達(dá)式的方式。解析 tnsnames.ora 文件以便為每個(gè)網(wǎng)絡(luò)別名創(chuàng)建簡(jiǎn)單連接字符串(將 file() 函數(shù)指向您的 tnsnames.ora 文件的位置):

>>> import re

>>> tnsnames = file(r'tnsnames.ora').read()

>>> easy_connects = {}

>>> tns_re = "^(\w+?)\s?=.*?HOST\s?=\s?(.+?)\).*?PORT\s?=\s?(\d+?)\).*?SERVICE_NAME\s?=\s?(.+?)\)"

>>> for match in re.finditer(tns_re, tnsnames, re.M+re.S):

...  t = match.groups()

...  easy_connects[t[0]] = "%s:%s/%s" % t[1:]

>>> print easy_connects

此程序在 Oracle Database XE 默認(rèn)的 tnsnames.ora 文件上的輸出是:

{'XE': 'localhost:1521/XE'}

以上是“ORACLE中CX_ORACLE庫(kù)怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

分享名稱:ORACLE中CX_ORACLE庫(kù)怎么用
當(dāng)前路徑:http://bm7419.com/article46/jjsghg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開(kāi)發(fā)網(wǎng)站排名、響應(yīng)式網(wǎng)站、搜索引擎優(yōu)化、自適應(yīng)網(wǎng)站、品牌網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

小程序開(kāi)發(fā)