2010-05-17 7 views
0

J'essaie d'implémenter une logique métier dans une fonction PL/pgSQL.Comment écrire cette fonction en tant que fonction pL/pgSQl?

J'ai piraté un code pseudo qui explique le type de logique métier que je veux inclure dans la fonction.

Note: Cette fonction retourne une table, donc je peux l'utiliser dans une requête comme:

SELECT A.col1, B.col1 DE (SELECT * de some_table_returning_func (1, 1, 2, 3) A), tbl2 comme B;

Le pseudo-code de la pl/pgSQL est ci-dessous:

CREATE FUNCTION some_table_returning_func(uid int, type_id int, filter_type_id int, filter_id int) RETURNS TABLE AS $$ 

    DECLARE 
    where_clause text := 'tbl1.id = ' + uid; 
    ret TABLE; 

    BEGIN 

    switch (filter_type_id) 
    { 
     case 1: 
    switch (filter_id) 
    { 
     case 1: 
       where_clause += ' AND tbl1.item_id = tbl2.id AND tbl2.type_id = filter_id'; 
       break; 

      //other cases follow ... 
    } 
    break; 

     //other cases follow ... 
    } 

    // where clause has been built, now run query based on the type 
    ret = SELECT [COL1, ... COLN] WHERE where_clause; 

    IF (type_id <> 1) THEN 
     return ret; 
    ELSE 
     return select * from another_table_returning_func(ret,123); 
    ENDIF; 

END; 
$$ LANGUAGE plpgsql; 

J'ai les questions suivantes:

  1. Comment puis-je écrire la fonction correctement (éxécute la requête avec la clause WHERE générée, et pour retourner une table

  2. Comment puis-je écrire une fonction PL/pgSQL qui accepte une table et un entier et retourne une table (another_table_re turning_func)?

Répondre

1

1.) Vous pouvez renvoyer un résultat semblable à table avec la clause SETOF: RETURNS tablename SETOF

Questions connexes