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

问题描述:

参考How to execute an Oracle stored procedure via a database link,它在我的情况下不起作用。我不知道我错过了什么。通过来自Oracle的数据库链接运行SQL Server存储过程

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

并且在SQL Server中的存储过程调用dbo.test_proc

create proc dbo.test_proc 
as 
    print 'testing'; 

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

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

exec [email protected]; 
exec "test_proc"@ss; 
exec "dbo"."test_proc"@ss; 
exec "dbo.test_proc"@ss; 
exec "dbo..test_proc"@ss; 

的错误是像

PLS-00201: identifier '[email protected]' must be declared 
ORA-06550: line 1, column 7: 

任何能帮助我吗?我已经尝试了很长时间。谢谢!


图片上传查询sys.procedures检查SQL Server中的存储过程的存在,并试图通过运行数据库链接的存储过程。 Image

+0

尝试将您的TSQL sproc更改为'CREATE PROCEDURE dbo.test_proc AS BEGIN SELECT'testing'END'。 – 2011-04-04 03:10:00

+0

尽管我更改了存储过程,但仍然有同样的错误。 – 2011-04-04 03:19:19

+0

你是如何定义你的链接的 - 你能发布你使用的CREATE DATABASE LINK命令吗?你能否在Oracle数据库的SQL Server数据库的表上发出一个简单的select语句,并让它成功? – DCookie 2011-04-04 03:52:49

谷歌,一段时间后,我终于发现,我使用dg4odbc这是支持调用SQL Server存储过程。

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

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


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

+1

如果无法直接调用存储过程,则可以通过触发器间接调用它。在SQL Server上创建一个表并添加一个调用插入过程的触发器。然后创建一个向该表中插入一行的Oracle过程。 – 2011-04-05 04:44:01

+0

@jonearles:这真是一个好主意!我想我可以使用这个方法来动态调用存储过程!谢谢!!! – 2011-04-06 02:45:58

它实际上可以通过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 := [email protected]('select SCOPE_IDENTITY();'); 
    c := [email protected]; 
    [email protected](c, 'select @@IDENTITY'); 
    LOOP 
    nr := [email protected](c); 
    EXIT WHEN nr = 0; 
    [email protected](c, 1, val); 
    END LOOP; 
    [email protected](c); 
    DBMS_OUTPUT.PUT_LINE('retrieved: ' || val); 
END; 

这是如何处理来自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 := [email protected]; 
    [email protected](l_cursor,v_sql); 

    [email protected] (l_cursor, 1 ,v_res_1); 
    [email protected] (l_cursor, 2 ,v_res_2); 

    WHILE [email protected](l_cursor) > 0 
    LOOP 
    [email protected](l_cursor, 1, v_res_1); 
    [email protected](l_cursor, 2, v_res_2); 

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

    [email protected](l_cursor); 
END; 

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

仍然怀疑这种方法的性能。任何有关这方面的专家在这里将深受赞赏。