resueltos - Obteniendo el tipo de registro devuelto de la función plsql en java
procedimiento anonimo plsql (2)
En primer lugar, solo puede llamar a funciones que devuelven objetos SQL de Java, no objetos PLSQL. Así que cambie su challan_rec en consecuencia. Todo el proceso debe incluir 4 pasos dados a continuación.
Cree un tipo de objeto a nivel de esquema (no dentro de un paquete). Además, tu tipo debe ser del tipo OBJECT, no RECORD.
CREATE OR REPLACE TYPE Some_schema.chellan_rec IS OBJECT ( challan_number varchar2(40), challan_amount number )
2. Cambia tu función get_chellan para devolver este objeto
Implementar la interfaz SQLData
public class Chellan_Rec implements SQLData{ //override readSQL, writeSQL and getSQLTypeName methods }
Llamar al código PLSQL desde Java
ResultSet rs=null; CallableStatement stmt=null; Chellan_Rec rec = null; try{ String sqlQuery = "{call get_chellan(?,?)}"; //map plsql type to Java type Map m = conn.getTypeMap(); m.put("schema_name.chellan_rec", Class.forName("some_java_package.Chellan_Rec"));//this maps the Java class to the Oracle custom type conn.setTypeMap(m); stmt=conn.prepareCall(sqlQuery); stmt.registerOutParameter(1, Types.STRUCT, "chellan_rec"); stmt.setObject(2, fooNum); stmt.execute(); rec = (Chellan_Rec)stmt.getObject(1); }catch(Exception e){ //log the exception; }
Tengo una función plsql
que devuelve un tipo de registro challan_rec
.
create or replace package xx_bal_api as
type challan_rec is record (
challan_number varchar2(40),
challan_amount number
);
FUNCTION get_challan(foo number) return challan_rec;
end;
create or replace package body xx_bal_api as
FUNCTION get_challan(foo number) return challan_rec
is
cr challan_rec;
begin
cr.challan_number := ''00002154215'';
cr.challan_amount := 2265;
return cr;
end get_challan;
end;
Quiero llamar a esta función desde el código java y obtener ese tipo de registro en java. Amablemente guíame cómo hacer eso. Gracias
Primero, comencemos por corregir su código. Veo que su código publicado no se compilará y arrojará un problema. El código correcto es el siguiente:
CREATE OR REPLACE PACKAGE xx_bal_api
AS
TYPE challan_rec IS RECORD
(
challan_number VARCHAR2 (40),
challan_amount NUMBER
);
TYPE rec IS TABLE OF challan_rec index by pls_integer;
FUNCTION get_challan (foo NUMBER)
RETURN rec;
END;
/
CREATE OR REPLACE PACKAGE BODY xx_bal_api
AS
FUNCTION get_challan (foo NUMBER)
RETURN rec
IS
cr rec;
BEGIN
cr (1).challan_number := ''00002154215'';
cr (1).challan_amount := foo;
RETURN cr;
END get_challan;
END;
Cuando ejecuta este código, puede enfrentar un problema como el invalid datatype
. Esto se debe a que un RECORD
está limitado para ser utilizado dentro de PLSQL
.
select xx_bal_api.get_challan(2265) from dual;
ORA-00902: tipo de datos no válido
La mejor manera de hacerlo es crear un OBJECT
y un TYPE
del objeto y luego return
en su función:
CREATE OR REPLACE TYPE challan_rec IS OBJECT
(
challan_number VARCHAR2 (40),
challan_amount NUMBER
);
/
CREATE OR REPLACE Type rec is table of challan_rec;
/
CREATE OR REPLACE FUNCTION get_challan(foo number)
return rec
is
cr rec:=rec();
begin
cr.extend();
cr(1):= challan_rec(''00002154215'',foo);
return cr;
end get_challan;
end;
/
Ejecución:
SQL> select get_challan(2265) from dual;
/