参考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
答案 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;
我可以看到这是一个一年的帖子,但其他人可能偶然发现它。 :)
对这种方法的表现仍有疑问。非常感谢专家对此的任何见解。