Как прочитать содержимое хранимых процедур Oracle, используя Python - PullRequest
1 голос
/ 07 марта 2020

Я пытаюсь прочитать содержимое / код хранимой процедуры, используя python.

я использовал функцию cx_ Oracle, чтобы установить sh соединение с базой данных 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.

Однако я пытаюсь прочитать сам код процедуры. Есть ли какая-либо функция для этого?

Ответы [ 2 ]

0 голосов
/ 07 марта 2020

Вы можете вызвать функцию 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())
0 голосов
/ 07 марта 2020

Код хранимых процедур доступен через 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, который я написал, - то, что вам нужно; Я надеюсь, вам удастся использовать его. Удачи!

...