Typed Reference Cursor of Object

Fetch a cursor of user defined type 'REFCUR_OBJECT'.

Example Description

  • A cursor element must be of type PL/SQL Record.
  • Any attribute of the PL/SQL Record can define an user defined type.
  • If the PL/SQL Record defines only one attribute the result cursor will be a Java list of objects defined by the user defined type.
  • If the PL/SQL Record defines more than one attribute the result cursor will be a Java list of transfer objects defined from the PL/SQL Record. The user defined type attribute of the PL/SQL Record will be transfer object corresponding to the user defined type.

Object Definition

The user defined type 'REFCUR_OBJECT' is used as cursor element.
PL/SQL Package Specification : REFCUR_OBJECT
/**
 * REFCUR_OBJECT for typed ref cursor examples.
 */
create or replace type refcur_object force as object (
  n           number(9),
  v           varchar2(100)
);

Package Specification

PL/SQL Package Specification : TYPED_REF_CURSOR_OBJECT
create or replace package TYPED_REF_CURSOR_OBJECT
/**
 * Typed Ref Cursor of Object Demo.
 */
as

-- this type of PL/SQL record will be treated as object/transfer object value
type rec_refcur_object is record (
  o   refcur_object
);

-- this typed ref cursor represents a list of object/transfer object values
type c_refcur_object is ref cursor return rec_refcur_object;

-- this type of PL/SQL record will be treated as object/transfer object value
type rec_refcur_object_mixed is record (
  ts  timestamp,
  o   refcur_object
);

-- this typed ref cursor represents a list of transfer objects
type c_refcur_object_mixed is ref cursor return rec_refcur_object_mixed;

/**
 * Return a list of objects/transfer objects.
 *
 * @return List of objects/transfer objects.
 */
function get_refcur_object(i_number_of_rows in number) return c_refcur_object;

/**
 * Return a list of pl/sql records/transfer objects including an object.
 *
 * @return List of pl/sql records/transfer objects including an object.
 */
function get_refcur_object_mixed(i_number_of_rows in number) return c_refcur_object_mixed;

end TYPED_REF_CURSOR_OBJECT;

Package Body

PL/SQL Package Specification : TYPED_REF_CURSOR_OBJECT
create or replace package body TYPED_REF_CURSOR_OBJECT
as

/**
 * Return a list of objects/transfer objects.
 *
 * @return List of objects/transfer objects.
 */
function get_refcur_object(i_number_of_rows in number) return c_refcur_object
is
  c c_refcur_object;
begin
  open c for
    select  refcur_object(rownum, 'element refcur_object no. ' || rownum)
      from  dual 
      connect by level<=i_number_of_rows;

  return c;
end get_refcur_object;

/**
 * Return a list of pl/sql records/transfer objects including an object.
 *
 * @return List of pl/sql records/transfer objects including an object.
 */
function get_refcur_object_mixed(i_number_of_rows in number) return c_refcur_object_mixed
is
  c c_refcur_object_mixed;
begin
  open c for
    select  systimestamp+rownum * 12.3456,
            refcur_object(rownum, 'element refcur_object no. ' || rownum)
      from  dual 
      connect by level<=i_number_of_rows;

  return c;
end get_refcur_object_mixed;

end TYPED_REF_CURSOR_OBJECT;

Factory API : Calling the PL/SQL package

Using the static factory to get the remote service.
Java Calling Class : TypedRefCursorObjectFactoryApi.java
package plsql_workbench_examples.factoryapi;

import java.util.List;
import java.util.concurrent.ThreadLocalRandom;

import factory.ExamplesRPCFactory;
import service.TypedRefCursorObjectService;
import transferobject.RefcurObject;
import transferobject.TypedRefCursorObjectTO;

public class TypedRefCursorObjectFactoryApi {
  public static void main(String[] args)
  {
    try {
      // set database credentials and configuration parameters
      System.setProperty("dbw_examples.url", "jdbc:oracle:thin:@192.168.0.109:1521/orcl");
      System.setProperty("dbw_examples.username", "dbw_examples");
      System.setProperty("dbw_examples.password", "dbw_examples");

      // get the service
      TypedRefCursorObjectService service = ExamplesRPCFactory.getTypedRefCursorObjectService();

      // call the stored procedure and receive a list of objects
      List<RefcurObject> list;
      list = service.getRefcurObject(ThreadLocalRandom.current().nextInt(5, 13), 0);

      // print information
      for (RefcurObject item : list) {
        System.out.format("RefcurObject[n:%s, v:%s]%n", item.n, item.v);
      }

      // call the stored procedure and receive a list of mixed objects
      List<TypedRefCursorObjectTO.RecRefcurObjectMixed> mixedList;
      mixedList = service.getRefcurObjectMixed(ThreadLocalRandom.current().nextInt(7, 17), 0);

      // print information
      for (TypedRefCursorObjectTO.RecRefcurObjectMixed item : mixedList) {
        System.out.format("ts:%s - RefcurObject[n:%s, v:%s]%n", item.ts, item.o.n, item.o.v);
      }
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }
}

Spring API : Calling the PL/SQL package

Using Spring annotation to inject the service and call the remote service.
Java Calling Class : TypedRefCursorObjectSpringApi.java
package plsql_workbench_examples.springapi;

import java.util.List;
import java.util.concurrent.ThreadLocalRandom;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.support.GenericApplicationContext;
import org.springframework.stereotype.Component;

import service.TypedRefCursorObjectService;
import transferobject.RefcurObject;
import transferobject.TypedRefCursorObjectTO;

@Component
public class TypedRefCursorObjectSpringApi {
  @Autowired
  private TypedRefCursorObjectService typedRefCursorObjectService;

  public static void main(String[] args)
  {
    // set database credentials and configuration parameters
    System.setProperty("dbw_examples.url", "jdbc:oracle:thin:@192.168.0.109:1521/orcl");
    System.setProperty("dbw_examples.username", "dbw_examples");
    System.setProperty("dbw_examples.password", "dbw_examples");

    // Register Spring Beans, Spring Context and call demo method 
    try (GenericApplicationContext ctx = BaseSpringConfig.getCtx(TypedRefCursorObjectSpringApi.class)) {
      ctx.getBean(TypedRefCursorObjectSpringApi.class).runDemo();
    }
  }

  private void runDemo()
  {
    try {
      // call the stored procedure and receive a list of objects
      List<RefcurObject> list = typedRefCursorObjectService.getRefcurObject(ThreadLocalRandom.current().nextInt(5, 13),
                                                                            0);

      // print information
      for (RefcurObject item : list) {
        System.out.format("RefcurObject[n:%s, v:%s]%n", item.getN(), item.getV());
      }

      // call the stored procedure and receive a list of mixed objects
      List<TypedRefCursorObjectTO.RecRefcurObjectMixed> mixedList;
      mixedList = typedRefCursorObjectService.getRefcurObjectMixed(ThreadLocalRandom.current().nextInt(7, 17), 0);

      // print information
      for (TypedRefCursorObjectTO.RecRefcurObjectMixed item : mixedList) {
        System.out.format("ts:%s - RefcurObject[n:%s, v:%s]%n", item.getTs(), item.getO().getN(), item.getO().getV());
      }
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }
}