Reputation: 505
I have a stored procedure written in PL/SQL for executing in Oracle as:
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;
This stored procedure is returning a cursor and when I am doing a lookup from SOAPUI, it is giving me expected results.
My conversion of this stored procedure to Transact-SQL for SQL Server is shown here:
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;
When I execute this stored procedure, it is showing error in 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>
Can anyone convert the PL/SQL SP to Transact/SQL?
I also tried to execute the stored procedure from SQL Server Management Studio giving input params manually but it is showing error
Operand type clash: int is incompatible with cursor
Note - Please ignore different tables PQCUSTSRV, BEIMGR used in two stored procedures.
Upvotes: 1
Views: 2004
Reputation: 505
Thanks M.Ali for your post. Your code is working fine with some changes. Follow this -
ALTER PROCEDURE [dbo].[ZSPLKIMGR]
@businessArea CHAR(10),
@memberNumber CHAR(35)
AS
BEGIN
SET NOCOUNT ON;
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)
END
Upvotes: 0
Reputation: 69524
Also if your data is not Case Sensitive you do not need to use UPPER()
function at all to compare two string, It will have an impact on performance. As SQL Server will have to touch every row in the table to covert it to UPPER Case 1st and then Compare it with your passed variables.
I have kept this function in solution below assuming this is Case Sensitive.
ALTER PROCEDURE [dbo].[ZSPLKIMGR]
@businessArea CHAR(10),
@memberNumber CHAR(35)
AS
BEGIN
SET NOCOUNT ON;
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
AND ( UPPER(W03.UNITCD) = UPPER(@businessArea)
OR @businessArea = '' OR @businessAre IS NULL )
AND ( UPPER(PQ.FOLDERID) = UPPER(@memberNumber)
OR @memberNumber = '' OR @memberNumber IS NULL)
END
Upvotes: 2