如何在sql中创建带参数的视图

问题描述 投票:0回答:2

我想创建一个带参数的视图,然后像这样在这个视图上做一个选择

CREATE OR REPLACE FUNCTION statistiquess(dateDeb date, dateFin date)
RETURNS void AS
$$
     CREATE OR REPLACE VIEW statistics 
     AS 
      SELECT 
         e.matricule_ens, 
         e.nom_ens, 
         e.prenom_ens, 
         m.code_matiere, 
         m.nom_matiere, 
         f.id_formation, 
         f.nom_formation, 
         SUM ((CAST (c.heure_fin AS TIME))-(CAST (c.heure_deb AS TIME))) AS heure_total_programme, 
         SUM ((CAST (c.heure_dep_ens AS TIME))-(CAST (c.heure_arr_ens AS TIME))) AS heure_total_enseigne 
     FROM 
         enseignant e inner join cours c on e.matricule_ens = c.matricule_ens 
         inner join matiere m on c.code_matiere =  m.code_matiere 
         inner join formation f on f.id_formation = c.id_formation 
     WHERE
       c.jour between dateDeb and dateFin
     GROUP BY 
        e.matricule_ens, m.code_matiere, f.id_formation 
     ORDER BY 
        e.nom_ens;
$$
LANGUAGE SQL;

当我尝试从这样的函数中选择所有时,我有这个错误

select * from statistiquess('2019-03-06', '2019-03-29');

错误:列“datedeb”不存在

LINE 6: ..._formation = c.id_formation where (c.jour between datedeb an...


QUERY:  
     CREATE OR REPLACE VIEW statistics AS select e.matricule_ens, e.nom_ens, e.prenom_ens, m.code_matiere, m.nom_matiere, f.id_formation, f.nom_formation, 
     SUM ((CAST (c.heure_fin AS TIME))-(CAST (c.heure_deb AS TIME))) AS heure_total_programme, 
     SUM ((CAST (c.heure_dep_ens AS TIME))-(CAST (c.heure_arr_ens AS TIME))) AS heure_total_enseigne 
     from enseignant e inner join cours c on e.matricule_ens = c.matricule_ens inner join matiere m on c.code_matiere =  m.code_matiere 
     inner join formation f on f.id_formation = c.id_formation where (c.jour between datedeb and datefin) 
     GROUP BY e.matricule_ens, m.code_matiere, f.id_formation ORDER BY e.nom_ens;
sql postgresql postgresql-9.4
2个回答
0
投票

您无需在函数内创建视图来执行此操作。只需从函数中返回查询结果:

CREATE OR REPLACE FUNCTION statistiquess(dateDeb date, dateFin date)
RETURNS tables (matricule_ens text, nom_ens text, prenom_ens text, 
               code_matiere text, nom_matiere text, id_formation int,
               nom_formation text, heure_total_programme bigint, 
               heure_total_enseigne bigtin) AS
$$
    SELECT 
       e.matricule_ens, 
       e.nom_ens, 
       e.prenom_ens, 
       m.code_matiere, 
       m.nom_matiere, 
       f.id_formation, 
       f.nom_formation, 
       SUM ((CAST (c.heure_fin AS TIME))-(CAST (c.heure_deb AS TIME))) AS heure_total_programme, 
       SUM ((CAST (c.heure_dep_ens AS TIME))-(CAST (c.heure_arr_ens AS TIME))) AS heure_total_enseigne 
    FROM 
       enseignant e inner join cours c on e.matricule_ens = c.matricule_ens 
       inner join matiere m on c.code_matiere =  m.code_matiere 
       inner join formation f on f.id_formation = c.id_formation 
    WHERE
     c.jour between dateDeb and dateFin
    GROUP BY 
      e.matricule_ens, m.code_matiere, f.id_formation 
    ORDER BY 
      e.nom_ens;
$$
LANGUAGE SQL;

您将不得不调整返回列的数据类型(在table (...)部分内) - 我只是猜测它们可能是什么。

然后你可以像“带参数的视图”一样使用它:

select * 
from statistiquess('2019-03-06', '2019-03-29');

1
投票

你上面的语法有function不像标题所说的那样。只有函数和存储过程才能获取参数。函数返回值和存储过程没有。 syntax for a function

CREATE [OR REPLACE] FUNCTION function_name (arguments) 
RETURNS return_datatype AS $variable_name$
   DECLARE
      declaration;
      [...]
   BEGIN
      < function_body >
      [...]
      RETURN { variable_name | value }
   END; LANGUAGE plpgsql;

stored procedure的语法

CREATE [OR REPLACE] PROCEDURE procedure_name(parameter_list)
LANGUAGE language_name
AS $$
    stored_procedure_body;
$$;

视图是一个存储的查询,您可以像任何其他表一样进行查询。

SELECT * FROM statistiquess WHERE c.jour BETWEEN '2019-03-06' AND '2019-03-29';   

在不了解您的数据和用例的情况下,很难说您应该使用哪一个。从你的问题来看,你需要一个视图或存储过程。

© www.soinside.com 2019 - 2024. All rights reserved.