如何使用Python读取Oracle存储过程的内容



我正在尝试使用python读取存储过程的内容/代码。

我使用cx_Oracle函数来建立与Oracle数据库的连接。

这是代码

import cx_Oracle as co
import pandas as pd
dsn_tsn = co.makedsn(ip,port,SID)
db=co.connect(username,password,dsn_tsn)
cursor = db.cursor()
cursor.callproc(procedure_name,['argument']) # will be me result of the procedure.

然而,我正在努力阅读程序代码本身。有什么功能可以做到这一点吗?

您可以用的方式从代码中调用DBMS_METADATA.GET_DDL函数

import cx_Oracle
db = cx_Oracle.connect("<uname>/<pwd>@<host>:<port>/<service_name>")
cursor = db.cursor()

def OutputTypeHandler(cursor, name, defaultType, size, precision, scale):
if defaultType == cx_Oracle.CLOB:
return cursor.var(cx_Oracle.LONG_STRING, arraysize = cursor.arraysize)
cursor.outputtypehandler = OutputTypeHandler
cursor.execute("SELECT DBMS_METADATA.GET_DDL('PROCEDURE', :PrcName) FROM DUAL",
PrcName="MY_LITTLE_PROC")
print("returned DDL is :",cursor.fetchall())

可以通过user_source视图访问存储过程的代码。所以,如果你查询它,你会看到你想要什么。方法如下:

SQL> create or replace procedure p_test is
2  begin
3    null;
4  end;
5  /
Procedure created.
SQL> desc user_source
Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
NAME                                               VARCHAR2(30)
TYPE                                               VARCHAR2(12)
LINE                                               NUMBER
TEXT                                               VARCHAR2(4000)
SQL> select text from user_source where name = 'P_TEST' and type = 'PROCEDURE';
TEXT
--------------------------------------------------------------------------------
procedure p_test is
begin
null;
end;
SQL>

不过,由于我不会说Python,我无法帮助您在那里使用实际的代码。我写的最后一篇select正是你所需要的;我希望你能用上它。祝你好运!

import oracledb
db = oracledb.connect("<uname>/<pwd>@<host>:<port>/<service_name>")
cursor = db.cursor()
cursor.execute("SELECT DBMS_METADATA.GET_DDL('PROCEDURE', 'PROC_NAME', 'OWNER') FROM DUAL")
c = cursor.fetchall()
print( c[0][0] )
# To save on file    
sample = open('samplefile.txt', 'w')
print(c[0][0], file = sample)
sample.close()

更改连接详细信息PROC_NAME和OWNER并运行。

最新更新