В результате применения метода проб и ошибок родилось следующее решение:
1. Т.к. атлантис запросы посланные через DSQL обязательно пытается преобразовать по своему образу и подобию, то с помощью asql.exe создаем хранимую процедуру используемую как шлюз для пересылки as is.
Код: Выделить всё
SQL PROCEDURE GATE(S : STRING);
BEGIN
END
Код: Выделить всё
create or replace
PROCEDURE "S$GATE"( S IN VARCHAR2 ) AS
BEGIN
EXECUTE IMMEDIATE S;
COMMIT;
END;
4. Использование в интерфейсе:
Т.к. select в Oracle требует обязательного указания приемника, то данные будем переливать во временную таблицу и уже оттуда вычерпывать.
Код: Выделить всё
Interface.....
cmInit : {
....................
var stmt : LongInt;
stmt := sqlAllocStmt;
//Создаем ВТ
sqlDropTmpTable('MyData');
sqlCreateTmpTable('Table MyData (f : string);', ctmNormal);
//Заполняем ВТ
sqlExecStmt(stmt,'GATE('#39+ 'INSERT INTO ' + UpCase ( UserName ) + '.MyData (FF) SELECT MDATA.FIELD1 FROM EXDATA.MDATA'#39+')');
//Читаем ВТ
sqlExecStmt(stmt,'select F from MyData');
var mField : string;
sqlBindCol(stmt, 1, mField);
While ( sqlFetch(stmt) = tsOk ) Do
{
LogStrToFile('C:\temp.log',mField);
}
...............
Линки и синонимы можно создавать и напрямую из интерфейса если дать юзеру в оракле привилегии на CREATE PUBLIC DATABASE LINK и CREATE PUBLIC SYNONYM. В этом случае нижеидущие запросы пропускаем через S$GATE.
Код: Выделить всё
--create public database link <имя линка> connect to <имя удаленного пользователя> identified by <пароль удаленного пользователя> using '<путь>'; --создаем линк
create public database link REMOTEBASE connect to vasya_pupkin identified by qwerty using 'oraserver:1521/ORABASE';
--create public synonym <локальное имя синонима> for <схема удаленная>.<таблица удаленная>@<имя линка созданного выше>; --создаем синоним
create public synonym SynMyData for EXDATA.MDATA@REMOTEBASE; --создаем синоним
Код: Выделить всё
sqlExecStmt(stmt,'GATE('#39+ 'INSERT INTO ' + UpCase ( UserName ) + '.MyData (FF) SELECT SynMyData.FIELD1 FROM SynMyData'#39+')');