sintaxis resueltos procedimiento llamar funcion entre ejercicios ejemplo diferencia desde desarrollo bloque anonimo almacenado java plsql

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.

  1. 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

  1. Implementar la interfaz SQLData

    public class Chellan_Rec implements SQLData{ //override readSQL, writeSQL and getSQLTypeName methods }

  2. 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; /