Spring Integration - Stored Procedure Example - PostgreSQL
================================================================================

# Overview

This example provides a simple example using the *Stored Procedure Outbound Gateway*
adapter. This example will call 1 PostgreSQL **Stored Function** and 1 **Stored Procedure**.

The second procedure returns a **ResultSet**.

# Setup

## PostgreSQL

Please ensure that you can connect to a running instance of a *PostgreSQL server*. The sample was tested using **PostgreSQL v9.2.1**. 

### Required Table

```SQL
CREATE TABLE "COFFEE_BEVERAGES"
(
  "ID" integer NOT NULL,
  "COFFEE_NAME" text,
  "COFFEE_DESCRIPTION" text,
  CONSTRAINT "COFFEE_BEVERAGES_pkey" PRIMARY KEY ("ID")
)
```

### Sample Data

```SQL
INSERT INTO "COFFEE_BEVERAGES" ("ID", "COFFEE_NAME", "COFFEE_DESCRIPTION") VALUES (1, 'Espresso',     'Espressos keep developers going in the morning. There are never enough of them.');
INSERT INTO "COFFEE_BEVERAGES" ("ID", "COFFEE_NAME", "COFFEE_DESCRIPTION") VALUES (2, 'Cappuccino',   'For the finer moments. Wrap your espresso in a tasty layer of foam.');
INSERT INTO "COFFEE_BEVERAGES" ("ID", "COFFEE_NAME", "COFFEE_DESCRIPTION") VALUES (3, 'Mocha',        'Mmmmh, chocolate.');
INSERT INTO "COFFEE_BEVERAGES" ("ID", "COFFEE_NAME", "COFFEE_DESCRIPTION") VALUES (4, 'Latte',        'If you are more into milk than into foam.');
```

### Stored Procedures

Please create the following Stored Procedure/Function:

```SQL
CREATE OR REPLACE FUNCTION find_all_coffee_beverages()
  RETURNS refcursor AS
$BODY$
DECLARE
    ref refcursor;
BEGIN
  OPEN ref FOR SELECT "ID", "COFFEE_NAME", "COFFEE_DESCRIPTION" FROM "COFFEE_BEVERAGES";
  RETURN ref;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
```

```SQL
CREATE OR REPLACE FUNCTION find_coffee(coffee_name integer)
  RETURNS character varying AS
$BODY$
declare
    description character varying;
begin
    SELECT into description "COFFEE_DESCRIPTION" from "COFFEE_BEVERAGES" where "ID"=coffee_name;
    return description;
end
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
```
### Configure the DataSource

Please configure the necessary credentials in order to connect to your database in **/src/main/resources/META-INF/spring/integration/spring-integration-context.xml**. The default setting expects a database **integration** to run on localhost with a usersname of **postgres** and a password of **postgres**.

# Run the Sample

* running the "Main" class from within STS (Right-click on Main class --> Run As --> Java Application)
* or from the command line:
    
    $ gradlew :stored-procedures-postgresql:run

* Follow the screen (command line) instructions.

--------------------------------------------------------------------------------

For help please take a look at the Spring Integration documentation:

https://www.springsource.org/spring-integration

