Итак, я пытаюсь выяснить, как мне передать следующий пользовательский объект (не включенный ни в один пакет) в вызов функции:
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);
} ....
Нужно ли искать другой способ передачи пользовательского объекта в функцию оракула?