From 5512054289e221688c236148b55042fab1daf062 Mon Sep 17 00:00:00 2001 From: trisberg Date: Fri, 29 Jan 2010 07:34:23 +0000 Subject: [PATCH] BATCH-1488: fixed returned results parameter bug; added integration tests with Derby stored proc --- .../database/StoredProcedureItemReader.java | 4 +- ...tDataSourceItemReaderIntegrationTests.java | 28 +++++++---- ...cDataSourceItemReaderIntegrationTests.java | 21 ++++++++ ...rnateCursorItemReaderIntegrationTests.java | 2 +- ...rnatePagingItemReaderIntegrationTests.java | 2 +- .../JdbcCursorItemReaderIntegrationTests.java | 2 +- .../JdbcPagingItemReaderIntegrationTests.java | 2 +- .../JpaPagingItemReaderIntegrationTests.java | 2 +- .../StoredProcedureItemReaderTests.java | 24 ++++++++++ .../datasource/DataSourceInitializer.java | 18 ++++--- .../DerbyDataSourceFactoryBean.java | 41 ++++++++++++++++ .../jdbc/datasource/DerbyShutdownBean.java | 48 +++++++++++++++++++ .../test/jdbc/proc/derby/TestProcedures.java | 26 ++++++++++ .../src/test/resources/log4j.properties | 3 +- ...StoredProcedureItemReaderTests-context.xml | 25 ++++++++++ .../item/database/drop-foo-schema-derby.sql | 2 + .../item/database/init-foo-schema-derby.sql | 20 ++++++++ 17 files changed, 249 insertions(+), 21 deletions(-) create mode 100644 spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/AbstractGenericDataSourceItemReaderIntegrationTests.java create mode 100644 spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/StoredProcedureItemReaderTests.java create mode 100644 spring-batch-infrastructure/src/test/java/test/jdbc/datasource/DerbyDataSourceFactoryBean.java create mode 100644 spring-batch-infrastructure/src/test/java/test/jdbc/datasource/DerbyShutdownBean.java create mode 100644 spring-batch-infrastructure/src/test/java/test/jdbc/proc/derby/TestProcedures.java create mode 100644 spring-batch-infrastructure/src/test/resources/org/springframework/batch/item/database/StoredProcedureItemReaderTests-context.xml create mode 100644 spring-batch-infrastructure/src/test/resources/org/springframework/batch/item/database/drop-foo-schema-derby.sql create mode 100644 spring-batch-infrastructure/src/test/resources/org/springframework/batch/item/database/init-foo-schema-derby.sql diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/StoredProcedureItemReader.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/StoredProcedureItemReader.java index 68602fad7..c8eb7844f 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/StoredProcedureItemReader.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/StoredProcedureItemReader.java @@ -195,7 +195,9 @@ public class StoredProcedureItemReader extends AbstractCursorItemReader { callableStatement.registerOutParameter(1, cursorSqlType); } else { - callableStatement.registerOutParameter(refCursorPosition, cursorSqlType); + if (refCursorPosition > 0) { + callableStatement.registerOutParameter(refCursorPosition, cursorSqlType); + } } boolean results = callableStatement.execute(); if (results) { diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/AbstractDataSourceItemReaderIntegrationTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/AbstractDataSourceItemReaderIntegrationTests.java index 03ea3fbcf..e3f0c87ed 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/AbstractDataSourceItemReaderIntegrationTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/AbstractDataSourceItemReaderIntegrationTests.java @@ -8,15 +8,12 @@ import javax.sql.DataSource; import org.junit.Before; import org.junit.Test; -import org.junit.runner.RunWith; import org.springframework.batch.item.ExecutionContext; import org.springframework.batch.item.ItemReader; import org.springframework.batch.item.ItemStream; import org.springframework.batch.item.sample.Foo; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.transaction.AfterTransaction; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; @@ -27,9 +24,8 @@ import org.springframework.util.Assert; * * @author Lucas Ward * @author Robert Kasanicky + * @author Thomas Risberg */ -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(locations = "data-source-context.xml") public abstract class AbstractDataSourceItemReaderIntegrationTests { protected ItemReader reader; @@ -38,6 +34,10 @@ public abstract class AbstractDataSourceItemReaderIntegrationTests { protected DataSource dataSource; + public AbstractDataSourceItemReaderIntegrationTests() { + super(); + } + @Autowired public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; @@ -99,6 +99,8 @@ public abstract class AbstractDataSourceItemReaderIntegrationTests { assertEquals(2, foo2.getValue()); getAsItemStream(reader).update(executionContext); + + getAsItemStream(reader).close(); // create new input source reader = createItemReader(); @@ -124,6 +126,8 @@ public abstract class AbstractDataSourceItemReaderIntegrationTests { assertEquals(2, foo2.getValue()); getAsItemStream(reader).update(executionContext); + + getAsItemStream(reader).close(); // create new input source reader = createItemReader(); @@ -170,6 +174,8 @@ public abstract class AbstractDataSourceItemReaderIntegrationTests { Foo foo3 = reader.read(); Assert.state(!foo2.equals(foo3)); + + getAsItemStream(reader).close(); // create new input source reader = createItemReader(); @@ -196,6 +202,8 @@ public abstract class AbstractDataSourceItemReaderIntegrationTests { Foo foo3 = reader.read(); Assert.state(!foo2.equals(foo3)); + + getAsItemStream(reader).close(); // create new input source reader = createItemReader(); @@ -221,6 +229,8 @@ public abstract class AbstractDataSourceItemReaderIntegrationTests { Foo foo3 = reader.read(); Assert.state(!foo2.equals(foo3)); + + getAsItemStream(reader).close(); // create new input source reader = createItemReader(); @@ -232,6 +242,8 @@ public abstract class AbstractDataSourceItemReaderIntegrationTests { getAsItemStream(reader).update(executionContext); + getAsItemStream(reader).close(); + // create new input source reader = createItemReader(); @@ -243,12 +255,12 @@ public abstract class AbstractDataSourceItemReaderIntegrationTests { assertEquals(5, foo5.getValue()); } - private ItemStream getAsItemStream(ItemReader source) { + protected ItemStream getAsItemStream(ItemReader source) { return (ItemStream) source; } - private InitializingBean getAsInitializingBean(ItemReader source) { + protected InitializingBean getAsInitializingBean(ItemReader source) { return (InitializingBean) source; } -} +} \ No newline at end of file diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/AbstractGenericDataSourceItemReaderIntegrationTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/AbstractGenericDataSourceItemReaderIntegrationTests.java new file mode 100644 index 000000000..0be966f3f --- /dev/null +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/AbstractGenericDataSourceItemReaderIntegrationTests.java @@ -0,0 +1,21 @@ +package org.springframework.batch.item.database; + + + +import org.junit.runner.RunWith; +import org.springframework.batch.item.ItemReader; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +/** + * Generic configuration for testing {@link ItemReader} implementations which read + * data from database. Uses a common test context and HSQLDB database. + * + * @author Thomas Risberg + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(locations = "data-source-context.xml") +public abstract class AbstractGenericDataSourceItemReaderIntegrationTests + extends AbstractDataSourceItemReaderIntegrationTests { + +} diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/AbstractHibernateCursorItemReaderIntegrationTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/AbstractHibernateCursorItemReaderIntegrationTests.java index b96f2151a..ca3718340 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/AbstractHibernateCursorItemReaderIntegrationTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/AbstractHibernateCursorItemReaderIntegrationTests.java @@ -15,7 +15,7 @@ import org.springframework.orm.hibernate3.LocalSessionFactoryBean; * @author Dave Syer */ public abstract class AbstractHibernateCursorItemReaderIntegrationTests extends - AbstractDataSourceItemReaderIntegrationTests { + AbstractGenericDataSourceItemReaderIntegrationTests { protected ItemReader createItemReader() throws Exception { diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/HibernatePagingItemReaderIntegrationTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/HibernatePagingItemReaderIntegrationTests.java index 19f000985..69bcb2d94 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/HibernatePagingItemReaderIntegrationTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/HibernatePagingItemReaderIntegrationTests.java @@ -15,7 +15,7 @@ import org.springframework.orm.hibernate3.LocalSessionFactoryBean; * @author Dave Syer */ public class HibernatePagingItemReaderIntegrationTests extends - AbstractDataSourceItemReaderIntegrationTests { + AbstractGenericDataSourceItemReaderIntegrationTests { protected ItemReader createItemReader() throws Exception { diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/JdbcCursorItemReaderIntegrationTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/JdbcCursorItemReaderIntegrationTests.java index 910e3661d..f2d4df3e4 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/JdbcCursorItemReaderIntegrationTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/JdbcCursorItemReaderIntegrationTests.java @@ -11,7 +11,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; * @author Robert Kasanicky */ @RunWith(SpringJUnit4ClassRunner.class) -public class JdbcCursorItemReaderIntegrationTests extends AbstractDataSourceItemReaderIntegrationTests { +public class JdbcCursorItemReaderIntegrationTests extends AbstractGenericDataSourceItemReaderIntegrationTests { protected ItemReader createItemReader() throws Exception { JdbcCursorItemReader result = new JdbcCursorItemReader(); diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/JdbcPagingItemReaderIntegrationTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/JdbcPagingItemReaderIntegrationTests.java index 9bf73b299..25833264c 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/JdbcPagingItemReaderIntegrationTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/JdbcPagingItemReaderIntegrationTests.java @@ -13,7 +13,7 @@ import org.springframework.jdbc.core.simple.ParameterizedRowMapper; * * @author Thomas Risberg */ -public class JdbcPagingItemReaderIntegrationTests extends AbstractDataSourceItemReaderIntegrationTests { +public class JdbcPagingItemReaderIntegrationTests extends AbstractGenericDataSourceItemReaderIntegrationTests { protected ItemReader createItemReader() throws Exception { diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/JpaPagingItemReaderIntegrationTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/JpaPagingItemReaderIntegrationTests.java index 4d210ec4d..2a3ba3139 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/JpaPagingItemReaderIntegrationTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/JpaPagingItemReaderIntegrationTests.java @@ -14,7 +14,7 @@ import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; * * @author Thomas Risberg */ -public class JpaPagingItemReaderIntegrationTests extends AbstractDataSourceItemReaderIntegrationTests { +public class JpaPagingItemReaderIntegrationTests extends AbstractGenericDataSourceItemReaderIntegrationTests { protected ItemReader createItemReader() throws Exception { LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean(); diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/StoredProcedureItemReaderTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/StoredProcedureItemReaderTests.java new file mode 100644 index 000000000..7626262d5 --- /dev/null +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/StoredProcedureItemReaderTests.java @@ -0,0 +1,24 @@ +package org.springframework.batch.item.database; + +import org.junit.runner.RunWith; +import org.springframework.batch.item.ItemReader; +import org.springframework.batch.item.sample.Foo; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(locations = "StoredProcedureItemReaderTests-context.xml") +public class StoredProcedureItemReaderTests + extends AbstractDataSourceItemReaderIntegrationTests { + + @Override + protected ItemReader createItemReader() throws Exception { + StoredProcedureItemReader reader = new StoredProcedureItemReader(); + reader.setDataSource(dataSource); + reader.setProcedureName("read_foos"); + reader.setRowMapper(new FooRowMapper()); + reader.setVerifyCursorPosition(false); + return reader; + } + +} diff --git a/spring-batch-infrastructure/src/test/java/test/jdbc/datasource/DataSourceInitializer.java b/spring-batch-infrastructure/src/test/java/test/jdbc/datasource/DataSourceInitializer.java index ccfdef88f..0f34deaaa 100644 --- a/spring-batch-infrastructure/src/test/java/test/jdbc/datasource/DataSourceInitializer.java +++ b/spring-batch-infrastructure/src/test/java/test/jdbc/datasource/DataSourceInitializer.java @@ -64,7 +64,7 @@ public class DataSourceInitializer implements InitializingBean, DisposableBean { private boolean ignoreFailedDrop = true; - private static boolean initialized = false; + private boolean initialized = false; /** * Main method as convenient entry point. @@ -81,21 +81,26 @@ public class DataSourceInitializer implements InitializingBean, DisposableBean { * @see java.lang.Object#finalize() */ protected void finalize() throws Throwable { + logger.debug("finalize called for " + dataSource); super.finalize(); initialized = false; - logger.debug("finalize called"); } public void destroy() { + logger.info("destroy called for " + dataSource); + doDestroy(); + } + + public void doDestroy() { if (destroyScripts==null) return; for (int i = 0; i < destroyScripts.length; i++) { - Resource destroyScript = initScripts[i]; + Resource destroyScript = destroyScripts[i]; try { doExecuteScript(destroyScript); } catch (Exception e) { if (logger.isDebugEnabled()) { - logger.warn("Could not execute destroy script [" + destroyScript + "]", e); + logger.debug("Could not execute destroy script [" + destroyScript + "]", e); } else { logger.warn("Could not execute destroy script [" + destroyScript + "]"); @@ -111,7 +116,7 @@ public class DataSourceInitializer implements InitializingBean, DisposableBean { private void initialize() { if (!initialized) { - destroy(); + doDestroy(); if (initScripts != null) { for (int i = 0; i < initScripts.length; i++) { Resource initScript = initScripts[i]; @@ -125,12 +130,13 @@ public class DataSourceInitializer implements InitializingBean, DisposableBean { private void doExecuteScript(final Resource scriptResource) { if (scriptResource == null || !scriptResource.exists()) return; + final JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); + TransactionTemplate transactionTemplate = new TransactionTemplate(new DataSourceTransactionManager(dataSource)); transactionTemplate.execute(new TransactionCallback() { @SuppressWarnings("unchecked") public Object doInTransaction(TransactionStatus status) { - JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); String[] scripts; try { scripts = StringUtils.delimitedListToStringArray(stripComments(IOUtils.readLines(scriptResource diff --git a/spring-batch-infrastructure/src/test/java/test/jdbc/datasource/DerbyDataSourceFactoryBean.java b/spring-batch-infrastructure/src/test/java/test/jdbc/datasource/DerbyDataSourceFactoryBean.java new file mode 100644 index 000000000..c9b6e0ab4 --- /dev/null +++ b/spring-batch-infrastructure/src/test/java/test/jdbc/datasource/DerbyDataSourceFactoryBean.java @@ -0,0 +1,41 @@ +package test.jdbc.datasource; + +import java.io.File; + +import javax.sql.DataSource; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.derby.jdbc.EmbeddedDataSource; +import org.springframework.beans.factory.config.AbstractFactoryBean; + +public class DerbyDataSourceFactoryBean extends AbstractFactoryBean { + + private static Log logger = LogFactory.getLog(DerbyDataSourceFactoryBean.class); + + private String dataDirectory = "derby-home"; + + public void setDataDirectory(String dataDirectory) { + this.dataDirectory = dataDirectory; + } + + protected Object createInstance() throws Exception { + File directory = new File(dataDirectory); + System.setProperty("derby.system.home", directory.getCanonicalPath()); + System.setProperty("derby.storage.fileSyncTransactionLog", "true"); + System.setProperty("derby.storage.pageCacheSize", "100"); + + final EmbeddedDataSource ds = new EmbeddedDataSource(); + ds.setDatabaseName("derbydb"); + ds.setCreateDatabase("create"); + + logger.info("Created instance of " + ds.toString()); + + return ds; + } + + public Class getObjectType() { + return DataSource.class; + } + +} diff --git a/spring-batch-infrastructure/src/test/java/test/jdbc/datasource/DerbyShutdownBean.java b/spring-batch-infrastructure/src/test/java/test/jdbc/datasource/DerbyShutdownBean.java new file mode 100644 index 000000000..d9087251d --- /dev/null +++ b/spring-batch-infrastructure/src/test/java/test/jdbc/datasource/DerbyShutdownBean.java @@ -0,0 +1,48 @@ +package test.jdbc.datasource; + +import java.sql.SQLException; + +import javax.sql.DataSource; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.derby.jdbc.EmbeddedDataSource; +import org.springframework.beans.factory.DisposableBean; + +public class DerbyShutdownBean implements DisposableBean { + + private static Log logger = LogFactory.getLog(DerbyShutdownBean.class); + + private DataSource dataSource; + + private boolean isShutdown = false; + + + public void setDataSource(DataSource dataSource) { + this.dataSource = dataSource; + } + + + @Override + public void destroy() throws Exception { + logger.info("Attempting Derby database shut down on: " + dataSource); + if (!isShutdown && dataSource != null + && dataSource instanceof EmbeddedDataSource) { + EmbeddedDataSource ds = (EmbeddedDataSource) dataSource; + try { + ds.setShutdownDatabase("shutdown"); + ds.getConnection(); + } catch (SQLException except) { + if (except.getSQLState().equals("08006")) { + // SQLState derby throws when shutting down the database + logger.info("Derby database is now shut down."); + isShutdown = true; + } else { + logger.error("Problem shutting down Derby " + + except.getMessage()); + } + } + } + } + +} diff --git a/spring-batch-infrastructure/src/test/java/test/jdbc/proc/derby/TestProcedures.java b/spring-batch-infrastructure/src/test/java/test/jdbc/proc/derby/TestProcedures.java new file mode 100644 index 000000000..321d46549 --- /dev/null +++ b/spring-batch-infrastructure/src/test/java/test/jdbc/proc/derby/TestProcedures.java @@ -0,0 +1,26 @@ +package test.jdbc.proc.derby; + +import java.sql.*; + +/** + * @author trisberg + * + * CALL SQLJ.install_jar('testproc.jar', 'APP.TESTPROC', 0); + * CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.database.classpath', 'APP.TESTPROC'); + * + * CALL SQLJ.replace_jar('testproc.jar', 'APP.TESTPROC'); + * + * CALL SQLJ.remove_jar('APP.TESTPROC', 0) + * + */ + +public class TestProcedures { + + public static void readFoos(ResultSet[] rs) throws SQLException { + String SQL = "SELECT id, name, value FROM T_FOOS"; + Connection conn = DriverManager.getConnection("jdbc:default:connection"); + PreparedStatement ps1 = conn.prepareStatement(SQL); + rs[0] = ps1.executeQuery(); + } + +} diff --git a/spring-batch-infrastructure/src/test/resources/log4j.properties b/spring-batch-infrastructure/src/test/resources/log4j.properties index 3f796307f..0938baecc 100644 --- a/spring-batch-infrastructure/src/test/resources/log4j.properties +++ b/spring-batch-infrastructure/src/test/resources/log4j.properties @@ -5,4 +5,5 @@ log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %p %t [%c] - <%m>%n log4j.category.org.springframework.batch=DEBUG -#log4j.category.org.springframework.transaction=DEBUG +log4j.category.org.springframework.transaction=INFO +log4j.category.org.springframework.jdbc.datasource=INFO diff --git a/spring-batch-infrastructure/src/test/resources/org/springframework/batch/item/database/StoredProcedureItemReaderTests-context.xml b/spring-batch-infrastructure/src/test/resources/org/springframework/batch/item/database/StoredProcedureItemReaderTests-context.xml new file mode 100644 index 000000000..4655f1be2 --- /dev/null +++ b/spring-batch-infrastructure/src/test/resources/org/springframework/batch/item/database/StoredProcedureItemReaderTests-context.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-batch-infrastructure/src/test/resources/org/springframework/batch/item/database/drop-foo-schema-derby.sql b/spring-batch-infrastructure/src/test/resources/org/springframework/batch/item/database/drop-foo-schema-derby.sql new file mode 100644 index 000000000..8b580c805 --- /dev/null +++ b/spring-batch-infrastructure/src/test/resources/org/springframework/batch/item/database/drop-foo-schema-derby.sql @@ -0,0 +1,2 @@ +DROP PROCEDURE read_foos; +DROP TABLE T_FOOS; diff --git a/spring-batch-infrastructure/src/test/resources/org/springframework/batch/item/database/init-foo-schema-derby.sql b/spring-batch-infrastructure/src/test/resources/org/springframework/batch/item/database/init-foo-schema-derby.sql new file mode 100644 index 000000000..3cc5368b4 --- /dev/null +++ b/spring-batch-infrastructure/src/test/resources/org/springframework/batch/item/database/init-foo-schema-derby.sql @@ -0,0 +1,20 @@ +CREATE TABLE T_FOOS ( + ID BIGINT NOT NULL, + NAME VARCHAR(45), + VALUE INTEGER +); + +ALTER TABLE T_FOOS ADD PRIMARY KEY (ID); + +INSERT INTO t_foos (id, name, value) VALUES (1, 'bar1', 1); +INSERT INTO t_foos (id, name, value) VALUES (2, 'bar2', 2); +INSERT INTO t_foos (id, name, value) VALUES (3, 'bar3', 3); +INSERT INTO t_foos (id, name, value) VALUES (4, 'bar4', 4); +INSERT INTO t_foos (id, name, value) VALUES (5, 'bar5', 5); + +CREATE PROCEDURE read_foos () + PARAMETER STYLE JAVA + LANGUAGE JAVA + READS SQL DATA + DYNAMIC RESULT SETS 1 + EXTERNAL NAME 'test.jdbc.proc.derby.TestProcedures.readFoos';