You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从SQL Server链接服务器调用带输入参数的Oracle函数实现方法

SQL Server 链接服务器调用 Oracle 包函数说明

通用调用语法(针对调用包XYZ下函数ABC、传入参数K的需求)

已配置好链接服务器的场景下,优先用EXECUTE (...) AT 链接服务器名的方式调用,语法如下:

-- 1. 先定义SQL Server侧的变量
DECLARE @FuncResult 对应Oracle函数返回值的SQL Server类型; -- 用来接收ABC函数的返回值
DECLARE @K 对应参数K的SQL Server类型 = '你的参数K的实际值'; -- 要传入的参数K

-- 2. 调用Oracle侧的包函数
EXECUTE ('
DECLARE
  v_oracle_ret 对应Oracle侧的返回值类型;
BEGIN
  -- 调用XYZ包的ABC函数,? 是外部参数的占位符,按顺序对应后面传的@K
  v_oracle_ret := XYZ.ABC(?);
  -- 把返回值赋值给输出占位符,对应后面的@FuncResult OUTPUT
  ? := v_oracle_ret;
  -- 如果有事务需求可以加COMMIT;
END;', @K, @FuncResult OUTPUT) AT 你的Oracle链接服务器名称;

参数传递规则

  • 传入参数直接按顺序写在EXECUTE的参数列表里,PL/SQL块中用?按顺序匹配即可
  • 如果是字符串类型的参数,PL/SQL块里写死的字符串要加两个单引号转义,不需要转义外部传入的参数值
  • 输出参数要在变量后加OUTPUT标识,和PL/SQL块中用来返回值的?占位符顺序对应

现有存储过程的修正

你提供的代码存在2个语法问题:PL/SQL块中不识别SQL Server的变量名@Adress,要用?占位,且赋值语句末尾缺分号,修正后的完整代码如下:

ALTER PROCEDURE [dbo].[CreateProject] (@ProjectBudgetId INT)
AS
BEGIN
 SET NOCOUNT ON

DECLARE @Value varchar(1000)
DECLARE @Adress varchar(1000) = 'https://dev.local/front/form/39449d5c-705a-487d-a115-db50910fe200/1'


EXECUTE 
('
DECLARE 
v_numer VARCHAR2(200);
v_id NUMBER;
p_link_EOD VARCHAR2(2000);

BEGIN
v_numer := TETA_ADMIN.API_NAX_PROJEKTY_KLN.wyznacz_nr_projektu(''Projekt_test'', SYSDATE);

-- 外部传入的@Adress用?占位,末尾加分号
p_link_EOD := ?;

v_id :=  TETA_ADMIN.API_NAX_PROJEKTY_KLN.dodaj_projekt (
''Projekt_test'',
v_numer,
''Oppo'',
''Numr zewnetrzny, np. POWER/64548763 itd'',
To_Date(''01012021'',''ddmmyyyy''), 
To_Date(''31122021'',''ddmmyyyy''),
''PLN'',
10254000,
NULL,
''Testowy typ projektu'',
''Testowy rodzaj projektu'',
''Opis słowno-muzyczny, czyli co w projekcie będzie robione'',
NULL,
p_link_EOD);

COMMIT;
? := v_id;

END;', @Adress, @Value OUTPUT) AT TETAATH


UPDATE [bud].[ProjectBudget]
SET [BudgetTETAId] = @Value
WHERE Id = @ProjectBudgetId

END

内容的提问来源于stack exchange,提问作者mrub

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 19:09:02