Как протестировать сконвертированный код SQL
В этой статье описываются опции тестирования Конвертум Мастер Классик, их использование и получаемые результаты.
Поддерживаются следующие базы данных: Sybase Adaptive Server Enterprise, Oracle и Microsoft SQL Server.
Опция TEST
Существует два способа указания опции TEST при запуске Конвертум Мастер Классик:
- /TEST - при запуске из командной строки;
- TEST=Yes - в секции [COMMON] файла sqlways.ini или sqlways_wzd.ini.
Опция TEST используется для генерации операторов вызова процедур или функций, преобразованных либо из скриптов, либо из базы данных. Если эта опция установлена, преобразование не выполняется, генерируются только операторы вызова. Пожалуйста, обратитесь к следующему примеру:
Предположим, что у вас есть исходная процедура Sybase ASE. Если опция TEST не указана, преобразование в Oracle будет выглядеть следующим образом:
Table1
| Sybase ASE | Oracle |
|---|---|
| create procedure sp_proc as declare @x int select @x= 2 GO |
create or replace procedure sp_proc as v_x NUMBER(10,0); BEGIN v_x := 2; END; |
Когда опция TEST включена, вместо преобразованного синтаксиса генерируется следующий оператор вызова:
Table2
| Sybase ASE | Oracle |
|---|---|
| create procedure sp_proc as declare @x int select @x= count (distinct col1) from Tab1 return @x GO |
CALL sp_proc(); |
Опция MAX_NUMBER_OF_TEST_CALLS
Эта опция дополнительно указывается в разделе [COMMON] sqlways.ini или sqlways_wzd.ini.
Опция MAX_NUMBER_OF_TEST_CALLS используется для указания количества операторов вызова процедур или функций, преобразуемых как из скриптов, так и из базы данных. Пожалуйста, обратитесь к следующему примеру:
Table3
| Sybase ASE | Oracle |
|---|---|
| create procedure sp_params_select @par1 int, @par2 date, @par3 varchar(20) as DECLARE @var1 int DECLARE @var2 date DECLARE @var3 varchar(20) begin set @var2 = (SELECT tb.col2 from tab_sp_params_select tb, tab_sp_params_select1 tb1 where tb.col1 = @par1 and tb.col2=tb1.col2) set @var3 = (SELECT tb.col3 from tab_sp_params_select tb, tab_sp_params_select1 tb1 where tb.col2 = @par2 and tb.col2=tb1.col2) set @var1 = (SELECT tb.col1 from tab_sp_params_select tb, tab_sp_params_select1 tb1 where tb.col3 = @par3 and tb.col2=tb1.col2) end |
CALL sp_params_select(1,null,'1'); CALL sp_params_select(1,null,'1'); CALL sp_params_select(2,null,'1'); CALL sp_params_select(3,null,'1'); CALL sp_params_select(4,null,'1'); CALL sp_params_select(5,null,'1'); CALL sp_params_select(6,null,'1'); CALL sp_params_select(7,null,'1'); CALL sp_params_select(8,null,'1'); CALL sp_params_select(9,null,'1'); CALL sp_params_select(10,null,'1'); CALL sp_params_select(1,TO_DATE('2010-11-01','YYYY-MM-DD'),'1'); CALL sp_params_select(1,null,'1'); CALL sp_params_select(1,null,'2'); CALL sp_params_select(1,null,'3'); CALL sp_params_select(1,null,'4'); CALL sp_params_select(1,null,'5'); CALL sp_params_select(1,null,'6'); CALL sp_params_select(1,null,'7'); CALL sp_params_select(1,null,'8'); CALL sp_params_select(1,null,'9'); CALL sp_params_select(1,null,'10'); |
Обратите внимание, что внутри SP есть три оператора SELECT, которые возвращают наборы результатов на основе значений, заданных через параметры при вызове SP. Таким образом, если вместе с SP выбраны таблицы, на которые есть ссылки внутри SP, то генерируется набор операторов вызова, основанный на данных, извлеченных из исходной базы данных. Для данных, хранящихся в таблице tab_sp_params_select, используемой в приведенном выше примере, рассмотрим следующую таблицу:
Table4
| tab_sp_params_select data |
|---|
| 1,2010-11-01,1 2,2010-11-01,2 3,2010-11-01,3 4,2010-11-01,4 5,2010-11-01,5 6,2010-11-01,6 7,2010-11-01,7 8,2010-11-01,8 9,2010-11-01,9 10,2010-11-01,10 11,2010-11-01,11 12,2010-11-01,12 13,2010-11-01,13 14,2010-11-01,14 15,2010-11-01,15 16,2010-11-01,16 17,2010-11-01,17 18,2010-11-01,18 19,2010-11-01,19 20,2010-11-01,20 |
Как видите, в каждом операторе select используется только один параметр. Поэтому генерируется три секции операторов вызова, каждая из которых содержит до 10 операторов, так как параметр MAX_NUMBER_OF_TEST_CALLS в данном примере установлен на 10. Берутся только DISTINCT-значения. Поэтому для столбца col2 используется только одно значение даты и генерируется только один вызывающий оператор. Остальные значения добавляются по умолчанию.
Значения DEFAULT для опции TEST
Каждая база данных имеет свой собственный набор типов данных, который может быть указан по-разному в разных СУБД. Поэтому значения по умолчанию для опции TEST указаны в собственном разделе базы данных. Обратитесь к следующей таблице с названиями разделов и опций и их значениями:
Table5
| [Oracle] | [MSSQL] | [Sybase] |
|---|---|---|
| TEST_FPDV_FLOAT=1 TEST_FPDV_NUMBER=1 TEST_FPDV_DATE=SYSDATE TEST_FPDV_TIMESTAMP=SYSTIMESTAMP TEST_FPDV_CHAR='1' TEST_FPDV_VARCHAR2='1' TEST_FPDV_NVARCHAR2='1' TEST_FPDV_NCHAR='1' TEST_FPDV_RAW='1' |
TEST_FPDV_TINYINT=1 TEST_FPDV_SMALLINT=1 TEST_FPDV_INT=1 TEST_FPDV_BIGINT=1 TEST_FPDV_NUMERIC=1 TEST_FPDV_FLOAT=1 TEST_FPDV_REAL=1 TEST_FPDV_SMALLMONEY=1 TEST_FPDV_MONEY=1 TEST_FPDV_SMALLDATETIME=getdate() TEST_FPDV_DATETIME=getdate() TEST_FPDV_CHAR='1' TEST_FPDV_VARCHAR='1' TEST_FPDV_NVARCHAR='1' TEST_FPDV_NCHAR='1' TEST_FPDV_BINARY='1' TEST_FPDV_VARBINARY='1' TEST_FPDV_BIT=1 |
TEST_FPDV_TINYINT=1 TEST_FPDV_SMALLINT=1 TEST_FPDV_INT=1 TEST_FPDV_BIGINT=1 TEST_FPDV_NUMERIC=1 TEST_FPDV_FLOAT=1 TEST_FPDV_REAL=1 TEST_FPDV_SMALLMONEY=1 TEST_FPDV_MONEY=1 TEST_FPDV_SMALLDATETIME=getdate() TEST_FPDV_DATETIME=getdate() TEST_FPDV_CHAR='1' TEST_FPDV_VARCHAR='1' TEST_FPDV_NVARCHAR='1' TEST_FPDV_NCHAR='1' TEST_FPDV_BINARY='1' TEST_FPDV_VARBINARY='1' TEST_FPDV_BIT=1 |
Если вы столкнетесь с какими-либо трудностями или у вас возникнут другие вопросы, пожалуйста, свяжитесь с нашей службой поддержки по адресу support@convertum.ru.