首页 > 解决方案 > 声明块中的 PostgreSQL 存储过程错误

问题描述

我正在尝试将 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; 

在此处输入图像描述

标签: postgresqlstored-proceduresplpgsql

解决方案


declare是一个而不是每一行的前缀。你只需要写一次,它必须第一个之前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;

推荐阅读