zoukankan      html  css  js  c++  java
  • postgres 输出数据集的自定义函数

    定义一个可输出数据集自定义函数有多种方法

    1,先定义结构,再使用结构输出结果

    CREATE TYPE compfoo AS (f1 int, f2 text);
    
    CREATE FUNCTION getfoo() RETURNS SETOF compfoo AS $$
        SELECT fooid, fooname FROM foo
    $$ LANGUAGE SQL;

    2,直接在return中定义表结构

    CREATE FUNCTION sum_n_product_with_tab (x int)
    RETURNS TABLE(sum int, product int) AS $$
        SELECT $1 + tab.y, $1 * tab.y FROM tab;
    $$ LANGUAGE SQL;

    3,return定义为record,在定义输出参数

    CREATE FUNCTION sum_n_product_with_tab (x int, OUT sum int, OUT product int)
    RETURNS SETOF record
    AS $$
        SELECT $1 + tab.y, $1 * tab.y FROM tab;
    $$ LANGUAGE SQL;

    主要为以上三种基础情况,再说下基于以上的高频的写法。

    基于逻辑需要,表结构需要拼接字符串,这时函数内的数据集是使用 execute 获取的,直接使用execute runsql;  是不能通过调用函数获取最后的结果的。可以这么玩。

    CREATE TYPE compfoo AS (f1 int, f2 text);
    
    create function func1(x int4) 
    returns setof compfoo as $BODY$
    declare row_index compfoo ;
    declare runstr text;
    .....
    begin
    
    ....
    
    for row_index in execute runstr loop
    return next row_index;
    end loop;
    
    end
    $BODY$

    来解读下,先定义输出结构。在函数内使用 for in 循环输出结果。这样才能将通过调用函数返回结果。

    注:变量 row_index 需要在 declare 声明变量时定义,不然会报“ for  附近有异常”的错误。

    转载注明出处:https://www.cnblogs.com/jackicalSong/

    以下截图为以上逻辑写出的来的。。

    方便他人,成就自己!

  • 相关阅读:
    umask
    mysql 错误总结 和FROM_UNIXTIME用法
    php 读取和下载execl
    Yii 2 load() 和 save()
    iframe 模拟ajax文件上传and formdata ajax 文件上传
    angular.js简单入门。
    mysql 慢日志
    mysql 基本操作 alter
    shell cut 用法
    微信支付与支付宝支付
  • 原文地址:https://www.cnblogs.com/jackicalSong/p/9852008.html
Copyright © 2011-2022 走看看