Запускать хранимую процедуру SQL Server по ссылке на базу данных из Oracle - PullRequest
3 голосов
/ 04 апреля 2011

Ссылаясь на Как выполнить хранимую процедуру Oracle через ссылку на базу данных , в моем случае она не работает.Я не знаю, что мне не хватает.

У меня есть экземпляр SQL Server и база данных Oracle на одном компьютере.В Oracle создается ссылка на базу данных с именем ss.

. В SQL Server существует хранимая процедура с именем dbo.test_proc

create proc dbo.test_proc
as
    print 'testing';

. Очевидно, что она не имеет параметра инет возвращаемого значения.

Я пытался вызвать хранимую процедуру в Oracle через ссылку на базу данных.Но нет следующей работы.

exec test_proc@ss;
exec "test_proc"@ss;
exec "dbo"."test_proc"@ss;
exec "dbo.test_proc"@ss;
exec "dbo..test_proc"@ss;

Ошибка похожа на

PLS-00201: identifier 'test_proc@SS' must be declared
ORA-06550: line 1, column 7:

Может ли кто-нибудь мне помочь?Я пытался в течение длительного времени.Спасибо!


Изображение загружено для запроса sys.procedures для проверки существования хранимой процедуры в SQL Server и попытки запуска хранимой процедуры по ссылке в базе данных. Изображение

Ответы [ 3 ]

3 голосов
/ 29 января 2013

На самом деле можно вызывать хранимые процедуры или функции через dg4odbc. Я протестировал Database Gateway для MS SQL Server , и он все равно не поддерживал функции таблиц и скалярных функций Sql Server. Оба должны полагаться на DBMS_HS_PASSTHROUGH.EXECUTE_IMMEDIATE для этой функции. Нам нужно было получить идентификатор вставленных строк:

DECLARE
  RESULT NUMBER(8,2);
  val  INTEGER;
  c    INTEGER;
  nr   INTEGER;
BEGIN

  RESULT := DBMS_HS_PASSTHROUGH.EXECUTE_IMMEDIATE@mssqldb('select SCOPE_IDENTITY();');
  c := DBMS_HS_PASSTHROUGH.OPEN_CURSOR@mssqldb; 
  DBMS_HS_PASSTHROUGH.PARSE@mssqldb(c, 'select @@IDENTITY');
  LOOP
    nr := DBMS_HS_PASSTHROUGH.FETCH_ROW@mssqldb(c);
    EXIT WHEN nr = 0;
    DBMS_HS_PASSTHROUGH.GET_VALUE@mssqldb(c, 1, val);
  END LOOP;  
  DBMS_HS_PASSTHROUGH.CLOSE_CURSOR@mssqldb(c); 
  DBMS_OUTPUT.PUT_LINE('retrieved: ' || val);
END;
2 голосов
/ 12 декабря 2014

Вот как вы обрабатываете несколько столбцов набора результатов, полученных из SQLServer SP.

DECLARE
  l_cursor    BINARY_INTEGER;
  v_sql       VARCHAR2(32767);
  v_res_1     NUMBER;         -- change to suite your datatype in SQLServer
  v_res_2     VARCHAR2(100);  -- change to suite your datatype in SQLServer
BEGIN
  v_sql := 'EXEC getRecords @parameter1=''somevalue'', @parameter2=''somevalue'';';

  l_cursor := DBMS_HS_PASSTHROUGH.open_cursor@sqlserver;
  DBMS_HS_PASSTHROUGH.parse@sqlserver(l_cursor,v_sql);

  DBMS_HS_PASSTHROUGH.BIND_VARIABLE@sqlserver (l_cursor,  1 ,v_res_1);
  DBMS_HS_PASSTHROUGH.BIND_VARIABLE@sqlserver (l_cursor,  2 ,v_res_2);

  WHILE DBMS_HS_PASSTHROUGH.fetch_row@sqlserver(l_cursor) > 0
  LOOP
    DBMS_HS_PASSTHROUGH.get_value@sqlserver(l_cursor, 1, v_res_1);
    DBMS_HS_PASSTHROUGH.get_value@sqlserver(l_cursor, 2, v_res_2);

    Dbms_Output.put_line('Result : ' || v_res_1 || ' - ' || v_res_2);
  END LOOP;

  DBMS_HS_PASSTHROUGH.close_cursor@sqlserver(l_cursor);
END;

Я вижу, что это годичный пост, но кто-то еще может наткнуться на него.:)

Все еще есть сомнения относительно эффективности этого подхода.Любое понимание экспертами здесь было бы очень полезно.

2 голосов
/ 05 апреля 2011

После того, как Google некоторое время, я наконец-то обнаружил, что использую dg4odbc , который НЕ поддерживает вызов хранимой процедуры в SQL Server.

http://forums.oracle.com/forums/thread.jspa?threadID=1131396&tstart=0

Однако мой компьютер - Windows 7, поэтому я все еще ищу решение. Спасибо!


Обновление: Jonearles дает мне сложную идею, но это работает. Смотрите комментарии ниже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...