【发布时间】:2014-11-01 08:30:55
【问题描述】:
我有一个用 PL/SQL 编写的存储过程,用于在 Oracle 中执行:
CREATE OR REPLACE PROCEDURE "ZSPLKIMGR"
(
businessArea IN TYPES.CHAR10,
memberNumber IN TYPES.CHAR35,
P_CURSOR IN OUT TYPES.GENCURSOR )
IS
BEGIN
OPEN P_CURSOR FOR
SELECT W03.* , BE.* FROM BEIMGR BE
LEFT JOIN W03U999S W03 ON (BE.CRDATTIM = W03.CRDATTIM AND BE.RECORDCD = W03.RECORDCD AND BE.CRNODE = W03.CRNODE)
WHERE ( UPPER(W03.UNITCD) = UPPER(businessArea) OR UPPER(businessArea) = '' OR UPPER(businessArea) IS NULL )
AND ( UPPER(BE.MEMN) = UPPER(memberNumber) OR UPPER(memberNumber) = '' OR UPPER(memberNumber) IS NULL);
END;
这个存储过程正在返回一个游标,当我从 SOAPUI 进行查找时,它给了我预期的结果。
我将此存储过程转换为 Transact-SQL for SQL Server 如下所示:
ALTER PROCEDURE [dbo].[ZSPLKIMGR]
@businessArea CHAR(10),
@memberNumber CHAR(35),
@P_CURSOR CURSOR VARYING OUTPUT
AS
SET NOCOUNT ON;
SET @P_CURSOR = CURSOR FORWARD_ONLY STATIC FOR
SELECT W03.* , PQ.*
FROM PQCUSTSRV PQ
LEFT JOIN W03U999S W03 ON (PQ.CRDATTIM = W03.CRDATTIM AND PQ.RECORDCD = W03.RECORDCD AND PQ.CRNODE = W03.CRNODE)
WHERE (UPPER(W03.UNITCD) = UPPER(@businessArea)
OR UPPER(@businessArea) = ''
OR UPPER(@businessArea) IS NULL)
AND (UPPER(PQ.FOLDERID) = UPPER(@memberNumber)
OR UPPER(@memberNumber) = ''
OR UPPER(@memberNumber) IS NULL);
OPEN @P_CURSOR;
当我执行这个存储过程时,它在 SOAPUI 中显示错误 -
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<soapenv:Fault>
<faultcode>soapenv:Server</faultcode>
<faultstring>Error while processing the Web service request, please contact admin.</faultstring>
<faultactor>XML Server</faultactor>
</soapenv:Fault>
</soapenv:Body>
</soapenv:Envelope>
任何人都可以将 PL/SQL SP 转换为 Transact/SQL 吗?
我还尝试从 SQL Server Management Studio 执行存储过程,手动提供输入参数,但它显示错误
操作数类型冲突:int 与光标不兼容
注意 - 请忽略两个存储过程中使用的不同表 PQCUSTSRV、BEIMGR。
【问题讨论】:
-
查看官方DECLARE CURSOR 声明。您是否有特殊原因需要将光标放在变量中?
-
@Josien 是的,要求就像SP应该以游标的形式返回结果。
-
为什么需要光标?请执行 SOAP 层,以便可以看到是否需要游标。 (SQL Server 和 Oracle 的情况可能完全不同)
标签: sql-server oracle tsql stored-procedures plsql