//=============================================================
interface TestDSQL 'Test DSQL';
//---------------------------------------------------------
table struct MyTable
(
wCode: word,
sName: string
)
with index
(
MyTable0 = sName
);
//-------------------------------------------------------------
create view
as select
*
from
MyTable, x$files
;
File sf;
//-------------------------------------------------------------
browse brwMyTable;
show at(,1,,10);
table MyTable;
fields
sName #3'Имя' ('Имя таблицы',,) : [20], protect, noDel;
wCode #3'Код' ('Код таблицы',,) : [10], protect, noDel;
end;
//-------------------------------------------------------------
browse brwFiles;
show at(,11,,20);
table x$files;
fields
xf$name #3'Имя' ('Имя таблицы',,) : [20], protect, noDel;
xf$code #3'Код' ('Код таблицы',,) : [5], protect, noDel;
end;
//-------------------------------------------------------------
handleEvent
cmInit:
{
var stmt : longInt;
var buf : record as table X$INDEXES;
var code : word;
var str : string;
var n : longInt;
MessageLogEnableBatch;
OpenMessageLog('DSQL_test.log', mfLog2Stream+mfBatch);
// Немедленное выполнение запроса (sqlExecDirect)
sqlExecDirect('INSERT INTO appendix(NRec) VALUES(100)');
// Обработка выборки в цикле по одной записи
WriteMessageLog ('----------------------------');
WriteMessageLog ('Обработка выборки в цикле по одной записи');
stmt := sqlAllocStmt;
Message('Код sqlAllocStmt: ' + string(sqlErrorCode(stmt)));
sqlBindCol(stmt, 1, buf.xi$number);
sqlBindCol(stmt, 2, buf.xi$name);
sqlExecStmt(stmt, 'SELECT xi$number,xi$name FROM x$indexes WHERE xi$filecode = 1');
Message('Код sqlExecStmt: ' + string(sqlErrorCode(stmt)));
n := 0;
while sqlFetch(stmt) = tsOk do
{
n := n+1;
Message(string(n) + '. ' + buf.xi$number + ' => ' + buf.xi$name);
}
Message('Код sqlFetch: ' + string(sqlErrorCode(stmt)));
sqlFreeStmt(stmt);
// Использование переключаемого CASE
WriteMessageLog ('----------------------------');
WriteMessageLog ('Использование переключаемого CASE');
stmt := sqlAllocStmt;
var query : string;
var col1 : string;
var col2 : string;
sqlBindCol(stmt, 1, col1);
sqlBindCol(stmt, 2, col2);
query := 'SELECT'
+ ' CASE xf$code'
+ ' WHEN 0 THEN ''словарь'''
+ ' WHEN 1 THEN ''таблицы'''
+ ' WHEN 2 THEN ''поля'''
+ ' WHEN 3 THEN ''индексы'''
+ ' ELSE ''прочие'''
+ ' END,'
+ ' xf$name'
+ ' FROM x$files WHERE xf$code < 7'
sqlExecStmt(stmt, query);
n := 0;
while sqlFetch(stmt) = tsOk do
{
n := n+1;
Message(string(n) + '. ' + col1 + ' => ' + col2);
}
sqlFreeStmt(stmt);
// Использование условного CASE
WriteMessageLog ('----------------------------');
WriteMessageLog ('Использование условного CASE');
stmt := sqlAllocStmt;
sqlBindCol(stmt, 1, col1);
sqlBindCol(stmt, 2, col2);
query := 'SELECT'
+ ' CASE'
+ ' WHEN xf$code = 0 THEN ''словарь'''
+ ' WHEN xf$code <= 3 THEN ''описание таблиц'''
+ ' ELSE ''прочие'''
+ ' END,'
+ ' xf$name'
+ ' FROM x$files WHERE xf$code < 7'
sqlExecStmt(stmt, query);
n := 0;
while sqlFetch(stmt) = tsOk do
{
n := n+1;
Message(string(n) + '. ' + col1 + ' => ' + col2);
}
sqlFreeStmt(stmt);
// Использование параметра в SQL-запросе
WriteMessageLog ('----------------------------');
WriteMessageLog ('Использование параметра в SQL-запросе');
stmt := sqlAllocStmt;
sqlPrepare(stmt, 'SELECT xf$code FROM x$files WHERE xf$name = ?');
sqlBindParam(stmt, 1, str);
sqlBindCol(stmt, 1, code);
//----- получить код таблицы для X$FIELDS
str := 'X$FIELDS';
sqlExecute(stmt);
Message('Код sqlExecute для X$FIELDS: ' + string(sqlErrorCode(stmt)));
while sqlFetch(stmt) = tsOk do
Message('Код файла ' + str + '=' + string(code));
//----- получить код таблицы для X$FILES
str := 'X$FILES';
sqlExecute(stmt);
Message('Код sqlExecute для X$FILES: ' + string(sqlErrorCode(stmt)));
while sqlFetch(stmt) = tsOk do
Message('Код файла ' + str + '=' + string(code));
sqlFreeStmt(stmt);
// Использование функций
WriteMessageLog ('----------------------------');
WriteMessageLog ('Использование функций');
stmt := sqlAllocStmt;
var cnt : word;
var min : word;
var max : word;
var curDt : date;
sqlBindCol(stmt, 1, cnt);
sqlBindCol(stmt, 2, min);
sqlBindCol(stmt, 3, max);
sqlBindCol(stmt, 4, curDt);
sqlExecStmt(stmt, 'SELECT COUNT(*), MIN(xf$code), MAX(xf$code), CURDATE FROM x$files WHERE xf$code < 15');
while sqlFetch(stmt) = tsOk do
Message('На ' + string(curDt) + ' записей: ' + string(cnt) + ', мин.код: ' + string(min) + ', макс.код: ' + string(max));
// Загрузка выборки в заданную таблицу в памяти (MyTable)
WriteMessageLog ('----------------------------');
WriteMessageLog ('Загрузка выборки в таблицу в памяти MyTable');
stmt := sqlAllocStmt;
code := 5;
sqlBindParam(stmt, 1, code);
sqlExecStmt(stmt, 'SELECT xf$code, xf$name FROM x$files WHERE xf$code > ? AND xf$code < 15');
sqlFetchInto(stmt, tnMyTable);
sqlFreeStmt(stmt);
// Загрузка выборки в автоматически создаваемую таблицу в памяти (хендл => mt)
WriteMessageLog ('----------------------------');
WriteMessageLog ('Загрузка выборки в автоматически создаваемую таблицу в памяти');
stmt := sqlAllocStmt;
code := 7;
sqlBindParam(stmt, 1, code);
//----- заодно проверим конкатенацию строк
sqlExecStmt(stmt,
'SELECT xf$code, ''=> ''||xf$name FROM x$files WHERE xf$code > ? AND xf$code < 15');
var mt : longInt;
sqlFetchIntoMT(stmt, mt);
//----- обработка созданной таблицы
var rec : array[1..1] of variant;
if (sqlNavigateMT(mt, ffGetFirst, rec) = tsOk)
do
{
var i : integer;
var s : string;
s := '';
for (i:=1; i<=Count(rec); i:=i+1)
s := s + ' ' + string(rec[i]);
Message(s);
}
while (sqlNavigateMT( mt, ffGetNext, rec ) = tsOk);
sqlFreeStmt(stmt)
sqlFreeMT(mt)
// Обработка memo-полей
WriteMessageLog ('----------------------------');
WriteMessageLog ('Обработка memo-полей');
var f : longInt;
var fname : string;
f := sf.Handle;
fname := CreateTmpFileName;
if (sf.OpenFile(fname, stCreate))
{
sf.WriteLn('This is just the test! Eeeee!!!');
sqlStoreMemo(coAPPENDIX, 100, f);
Message('Код sqlStoreMemo: ' + string(sqlErrorCode(stmt)));
sf.Close;
DeleteFile(fname);
}
if (sf.OpenFile('DSQL_test_memo.txt', stCreate))
{
sqlLoadMemo(coAPPENDIX, 100, f);
Message('Код sqlLoadMemo: ' + string(sqlErrorCode(stmt)));
sf.Close;
}
CloseMessageLog;
MessageLogDisableBatch;
}
end; // handleEvent
end.