声明块中的 PostgreSQL 存储过程错误
PostgreSQL Stored Procedure error in declare bloc
我正在尝试将 T-SQL 过程转换为 PL/PGSQL,在我的过程中有一个在游标中使用的已声明变量。但是当我执行该过程时出现错误:“未知变量”
在下面找到代码和错误消息
create or replace function public.UP_GetCumulPerformancesParPortefeuille(strMatricule VARCHAR(20), strDevise varchar(3), dateDebut DATE) returns setof record
language plpgsql
as $$
BEGIN
/*DECLARE Performances TABLE(ID_CPA INT
, DT_CRS DATETIME
, PC_PRF FLOAT);*/
DECLARE Performances public.performancestb;
DECLARE NO_PTF INT
; DT_CRS DATE
; PC_PRF FLOAT
; ResultF FLOAT = 0
; PreviousResult FLOAT = 0
; PreviousCPA INT = 0;
/*DECLARE PerfCumul TABLE(NO_PTF INT
, DT_CRS DATE
, MT_PRF FLOAT);*/
DECLARE PerfCumul public.perfcumultb;
--SET NOCOUNT ON;
-- Chargement de l'historique des performances
--
BEGIN
INSERT INTO Performances (ID_CPA, DT_CRS, PC_PRF)
SELECT ID_CPA, DT_CRS, PC_PRF FROM public.UF_GetHistoriquePerformances(strDevise);
end;
--SELECT * FROM @Performances;
DECLARE curseur CURSOR FOR
SELECT NO_PTF, DT_CRS, SUM(PC_PRF * MT_DEM)
FROM (
SELECT D.NO_PTF, P.DT_CRS, P.PC_PRF
, D.MT_DEM/100 as MT_DEM
FROM public.TB_Demande D
INNER JOIN
Performances P ON D.ID_CPA = P.ID_CPA
AND D.MC_UTL = strMatricule
) Q
WHERE DT_CRS >= dateDebut
GROUP BY NO_PTF, DT_CRS
ORDER BY NO_PTF, DT_CRS;
begin
OPEN curseur;
FETCH NEXT FROM curseur
INTO NO_PTF, DT_CRS, PC_PRF;
declare
是一个 块 不是每行的前缀。你只需要写一次,它必须在 before 第一个 begin
您的游标声明与实际代码块混合在一起。
所以像这样:
DECLARE
Performances public.performancestb;
NO_PTF INT;
DT_CRS DATE;
PC_PRF FLOAT;
ResultF FLOAT = 0;
PreviousResult FLOAT = 0;
PreviousCPA INT = 0;
PerfCumul public.perfcumultb;
curseur CURSOR FOR
SELECT NO_PTF, DT_CRS, SUM(PC_PRF * MT_DEM)
FROM (
SELECT D.NO_PTF, P.DT_CRS, P.PC_PRF
, D.MT_DEM/100 as MT_DEM
FROM public.TB_Demande D
INNER JOIN
Performances P ON D.ID_CPA = P.ID_CPA
AND D.MC_UTL = strMatricule
) Q
WHERE DT_CRS >= dateDebut
GROUP BY NO_PTF, DT_CRS
ORDER BY NO_PTF, DT_CRS;
BEGIN
INSERT INTO Performances (ID_CPA, DT_CRS, PC_PRF)
SELECT ID_CPA, DT_CRS, PC_PRF
FROM public.UF_GetHistoriquePerformances(strDevise);
OPEN curseur;
FETCH NEXT FROM curseur
INTO NO_PTF, DT_CRS, PC_PRF;
close curseur;
END;
我正在尝试将 T-SQL 过程转换为 PL/PGSQL,在我的过程中有一个在游标中使用的已声明变量。但是当我执行该过程时出现错误:“未知变量” 在下面找到代码和错误消息
create or replace function public.UP_GetCumulPerformancesParPortefeuille(strMatricule VARCHAR(20), strDevise varchar(3), dateDebut DATE) returns setof record
language plpgsql
as $$
BEGIN
/*DECLARE Performances TABLE(ID_CPA INT
, DT_CRS DATETIME
, PC_PRF FLOAT);*/
DECLARE Performances public.performancestb;
DECLARE NO_PTF INT
; DT_CRS DATE
; PC_PRF FLOAT
; ResultF FLOAT = 0
; PreviousResult FLOAT = 0
; PreviousCPA INT = 0;
/*DECLARE PerfCumul TABLE(NO_PTF INT
, DT_CRS DATE
, MT_PRF FLOAT);*/
DECLARE PerfCumul public.perfcumultb;
--SET NOCOUNT ON;
-- Chargement de l'historique des performances
--
BEGIN
INSERT INTO Performances (ID_CPA, DT_CRS, PC_PRF)
SELECT ID_CPA, DT_CRS, PC_PRF FROM public.UF_GetHistoriquePerformances(strDevise);
end;
--SELECT * FROM @Performances;
DECLARE curseur CURSOR FOR
SELECT NO_PTF, DT_CRS, SUM(PC_PRF * MT_DEM)
FROM (
SELECT D.NO_PTF, P.DT_CRS, P.PC_PRF
, D.MT_DEM/100 as MT_DEM
FROM public.TB_Demande D
INNER JOIN
Performances P ON D.ID_CPA = P.ID_CPA
AND D.MC_UTL = strMatricule
) Q
WHERE DT_CRS >= dateDebut
GROUP BY NO_PTF, DT_CRS
ORDER BY NO_PTF, DT_CRS;
begin
OPEN curseur;
FETCH NEXT FROM curseur
INTO NO_PTF, DT_CRS, PC_PRF;
declare
是一个 块 不是每行的前缀。你只需要写一次,它必须在 before 第一个 begin
您的游标声明与实际代码块混合在一起。
所以像这样:
DECLARE
Performances public.performancestb;
NO_PTF INT;
DT_CRS DATE;
PC_PRF FLOAT;
ResultF FLOAT = 0;
PreviousResult FLOAT = 0;
PreviousCPA INT = 0;
PerfCumul public.perfcumultb;
curseur CURSOR FOR
SELECT NO_PTF, DT_CRS, SUM(PC_PRF * MT_DEM)
FROM (
SELECT D.NO_PTF, P.DT_CRS, P.PC_PRF
, D.MT_DEM/100 as MT_DEM
FROM public.TB_Demande D
INNER JOIN
Performances P ON D.ID_CPA = P.ID_CPA
AND D.MC_UTL = strMatricule
) Q
WHERE DT_CRS >= dateDebut
GROUP BY NO_PTF, DT_CRS
ORDER BY NO_PTF, DT_CRS;
BEGIN
INSERT INTO Performances (ID_CPA, DT_CRS, PC_PRF)
SELECT ID_CPA, DT_CRS, PC_PRF
FROM public.UF_GetHistoriquePerformances(strDevise);
OPEN curseur;
FETCH NEXT FROM curseur
INTO NO_PTF, DT_CRS, PC_PRF;
close curseur;
END;