python調用oracle存儲過程,讀取返回的遊標

存儲過程代碼

CREATE OR REPLACE Procedure dw_all.test_procedure
-- 外部輸入參數
(
  v_name In varchar,
  r_result out sys_refcursor
) As
v_sql   varchar2(1000); 
Begin
 
-- 存儲過程中兩個單引號轉義爲一個單引號,見下面的where條件
v_sql := 'select a,b from dw_all.test where a='''||v_name||''''; 
-- 使用open將結果存入遊標返回出去
OPEN r_result FOR v_sql; 
 
Exception
  When Others Then
    Dbms_Output.Put_Line('出錯!');
End;

python代碼

import cx_Oracle
import pandas as pd
 
conn = cx_Oracle.connect('dw_all/A1***23@172.*.*.200/gb')
cur = conn.cursor()
i_cur = cur.var(cx_Oracle.CURSOR)
#第一個是存儲過程名稱,列表中爲按順序排列的參數
results = cur.callproc('dw_all.test_procedure',['b',i_cur])
l_results = results[1]
cols=[x[0] for x in l_results.description]
rs=pd.DataFrame(list(l_results),columns=cols)
conn.close()

#遊標內容,注意遊標遍歷一次後就是空的了
list(l_results)
#遊標內容的字段
[x[0] for x in l_results.description]


--------------------------------------------
存儲過程源表數據
A	B
a	1
a	2
b	1
b	2
b	3

存儲過程結果數據
   A  B
0  b  1
1  b  2
2  b  3

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章