Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Wywołaj procedurę składowaną zawierającą zbiór rekordów za pomocą callproc w pythonie

Nie możesz bezpośrednio używać collections.namedtuple jako typ obiektu Oracle.

Wypróbowałem poniższe w Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 z Cx-Oracle-7.0.0 i Python 3.6.4 i to działa dla mnie.

Utwórz TYP

CREATE OR REPLACE TYPE object_tag_rec AS OBJECT (
     tag_type       VARCHAR2(1),
     tag_category   VARCHAR2(100),
     tag_key        VARCHAR2(250),
     tag_value      VARCHAR2(250),
     created_by     VARCHAR2(50)
);
/

Utwórz kolekcję

CREATE OR REPLACE TYPE object_tag_tbl is TABLE OF object_tag_rec;
/

Utwórz procedurę

CREATE OR REPLACE procedure  sp_add_object_tags(
pi_account_id               IN  INT,
pi_object_id                IN  INT,
pi_all_tags_identified      IN  VARCHAR2,
pi_object_tag_tbl           IN  object_tag_tbl,
po_error_code               OUT NUMBER,
po_error_message            OUT VARCHAR2 )
AS 
BEGIN

   po_error_code    := 0;
   po_error_message := 'NO ERRORS';
END;
/

kod

import cx_Oracle
conn = cx_Oracle.connect('user/[email protected]//localhost:1521/dbname')
cur = conn.cursor()

recordTypeObj = conn.gettype("HR.OBJECT_TAG_REC") #mind the cases
tableTypeObj  = conn.gettype("HR.OBJECT_TAG_TBL")
params = tableTypeObj.newobject()

rec = recordTypeObj.newobject()
(rec.TAG_TYPE,rec.TAG_CATEGORY,rec.TAG_KEY,rec.TAG_VALUE,rec.CREATED_BY) = ("S","person","person","1","abc")  
#mind the cases for attributes.

po_error_code    = cur.var(cx_Oracle.NUMBER)
po_error_message = cur.var(cx_Oracle.STRING)

params.append(rec)
cur.callproc('dbms_output.enable')
cur.callproc('hr.sp_add_object_tags', [1234, 5678, 'N', params, po_error_code, po_error_message])

print (po_error_code.getvalue(),po_error_message.getvalue())

Wykonanie

$python pass_obj.py
0.0 NO ERRORS



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Natychmiastowa aktualizacja obszaru tekstowego JavaFX

  2. Musi wykonać jedno zapytanie sql do dwóch baz danych Oracle w skrypcie powłoki naraz i wyeksportować dane do oddzielnych plików csv

  3. problem ze składnią sql

  4. Jak mogę sprawić, by cx-oracle powiązał wyniki zapytania ze słownikiem, a nie krotką?

  5. parametr oddzielony przecinkami w procedurze składowanej plsql