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

iq3niunx  于 2023-02-11  发布在  Oracle
关注(0)|答案(3)|浏览(160)

我正在尝试使用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.

然而,我正在尝试读取过程本身的代码。有什么函数可以做到这一点吗?

o0lyfsai

o0lyfsai1#

您可以通过以下方式从代码中调用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())
woobm2wo

woobm2wo2#

存储过程的代码可以通过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正是您需要的;我希望你能用得上。祝你好运!

dsekswqp

dsekswqp3#

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,然后运行。

相关问题