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

时间:2019-04-16 20:10:46

标签: sql postgresql postgresql-9.4

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

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');

ERREUR:殖民地«datedeb»n'existe pas

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;

2 个答案:

答案 0 :(得分: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';   

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

答案 1 :(得分:0)

您无需在函数内部创建视图即可。只需从函数内返回查询结果:

f = open("b.ini", "r")
data = list(f.read())
ftp_data = [data]
#print (ftp_data)
for i in range(ftp_data):
    data_1 = ftp_data[0:6]
    data_2 = ftp_data[7:14]
    print (ftp_data)

您将不得不调整返回列的数据类型(在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 (...)