zoukankan      html  css  js  c++  java
  • Aliases for Function Parameters

    Aliases for Function Parameters

    Parameters passed to functions are named with the identifiers $1, $2, etc. Optionally, aliases can be declared for $n parameter names for increased readability. Either the alias or the numeric identifier can then be used to refer to the parameter value.

    There are two ways to create an alias. The preferred way is to give a name to the parameter in the CREATE FUNCTION command, for example:

    CREATE FUNCTION sales_tax(subtotal real) RETURNS real AS $$
    BEGIN
        RETURN subtotal * 0.06;
    END;
    $$ LANGUAGE plpgsql;
    

    The other way, which was the only way available before PostgreSQL 8.0, is to explicitly declare an alias, using the declaration syntax

    name ALIAS FOR $n;
    

    The same example in this style looks like

    CREATE FUNCTION sales_tax(real) RETURNS real AS $$
    DECLARE
        subtotal ALIAS FOR $1;
    BEGIN
        RETURN subtotal * 0.06;
    END;
    $$ LANGUAGE plpgsql;
    

    Some more examples:

    CREATE FUNCTION instr(varchar, integer) RETURNS integer AS $$
    DECLARE
        v_string ALIAS FOR $1;
        index ALIAS FOR $2;
    BEGIN
        -- some computations using v_string and index here
    END;
    $$ LANGUAGE plpgsql;
    
    CREATE FUNCTION concat_selected_fields(in_t sometablename)
     RETURNS text AS $$
    BEGIN
        RETURN in_t.f1 || in_t.f3 || in_t.f5 || in_t.f7;
    END;
    $$ LANGUAGE plpgsql;
    

    When a PL/pgSQL function is declared with output parameters, the output parameters are given $n names and optional aliases in just the same way as the normal input parameters. An output parameter is effectively a variable that starts out NULL; it should be assigned to during the execution of the function. The final value of the parameter is what is returned. For instance, the sales-tax example could also be done this way:

    CREATE FUNCTION sales_tax(subtotal real, OUT tax real) AS $$
    BEGIN
        tax := subtotal * 0.06;
    END;
    $$ LANGUAGE plpgsql;
    

    Notice that we omitted RETURNS real---we could have included it, but it would be redundant.

    Output parameters are most useful when returning multiple values. A trivial example is:

    CREATE FUNCTION sum_n_product(x int, y int, OUT sum int, OUT
     prod int) AS $$
    BEGIN
        sum := x + y;
        prod := x * y;
    END;
    $$ LANGUAGE plpgsql;
    

    As discussed in section 5.4.3 Functions with Output Parameters, this effectively creates an anonymous record type for the function's results. If a RETURNS clause is given, it must say RETURNS record.

    When the return type of a PL/pgSQL function is declared as a polymorphic type (anyelement or anyarray), a special parameter $0 is created. Its data type is the actual return type of the function, as deduced from the actual input types (see section 5.2.5 Polymorphic Types). This allows the function to access its actual return type as shown in section 9.4.2 Copying Types. $0 is initialized to null and can be modified by the function, so it can be used to hold the return value if desired, though that is not required. $0 can also be given an alias. For example, this function works on any data type that has a + operator:

    CREATE FUNCTION add_three_values(v1 anyelement, v2
     anyelement, v3 anyelement)
    RETURNS anyelement AS $$
    DECLARE
        result ALIAS FOR $0;
    BEGIN
        result := v1 + v2 + v3;
        RETURN result;
    END;
    $$ LANGUAGE plpgsql;
    

    The same effect can be had by declaring one or more output parameters as anyelement or anyarray. In this case the special $0 parameter is not used; the output parameters themselves serve the same purpose. For example:

    CREATE FUNCTION add_three_values(v1 anyelement, v2
     anyelement, v3 anyelement,
                                     OUT sum anyelement)
    AS $$
    BEGIN
        sum := v1 + v2 + v3;
    END;
    $$ LANGUAGE plpgsql;
    
  • 相关阅读:
    HDU 4632 CF 245H 区间DP(回文)
    Cloud Foundry中 JasperReports service集成
    Graphs and Minimum Cuts(Karger's Min-Cut Algorithm)
    【大盛】HTC one/M7 ROM 最新本地化OrDroid8.2.6 高级、快速设置 永久root 更多自定义 稳定 流畅
    Android开发工具GenyMotion安装和使用方法
    CF 121E Lucky Array 【树状数组】
    [每日一题] OCP1z0-047 :2013-08-02 权限―――分配系统权限
    iOS 应用程序本地化
    Storm系列(十五)架构分析之Executor-Spout
    Ganglia系列(一)安装
  • 原文地址:https://www.cnblogs.com/luoyaoquan/p/2058861.html
Copyright © 2011-2022 走看看