Вызов функции Oracle PL / SQL с пользовательским объектом INPUT JDBC - PullRequest
0 голосов
/ 29 июня 2018

Итак, я пытаюсь выяснить, как мне передать следующий пользовательский объект (не включенный ни в один пакет) в вызов функции:

    CREATE OR REPLACE TYPE RABO_OWNER_DEV.SIANAGR_SEARCH_PARAM AS OBJECT
(
   pFilter        VARCHAR2(32000 CHAR),
   pOrderByCond   VARCHAR2(32000 CHAR),
   pScopeName     VARCHAR2(100 CHAR),
   ANACODANA      NUMBER(9),
   ANADENOM       VARCHAR2(180 CHAR),
   ANADENOMLANG2  VARCHAR2(180 CHAR),
   ANADENOMLANG3  VARCHAR2(180 CHAR),
   ANAFGIUR       VARCHAR2(10 CHAR),
   DSCOUNTRY      VARCHAR2(40 CHAR),
   ANACFISC       VARCHAR2(40 CHAR),
   ANAPIVA        VARCHAR2(40 CHAR),
   FROM_ANACODANA NUMBER(9),
   TO_ANACODANA   NUMBER(9),
   ANAEXCOD       VARCHAR2(30 CHAR),
   ANATIPPERS     VARCHAR2(1 CHAR),
   ANACODCAPOGRP  VARCHAR2(16 CHAR),
   ANACODDOC      VARCHAR2(10 CHAR),
   ANANUMDOC      VARCHAR2(15 CHAR),
   CLCINDTIPOIND  VARCHAR2(1 CHAR),
   CLCINDCODNAZ   VARCHAR2(10 CHAR),
   CLCINDPROV     VARCHAR2(10 CHAR),
   CLCINDLOC      VARCHAR2(100 CHAR),
   CLCINDCAP      VARCHAR2(10 CHAR),
   CLCINDIRIZZO   VARCHAR2(250 CHAR),
   CLCINDTEL      VARCHAR2(25 CHAR),
   CLCINDCELL     VARCHAR2(25 CHAR),
   CLCINDFAX      VARCHAR2(25 CHAR),
   CLCINDEMAIL    VARCHAR2(80 CHAR),
   CLCINDPEC      VARCHAR2(80 CHAR),
   CLCGRPNDG      VARCHAR2(16 CHAR),
   CLCGRPCODGRP   NUMBER(9),
   CLCGRPDESC     VARCHAR2(50 CHAR),
   MULTISEARCH    VARCHAR2(32000 CHAR),
   CLCTIPO        VARCHAR2(1 CHAR),
   ANACRISC       VARCHAR2(20 CHAR),
   ANASAE       VARCHAR2(10 CHAR),
   TELIMITCONS     NUMBER(1),
   TERICHOBLIO     NUMBER(1)
)
/

Итак, сначала я подумал, что можно динамически получить объект из БД, и я искал что-то в сети, и я нашел следующий код (я изменю это в будущем, получая атрибуты, но для проверяя работоспособность я вызываю метод как есть):

void getAttributeInfo (Connection conn, String type_name) throws SQLException 
{ 
 // get the type descriptor 
 StructDescriptor desc = StructDescriptor.createDescriptor (type_name, conn); 

 // get type meta data 
 ResultSetMetaData md = desc.getMetaData (); 

 // get # of attrs of this type 
 int numAttrs = desc.getLength (); 

 // temporary buffers 
 String attr_name; 
 int attr_type; 
 String attr_typeName; 

 System.out.println ("Attributes of "+type_name+" :"); 
 for (int i=0; i<numAttrs; i++) 
 { 
   attr_name = md.getColumnName (i+1); 
   attr_type = md.getColumnType (i+1); 
   System.out.println (" index"+(i+1)+" name="+attr_name+" type="+attr_type); 

   // drill down nested object 
   if (attr_type == OracleTypes.STRUCT) 
   { 
     attr_typeName = md.getColumnTypeName (i+1); 

     // recursive calls to print out nested object meta data 
     getAttributeInfo (conn, attr_typeName); 
   } 
 } 
}

Это моя функция PL / SQL:

FUNCTION LS_SEARCH_SIANAGR(
   p_CodCompany   VARCHAR2,
   p_Bo_SessionID VARCHAR2 ,
   p_Context NUMBER,
   p_RowRead      OUT NOCOPY NUMBER,
   p_RowCount     OUT NOCOPY NUMBER,
   p_NumOfPages   OUT NOCOPY NUMBER,
   p_PAGE2EXTRACT NUMBER,
   p_WithActionInfo NUMBER,
   p_UseView NUMBER,
   p_searchParam  SIANAGR_SEARCH_PARAM
) RETURN SYS_REFCURSOR
AS
  PRAGMA AUTONOMOUS_TRANSACTION;
  v_Result SYS_REFCURSOR;
BEGIN

    LsSiSession.checkSession(p_CodCompany, p_Bo_SessionID, p_Context);  

  v_Result :=  LsAnaHeader_EL.LS_SEARCH_SIANAGR(
    p_CodCompany,
    p_Bo_SessionID,
    p_Context,
    p_RowRead,
    p_RowCount,
    p_NumOfPages,
    p_PAGE2EXTRACT,
    p_WithActionInfo,
    p_UseView,
    p_searchParam);
  COMMIT;
  RETURN v_Result;
EXCEPTION
  WHEN OTHERS THEN
    ROLLBACK;
    LsGlobal.LsErrorTrace(SQLERRM);
END;

Затем я определил CallableStatement следующим образом:

CallableStatement cs = null;

getAttributeInfo (conn, "SIANAGR_SEARCH_PARAM");
String anagrSearchSql = "{call myPackage.myProcedure(?,?,?,...)}";

Когда я пытаюсь бежать, я получаю:

class java.lang.ClassCastException com.sun.proxy.$Proxy28 cannot be cast to oracle.jdbc.OracleConnection

В следующей строке:

StructDescriptor desc = StructDescriptor.createDescriptor (type_name, conn); 

Я также искал эту ошибку, но обнаружил, что мне нужно развернуть соединение с «OracleConnection», но я не вижу цели этого. ( Невозможно привести соединение к oracle.jdbc. .OracleConnection )

Вот как я определил свое соединение:

public LinkRABOUnitService(String id, RTXManager mgr, Element descr) throws RTXException {
    super(id, mgr, descr);

    hbService = (HibernateService) mgr.getService(dbId + ".hibernate", HibernateService.class);
}

public Object execute(Map operationContext, Map sessionContext) throws RTXException {
    Session hbSession = null;
    boolean inTransaction = false;
    Connection connection = null;
    StringBuffer response = new StringBuffer();

    /* retrieve unit parameters */
    String xml = BeanHelper.asString(operationContext.get(getId() + ".xml"));
    String idCodeElaborazione = BeanHelper.asString(operationContext.get(getId() + ".idElaborazione"));

    try {
        // get hibernate session
        hbSession = locateTransactionSession(hbService, operationContext);
        if (hbSession != null) {
            inTransaction = true;
        } else {
            hbSession = openSession(hbService, operationContext, sessionContext);
        } ....

Нужно ли искать другой способ передачи пользовательского объекта в функцию оракула?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...