【问题标题】:Call sql server function from oracle and get result value从 oracle 调用 sql server 函数并获取结果值
【发布时间】:2016-11-28 20:27:50
【问题描述】:

通过从 Oracle (11g) 到 MS-SQL Server (2012) 的 ODBC 数据库链接,我们尝试调用返回整数的函数/过程。 SQL-Server 过程名为 spProcTest2,有 2 个参数。此过程返回一个用作错误代码的整数。 代码示例见下文。

问题是如何接收过程返回的值?

注意:下面代码中使用的值“nr”仅返回受影响的行数。

declare
    c        INTEGER;
    nr       INTEGER;
    v_sql    VARCHAR2(1000);
    SOUT     VARCHAR2(100);
BEGIN
    v_sql :='EXEC dbo.spProcTest2 ?, ?;';

    c  := DBMS_HS_PASSTHROUGH.OPEN_CURSOR@gtlab;

    DBMS_HS_PASSTHROUGH.PARSE@gtlab(c, v_sql );

    DBMS_HS_PASSTHROUGH.BIND_VARIABLE@gtlab (c,  1 , 1);
    DBMS_HS_PASSTHROUGH.BIND_VARIABLE@gtlab (c,  2 , 5);

    nr := DBMS_HS_PASSTHROUGH.EXECUTE_NON_QUERY@gtlab(c);

    DBMS_OUTPUT.PUT_LINE('nr=' || nr) ;    

    DBMS_HS_PASSTHROUGH.CLOSE_CURSOR@gtlab(c);

    commit;
END;

【问题讨论】:

    标签: sql-server oracle stored-procedures odbc procedure


    【解决方案1】:
    v_sql :='declare @resxml xml exec dbo.TestProcedure 2, @resxml output select cast(@resxml as varchar(8000)) as vres';
    
    1. 声明@resxml xml
    2. 执行 dbo.TestProcedure 2,@resxml 输出
    3. select cast(@resxml as varchar(8000)) as vres(将 XML 转换为 VARCHAR)

    所有进程

    CREATE OR REPLACE PROCEDURE CALLSQLPROC( v_out out varchar2, v_res out integer) IS c INTEGER; v_sql VARCHAR2(32767); BEGIN v_sql :='declare @resxml xml exec dbo.TestProcedure 2, @resxml output select cast(@resxml as varchar(8000)) as vres'; c := DBMS_HS_PASSTHROUGH.OPEN_CURSOR@NSK_LIFE; DBMS_HS_PASSTHROUGH.PARSE@NSK_LIFE(c, v_sql ); DBMS_HS_PASSTHROUGH.BIND_VARIABLE@NSK_LIFE(c,1, v_out); v_res := DBMS_HS_PASSTHROUGH.FETCH_ROW@NSK_LIFE(c); DBMS_HS_PASSTHROUGH.GET_VALUE@NSK_LIFE(c,1,v_out); DBMS_HS_PASSTHROUGH.CLOSE_CURSOR@NSK_LIFE(c); END;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-28
      • 2012-08-16
      • 1970-01-01
      • 2012-02-07
      • 2018-10-30
      • 2020-06-26
      • 2010-11-19
      • 1970-01-01
      相关资源
      最近更新 更多