В результате применения метода проб и ошибок родилось следующее решение:
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+')');