3

参考如何通过数据库链接执行 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 中存储过程的存在,并尝试通过数据库链接运行存储过程。 图片

4

3 回答 3

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;
于 2013-01-29T14:04:25.673 回答
2

google了一会儿,我终于发现我使用的是dg4odbc,它支持在SQL Server中调用存储过程。

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

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


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

于 2011-04-04T23:50:31.570 回答
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;

我可以看到它已经有一年的历史了,但其他人可能会偶然发现它。:)

仍然对这种方法的性能表示怀疑。这里的专家对此的任何见解将不胜感激。

于 2014-12-12T04:30:14.560 回答