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

时间:2011-04-04 02:57:21

标签: oracle sql-server-2008 dblink

参考How to execute an Oracle stored procedure via a database link,它在我的案例中不起作用。我不知道我错过了什么。

我在同一台计算机上有一个SQL Server实例和Oracle数据库。数据库链接在Oracle中创建,名为ss

SQL Server中有一个名为dbo.test_proc

的存储过程
create proc dbo.test_proc
as
    print 'testing';

显然,它没有参数,也没有返回值。

我试图通过数据库链接调用Oracle中的存储过程。但 none 以下工作。

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中是否存在存储过程并尝试通过数据库链接运行存储过程。 Image

3 个答案:

答案 0 :(得分:3)

实际上可以通过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;

答案 1 :(得分:2)

google一段时间之后,我终于发现我正在使用 dg4odbc 支持在SQL Server中调用存储过程。

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

但是,我的电脑是Windows 7,所以我仍在寻找解决方案。谢谢!


更新:jonearles给了我一个棘手的想法,但它有效。请参阅以下评论。

答案 2 :(得分:2)

这是处理来自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;

我可以看到这是一个一年的帖子,但其他人可能偶然发现它。 :)

对这种方法的表现仍有疑问。非常感谢专家对此的任何见解。