[英]PostgreSQL stored procedure with RETURNS TABLE(id integer) returning all NULLs
[英]Stored Procedure Returns NULLS
我是存儲過程的新手,以前沒有在我的項目中使用過它們。 我已經創建了第一個過程,但未返回預期結果。
該過程如下創建-
CREATE PROCEDURE GetRetirementDetails @DOB DATE, @Gender VARCHAR(10)
AS
DECLARE @DateRet DATE,
@AgeRet DECIMAL(18,2)
SELECT @DateRet = [DateRet], @AgeRet = [AgeRet]
FROM [State]
WHERE [From] <= @DOB
AND [To] >= @DOB
AND (Gender = @Gender OR Gender = 'Both')
我正在執行以下語句的過程-
DECLARE @DateRet DATE,
@AgeRet DECIMAL(18,2),
@DOB DATE,
@Gender VARCHAR(10)
SET @DOB = '1975-10-10'
SET @Gender = 'Male'
EXECUTE GetRetirementDetails @DOB, @Gender
SELECT @DateRet, @AgeRet
返回的結果為NULL,NULL
但是,當我運行以下語句(這是手動輸入參數的過程)時,我得到了所需的結果。
SELECT [DateRet], [AgeRet]
FROM [State]
WHERE [From] <= '1975-10-10'
AND [To] >= '1975-10-10'
AND (Gender = 'Male' OR Gender = 'Both')
要求的輸出為NULL,67.00
我確定我的錯誤是基本的,但是我一直在努力查看以前沒有使用過存儲過程的錯誤。 非常感激任何的幫助。
如果要從存儲過程返回值,則需要將它們聲明為parameters。 。 。 然后正確調用:
我是存儲過程的新手,以前沒有在我的項目中使用過它們。 我已經創建了第一個過程,但未返回預期結果。
該過程如下創建-
CREATE PROCEDURE GetRetirementDetails (
@in_DOB DATE,
@in_Gender VARCHAR(10),
@out_DateRet DATE OUTPUT,
@out_AgeRet DECIMAL(18, 2) OUTPUT
) AS
BEGIN
SELECT @out_DateRet = [DateRet], @out_AgeRet = [AgeRet]
FROM [State]
WHERE [From] <= @in_DOB AND [To] >= @in_DOB AND
(Gender = @in_Gender OR Gender = 'Both')
END;
然后將其稱為:
DECLARE @DateRet DATE,
@AgeRet DECIMAL(18,2),
@DOB DATE,
@Gender VARCHAR(10);
SET @DOB = '1975-10-10';
SET @Gender = 'Male';
EXECUTE GetRetirementDetails @DOB, @Gender, @DateRet OUTPUT, @AgeRet OUTPUT;
SELECT @DateRet, @AgeRet;
您需要使用以下輸出參數更改SP:
CREATE PROCEDURE GetRetirementDetails @DOB DATE, @Gender VARCHAR(10)
,@DateRet DATE output,@AgeRet DECIMAL(18,2) output
AS
SELECT @DateRet = [DateRet], @AgeRet = [AgeRet]
FROM [State]
WHERE [From] <= @DOB
AND [To] >= @DOB
AND (Gender = @Gender OR Gender = 'Both')
然后按以下方式調用它:
DECLARE @DateRet DATE,
@AgeRet DECIMAL(18,2),
@DOB DATE,
@Gender VARCHAR(10)
SET @DOB = '1975-10-10'
SET @Gender = 'Male'
EXECUTE GetRetirementDetails @DOB, @Gender,@DateRet,@AgeRet
SELECT @DateRet, @AgeRet
只是想提一下,您可以只在存儲的proc中返回數據,而不必將其作為輸出參數,因為在已設置的參數中不能保存多個值。 在您的示例中,如果數據返回多行,則您將僅獲得最后一個可用記錄。 例如
IF OBJECT_ID('tempdb..#tmpTest') IS NOT NULL DROP TABLE #tmpTest
GO
DECLARE @dteRunDate DATETIME;
SELECT @dteRunDate = GETDATE();
CREATE TABLE #tmpTest
(
[FROM] DATETIME ,
[TO] DATETIME ,
[GENDER] NVARCHAR(10),
[AGERET] INT
)
INSERT INTO #tmpTest
(
[FROM] ,
[TO] ,
[GENDER] ,
[AGERET]
)
SELECT @dteRunDate,@dteRunDate,'M',10 UNION ALL
SELECT @dteRunDate,@dteRunDate,'F',NULL UNION ALL
SELECT @dteRunDate,@dteRunDate,'BOTH',20;
DECLARE @DateRet DATETIME ,
@AgeRet DECIMAL(18,2) ,
@DOB DATETIME ,
@Gender NVARCHAR(10)
SELECT @DOB = @dteRunDate;
SELECT @Gender = 'M';
SELECT @DateRet = [FROM] ,
@AgeRet = [AgeRet]
FROM #tmpTest
WHERE [From] <= @DOB
AND [To] >= @DOB
AND (Gender = @Gender OR Gender = 'Both')
SELECT @DateRet,@AgeRet;
將忽略所有匹配的行並返回最后一個。 相反,我可以使用:
IF OBJECT_ID('tempdb..#tmpTest') IS NOT NULL DROP TABLE #tmpTest
GO
DECLARE @dteRunDate DATETIME;
SELECT @dteRunDate = GETDATE();
CREATE TABLE #tmpTest
(
[FROM] DATETIME ,
[TO] DATETIME ,
[GENDER] NVARCHAR(10),
[AGERET] INT
)
INSERT INTO #tmpTest
(
[FROM] ,
[TO] ,
[GENDER] ,
[AGERET]
)
SELECT @dteRunDate,@dteRunDate,'M',10 UNION ALL
SELECT @dteRunDate,@dteRunDate,'F',NULL UNION ALL
SELECT @dteRunDate,@dteRunDate,'BOTH',20;
DECLARE @DOB DATETIME ,
@Gender NVARCHAR(10)
SELECT @DOB = @dteRunDate;
SELECT @Gender = 'M';
SELECT [FROM] ,
[AgeRet]
FROM #tmpTest
WHERE [From] <= @DOB
AND [To] >= @DOB
AND (Gender = @Gender OR Gender = 'Both')
它將返回所有匹配的行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.