Skip to content

JDBC helpers for stored procedure/function calls

License

Notifications You must be signed in to change notification settings

dmvolodin/morejdbc

 
 

Repository files navigation

license build

This project contains helper classes to call stored procedures and functions. The base framework is spring (spring-jdbc). It is fair-typesafe (no unsafe casts inside). The most compatible database is Oracle.

To add the library in Maven:

<dependency>
    <groupId>com.github.seregamorph</groupId>
    <artifactId>morejdbc</artifactId>
    <version>1.0</version>
</dependency>

For gradle: compile com.github.seregamorph:morejdbc:1.0

Oracle Examples

For Oracle procedure/function calls you can use NamedJdbcCall. The parameters are passing by name, that allows:

  • parameters reordering
  • support default value
  • support overloading

Consider you have a procedure and a function in a package:

create or replace package body test_more_jdbc_pkg
as
    procedure calc_sum_and_multiply_of_two_numbers(p_number1 number,
                                                   p_number2 number,
                                                   po_sum out number,
                                                   po_mlt out number)
        is
    begin
        po_sum := p_number1 + p_number2;
        po_mlt := p_number1 * p_number2;
    end;

    function get_concat_of_two_strings(p_string1 varchar2, p_string2 varchar2)
        return varchar2 is
    begin
        return p_string1 || p_string2;
    end;
end;

You can call it:

import org.morejdbc.*;
import static org.morejdbc.SqlTypes.*;

...
private JdbcTemplate jdbcTemplate;

...
Out<Integer> sum = Out.of(INTEGER);
Out<Long> mlt = Out.of(BIGINT);
jdbcTemplate.execute(call("test_more_jdbc_pkg.calc_sum_and_multiply_of_two_numbers")
        .in("p_number1", 1)
        .in("p_number2", 2L)
        .out("po_sum", sum)
        .out("po_mlt", mlt)
);
// sum.get() is 3 (Integer)
// mlt.get() is 2L (Long)

or in value-consumer style with lambdas

AtomicReference<Integer> sum = new AtomicReference<>();
AtomicReference<Long> mlt = new AtomicReference<>();
jdbcTemplate.execute(call("test_more_jdbc_pkg.calc_sum_and_multiply_of_two_numbers")
        .in("p_number1", 1)
        .in("p_number2", 2L)
        .out("po_sum", INTEGER, sum::set)
        .out("po_mlt", BIGINT, mlt::set)
);
// sum.get() is 3 (Integer)
// mlt.get() is 2L (Long)

For functions:

String result = jdbcTemplate.execute(call("test_more_jdbc_pkg.get_concat_of_two_strings", VARCHAR)
        .in("p_string2", "def")
        .in("p_string1", "abc") // note: reordered p_string1, p_string2
);
// result is "abcdef" (p_string1 + p_string2)

About

JDBC helpers for stored procedure/function calls

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Java 91.5%
  • PLSQL 5.5%
  • Shell 1.6%
  • Other 1.4%