通过来自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
谷歌,一段时间后,我终于发现,我使用dg4odbc这是不支持调用SQL Server存储过程。
http://forums.oracle.com/forums/thread.jspa?threadID=1131396&tstart=0
然而,我的电脑是Windows 7的,所以我还在寻找解决方案。谢谢!
更新:jonearles给了我一个棘手的想法,但它的作品。请参阅下面的评论。
如果无法直接调用存储过程,则可以通过触发器间接调用它。在SQL Server上创建一个表并添加一个调用插入过程的触发器。然后创建一个向该表中插入一行的Oracle过程。 – 2011-04-05 04:44:01
@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;
我可以看到它的一个旧的帖子,但其他人可能会偶然发现它。 :)
仍然怀疑这种方法的性能。任何有关这方面的专家在这里将深受赞赏。
尝试将您的TSQL sproc更改为'CREATE PROCEDURE dbo.test_proc AS BEGIN SELECT'testing'END'。 – 2011-04-04 03:10:00
尽管我更改了存储过程,但仍然有同样的错误。 – 2011-04-04 03:19:19
你是如何定义你的链接的 - 你能发布你使用的CREATE DATABASE LINK命令吗?你能否在Oracle数据库的SQL Server数据库的表上发出一个简单的select语句,并让它成功? – DCookie 2011-04-04 03:52:49