You can use Java Open Client DATASET and TABLE parameters to send/receive datasets and temp-tables to/from the application server, as shown in the following example code.

ABL code

OutDataSet.p
DEFINE TEMP-TABLE ttCust 
        FIELD CustNum LIKE Customer.Custnum 
        FIELD NAME LIKE Customer.NAME 
        FIELD Address LIKE Customer.Address 
        FIELD City LIKE Customer.City 
        FIELD CreditLimit LIKE Customer.CreditLimit .
        
DEFINE DATASET myDS FOR ttCust.
        
DEFINE INPUT PARAMETER minCredit AS INTEGER.
DEFINE INPUT PARAMETER maxCredit AS INTEGER.
DEFINE OUTPUT PARAMETER DATASET FOR  myDS.
InpOutDataSet.p
DEFINE TEMP-TABLE ttCust 
        FIELD CustNum LIKE Customer.Custnum 
        FIELD NAME LIKE Customer.NAME 
        FIELD Address LIKE Customer.Address 
        FIELD City LIKE Customer.City 
        FIELD CreditLimit LIKE Customer.CreditLimit .
        
DEFINE DATASET myDS FOR ttCust.
        
DEFINE INPUT PARAMETER moreCredit AS INTEGER.
DEFINE INPUT-OUTPUT PARAMETER DATASET FOR  myDS.
InpDataSet.p
DEFINE TEMP-TABLE ttCust 
        FIELD CustNum LIKE Customer.Custnum 
        FIELD NAME LIKE Customer.NAME 
        FIELD Address LIKE Customer.Address 
        FIELD City LIKE Customer.City 
        FIELD CreditLimit LIKE Customer.CreditLimit .
        
DEFINE DATASET myDS FOR ttCust.
        
DEFINE INPUT PARAMETER DATASET FOR  myDS.
OutTable.p
DEFINE TEMP-TABLE ttCust 
        FIELD CustNum LIKE Customer.Custnum 
        FIELD NAME LIKE Customer.NAME 
        FIELD Address LIKE Customer.Address 
        FIELD City LIKE Customer.City 
        FIELD CreditLimit LIKE Customer.CreditLimit .
        

DEFINE INPUT PARAMETER minCredit AS INTEGER.
DEFINE INPUT PARAMETER maxCredit AS INTEGER.
DEFINE OUTPUT PARAMETER TABLE FOR  ttCust.
InpOutTable.p
DEFINE TEMP-TABLE ttCust 
        FIELD CustNum LIKE Customer.Custnum 
        FIELD NAME LIKE Customer.NAME 
        FIELD Address LIKE Customer.Address 
        FIELD City LIKE Customer.City 
        FIELD CreditLimit LIKE Customer.CreditLimit .
        
DEFINE INPUT PARAMETER moreCredit AS INTEGER.
DEFINE INPUT-OUTPUT PARAMETER TABLE FOR ttCust.
InpTable.p
DEFINE TEMP-TABLE ttCust 
        FIELD CustNum LIKE Customer.Custnum 
        FIELD NAME LIKE Customer.NAME 
        FIELD Address LIKE Customer.Address 
        FIELD City LIKE Customer.City 
        FIELD CreditLimit LIKE Customer.CreditLimit .
        
DEFINE INPUT PARAMETER TABLE FOR ttCust.

OpenAPI code

// Example code using DataSet and TempTable parameters on Java client

import java.util.List;
import com.progress.open4gl.*;
import com.progress.open4gl.javaproxy.*;


public class AppNoHandle {

    public static void main(String[] args) throws Exception {
    	
    	try
    	{
    		System.out.println("DataSet Example");
	        Connection myConn = new Connection("http://<host>/apsv", "", "", "");   
	        
	        Integer minCreditLimit = 100;
	        Integer maxCreditLimit = 3000;
	        Integer moreCredit     = 5000;
	            	
	        OpenAppObject dynAO = new OpenAppObject(myConn,"");
	        
	        /////////////////////////////////////////////////////
	        // Example code passing DataSet as output parameter
	
	        // Create the ParamArray
	        ParamArray parms = new ParamArray(3);
	
	        // Set up input parameters
	        parms.addInteger(0, minCreditLimit, ParamArrayMode.INPUT);
	        parms.addInteger(1, maxCreditLimit, ParamArrayMode.INPUT);
	
	        // Set up Out parameters.
	        ProDataGraphMetaData dgmd = createDGMetaData();
	        parms.addDataset(2, null, ParamArrayMode.OUTPUT, dgmd);
	       
	        // Run the procedure
	        System.out.println("Calling OutDataSet.p");
	        dynAO.runProc("OutDataSet.p", parms);    
        
	        ProDataGraph pdg = (ProDataGraph) parms.getOutputParameter(2);
	        List custList = pdg.getProDataObjects(pdg.getTableNames()[0]);
	        
	        System.out.println(pdg.getTableNames()[0] + " has " + custList.size() + " records.");        
	        
	        /////////////////////////////////////////////////////
	        /// Example code passing DataSet as input-output parameter
	        
	        parms = new ParamArray(2);
	    	
	        // Set up input parameters
	        parms.addInteger(0, moreCredit, ParamArrayMode.INPUT);
	
	        // Set up input-output parameters.
	        parms.addDataset(1, pdg, ParamArrayMode.INPUT_OUTPUT, dgmd);
	        
	        System.out.println("Calling InpOutDataSet.p");
	        dynAO.runProc("InpOutDataSet.p", parms);
	        
	        pdg = (ProDataGraph) parms.getOutputParameter(1);
	        custList = pdg.getProDataObjects(pdg.getTableNames()[0]);
	        System.out.println(pdg.getTableNames()[0] + " from InpOutDataSet.p has " + custList.size() + " records."); 
	        
	        /////////////////////////////////////////////////////////////////
	        // Example code passing DataSet as input parameter
	    
	        parms = new ParamArray(1);
	    	
	        // Set up input parameter
	        parms.addDataset(0, pdg, ParamArrayMode.INPUT, dgmd);
	        
	        System.out.println("Calling InpDataSet.p");
	        dynAO.runProc("InpDataSet.p", parms);
	       
	        System.out.println("Finished InpDataSet.p");
	        
	        /////////////////////////////////////////////////////////////////
	        
	        doSomeTempTableWork(dynAO, pdg);
	        System.out.println( "Sample done"); 
    	}
    	catch (Exception e)
    	{
    		System.out.println(e.getMessage());
    		e.printStackTrace();
    	}    
        finally
    	{
    	}
    }
    
    
    public static ProDataGraphMetaData createDGMetaData() throws ProDataException
    {  	
    	ProDataGraphMetaData dgmd = null;
    	ProDataObjectMetaData custmd = null;
    	
    	try
    	{
    		dgmd = new ProDataGraphMetaData("myCustomerTable");	
	        
	        custmd = new ProDataObjectMetaData("ttCust", 5, false, 0, "", "", "");
	        custmd.setPrimeUniqueName("CustNum");
	        
	        custmd.setFieldMetaData(1, "CustNum", 0, Parameter.PRO_INTEGER, 0, 0);
	        custmd.setFieldMetaData(2, "Name", 0, Parameter.PRO_CHARACTER, 0, 0);
	        custmd.setFieldMetaData(3, "Address", 0, Parameter.PRO_CHARACTER, 0, 0);
	        custmd.setFieldMetaData(4, "City", 0, Parameter.PRO_CHARACTER, 0, 0);
	        custmd.setFieldMetaData(5, "CreditLimit", 0, Parameter.PRO_DECIMAL, 0, 0); 
	        
	        dgmd.addTable(custmd);
    	}
    	catch (Exception e)
    	{
    		System.out.println(e.getMessage());
    		e.printStackTrace();
    	}
    	finally
    	{
    	}
    	
        return dgmd;
    }
    
    
    public static void doSomeTempTableWork(OpenAppObject dynAO, ProDataGraph pdg) 
    					throws Exception
    {  	
    	ProDataGraph pdgOut;
        List custList;
    	
    	try
    	{	
    	    System.out.println("\n\nTempTable Examples");
	        Integer minCreditLimit = 100;
	        Integer maxCreditLimit = 3000;
            Integer moreCredit = 3000;
            
            //////////////////////////////////////////////////////////////
            /// Example code passing Table as output parameter
            
    		// Set up input parameters
    		ParamArray parms = new ParamArray(3);
    		
    		// Set up input parameters
    		parms.addInteger(0, minCreditLimit, ParamArrayMode.INPUT);
    		parms.addInteger(1, minCreditLimit, ParamArrayMode.INPUT);

    		// Set up output parameters
    		// For Java OpenClient, a temp-table is represented as a ProDataGrpah with a single table
    		ProDataGraphMetaData dgmd = createDGMetaData();
    		// Must specify specify metadata
    		parms.addTable(2, null, ParamArrayMode.OUTPUT, dgmd);

    		System.out.println("Calling OutTable.p");
    		dynAO.runProc("OutTable.p", parms);
    		
    		pdgOut = (ProDataGraph) parms.getOutputParameter(2);
    		custList = pdg.getProDataObjects(pdgOut.getTableNames()[0]);
    		System.out.println(pdgOut.getTableNames()[0] + " from OutTable.p has " + custList.size() + " records."); 	

    		////////////////////////////////////////////////////////////////
    		/// Example code passing Table as input-output parameter

    		parms = new ParamArray(2);
    		
    		parms.addInteger(0, moreCredit, ParamArrayMode.INPUT);
    		
    		// Set up In-Out parameters
    		parms.addTable(1, pdg, ParamArrayMode.INPUT_OUTPUT, dgmd);
    		System.out.println("Calling InpOutTable.p");
    		dynAO.runProc("InpOutTable.p", parms);
    		
    		pdgOut = (ProDataGraph) parms.getOutputParameter(1);
            custList = pdgOut.getProDataObjects(pdgOut.getTableNames()[0]);
            System.out.println(pdgOut.getTableNames()[0] + " from InpOutTable.p has " + custList.size() + " records.");      
            
            /////////////////////////////////////////////////////////////////
            /// Example code passing Table as input parameter

            parms = new ParamArray(1);

            parms.addTable(0, pdg, ParamArrayMode.INPUT, dgmd);
            
    		System.out.println("Calling InpTable.p");
    		dynAO.runProc("InpTable.p", parms);
    		System.out.println("Finished InpTable.p");
    	}
    	catch (Exception e)
    	{
    		System.out.println("doSomeTempTableWork " + e.getMessage());
    		e.printStackTrace();
    	}
    	finally
    	{
    	}   	
    }
}