Доступ к временной таблице из DBUnit - PullRequest
1 голос
/ 16 февраля 2012

У меня есть хранимая процедура в Sybase, которая возвращает некоторые данные во временную таблицу (назовем ее #results).Если я создаю эту таблицу из своего собственного кода и вызываю хранимую процедуру и проверяю #results, все в порядке (я использую Python для этой цели).Я могу сгенерировать ожидаемый набор результатов для моего теста.

Однако, когда я пытаюсь создать тестовый случай DBUnit, чтобы код

  1. создавал временную таблицу через SpringJdbcTemplate

  2. вызывает эту процедуру и проверяет возвращенные данные

Я получаю NoSuchTableException от DbUnit при проверке набора результатов.

15:55:52.980 [main] DEBUG c.m.e.e.dbtest.helper.SQLTestHelper - *** expected table: #results
15:55:52.980 [main] DEBUG org.dbunit.dataset.FilteredDataSet - getTable(tableName=#results) - start
15:55:52.980 [main] DEBUG o.d.d.filter.SequenceTableFilter - accept(tableName=#results) - start
15:55:52.980 [main] DEBUG o.dbunit.dataset.OrderedTableNameMap - getTableName(tableName=#results) - start
15:55:52.980 [main] DEBUG o.dbunit.dataset.OrderedTableNameMap - getTableName(tableName=#results) - end - result=#RESULTS
15:55:52.980 [main] DEBUG org.dbunit.database.DatabaseDataSet - getTable(tableName=#results) - start
15:55:52.980 [main] DEBUG org.dbunit.database.DatabaseDataSet - initialize() - start
15:55:52.980 [main] DEBUG org.dbunit.database.DatabaseDataSet - Initializing the data set from the database...
15:55:52.980 [main] DEBUG o.d.d.DatabaseDataSourceConnection - getConnection() - start
15:55:52.980 [main] DEBUG m.b.t.TransactionResourceManager - Fetched TransactionResourceResolver [null]
15:55:52.980 [main] DEBUG msjava.pool.BasicObjectPool - Attempting to retrieve object from pool 'ConnectionPoolOf-dbunitDS'
15:55:52.980 [main] DEBUG msjava.pool.BasicObjectPool - Retrieved object 'TransactionInfoCachingConnection on DBCallSavingConnection on com.sybase.jdbc3.jdbc.SybConnection@170984c' from pool 'ConnectionPoolOf-dbunitDS'
15:55:53.402 [main] DEBUG org.dbunit.database.DatabaseDataSet - 
    database product name=Adaptive Server Enterprise
    database major version=12
    database minor version=5
    jdbc driver name=jConnect (TM) for JDBC (TM)
    jdbc driver version=jConnect (TM) for JDBC(TM)/6.05(Build 26564)/P/EBF16903/JDK14/Sun May 31  1:05:35 2009
    jdbc driver major version=6
    jdbc driver minor version=0

15:55:53.402 [main] DEBUG org.dbunit.database.DatabaseDataSet - metadata resultset=com.sybase.jdbc3.jdbc.SybResultSet@1b595f3
15:55:53.402 [main] DEBUG org.dbunit.database.DatabaseDataSet - getTableMetaData(tableName=#results) - start
15:55:53.402 [main] DEBUG org.dbunit.database.DatabaseDataSet - initialize() - start
15:55:53.402 [main] DEBUG o.dbunit.dataset.OrderedTableNameMap - getTableName(tableName=#results) - start
15:55:53.402 [main] DEBUG o.dbunit.dataset.OrderedTableNameMap - getTableName(tableName=#results) - end - result=#RESULTS
15:55:53.402 [main] ERROR org.dbunit.database.DatabaseDataSet - Table '#results' not found in tableMap=org.dbunit.dataset.OrderedTableNameMap[_tableNames=[], _tableMap={}, _caseSensitiveTableNames=false]

Проверка базы данных параллельно с выполнением тестового кода (в точке останова) Я вижу, что временная таблица действительно создана в tempdb и заполнена данными.

Есть кто-нибудьсделал это успешно (например, использовал временную таблицу Sybase из DbUnit)?Если да, то как?

1 Ответ

1 голос
/ 16 февраля 2012

Если вы создаете временные таблицы, используя «#» в качестве первого символа имени таблицы:

Временные таблицы:

  • Существуют только на время действиясеанс пользователя или для области действия процедуры, которая его создает

  • Не может использоваться совместно для пользовательских подключений

  • Автоматически отброшено в конце сеанса или процедуры (или может быть удалено вручную)

Вы можете создать обычные пользовательские таблицы в базе данных tempdb, указав имя базы данных в командекоторый создает таблицу:

Обычные пользовательские таблицы в базе данных tempdb:

  • Может сохраняться в течение сеансов

  • Может использоваться для операций массового копирования

  • Может использоваться совместно с предоставлением разрешений для них

  • Должен быть явно удаленвладельцем (в противном случае они удаляются при перезапуске Adaptive Server)

...