通过Oracle的数据库链接运行SQL Server存储过程

参考如何通过数据库链接执行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中是否存在存储过程并尝试通过数据库链接运行存储过程。 图片     
已邀请:
实际上可以通过dg4odbc调用存储过程或函数。我为MS SQL Server测试了数据库网关,但无论如何它都无法原生支持Sql Server表/标量值函数。两者都需要依赖DBMS_HS_PASSTHROUGH.EXECUTE_IMMEDIATE来实现此功能。我们需要检索插入行的id:
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;
    
google一段时间之后,我终于发现我使用的是dg4odbc,它不支持在SQL Server中调用存储过程。 http://forums.oracle.com/forums/thread.jspa?threadID=1131396&tstart=0 但是,我的电脑是Windows 7,所以我仍在寻找解决方案。谢谢! 更新:jonearles给了我一个棘手的想法,但它的工作原理。请参阅以下评论。     
这是处理来自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;
我可以看到这是一个一年的帖子,但其他人可能偶然发现它。 :) 对这种方法的表现仍有疑问。这里的专家对此有任何见解将是非常感谢。     

要回复问题请先登录注册