【问题标题】:Postgresql execute dynamic query inside function return NULLPostgresql在函数内执行动态查询返回NULL
【发布时间】:2016-01-29 19:03:18
【问题描述】:

我有一个 Postgresql 函数,它将获取一些输入(通过动态查询从这些参数中查询值)并返回该值(在这里它是唯一的,因此结果应该是一个整数)。

但是,我可以通过终端正常查询动态(很容易从 id = 'abcd' 的表中选择值)并获取值(例如:2)。但是当我执行函数时,Executed dynamic query 的值总是返回NULL。

我该如何解决这个问题?当我不知道为什么 EXECUTE "query" INTO 变量但变量返回 NULL 而 "query" 在另一个终端中运行时可以返回值时,我很累。

这是我的函数,我想返回 _result_value(它始终为 NULL - 注意:RESULT ABC: )。当我可以通过 psql 查询时。

SELECT uom_id FROM ps_quantity WHERE id = 15
 uom_id 
--------
      1
(1 row)




   CREATE OR REPLACE FUNCTION select_field(
    selected_table text,
    selected_field text,
    field_type_sample anyelement,
    where_clause text DEFAULT ''::text)
  RETURNS anyelement AS
$BODY$DECLARE
    -- Log
    ME  constant text := 'selected_field()';
    -- Local variables
        _qry          text;
        _result_value ALIAS FOR $0;
    abc integer := 0;
    BEGIN
    RAISE NOTICE 'FUNCTION select_field';
       --- _qry := 'SELECT ' || quote_ident(selected_field) ||
       ---          ' FROM ' || quote_ident(selected_table) ||
       ---               ' ' || where_clause;

    _qry := ' SELECT uom_id FROM ps_quantity WHERE id = 15; ';

    RAISE NOTICE 'WHAT IN HERE: query %', _qry;

       -- return 1000;              
       -- RAISE DEBUG '%: %', ME, _qry;
    RAISE NOTICE 'Preparing to query data';
       -- EXECUTE _qry INTO  _result_value; 
        --EXECUTE (' SELECT uom_id FROM ps_quantity WHERE id = ''15'' ') into abc;
    EXECUTE ' SELECT uom_id FROM ps_quantity WHERE id = 15; ' into _result_value;
    RAISE NOTICE 'RESULT ABC: %', _result_value;



        RETURN  _result_value;
    END;$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

【问题讨论】:

    标签: sql postgresql function plpgsql


    【解决方案1】:

    您的代码正在我的数据库上运行。也许你正在执行这个函数的不同实例 - PostgreSQL 允许函数重载,并且一些神秘的错误是基于更多同名的函数。

    我非常不喜欢这种函数——你试图隐藏 SQL——如果这种技术是相当慢的应用程序,通常的结果,但这是你的生活:)。使用现代 PostgreSQL,您可以编写更具可读性的函数:

    CREATE OR REPLACE FUNCTION foo(_field text, _table text, _id int,
                                   resulttypedval anyelement, OUT _result anyelement)
    AS $$
    BEGIN
      EXECUTE format('SELECT %I FROM %I'
                          ' WHERE $1 IS NULL OR id = $1',
                      _field, _table)
         INTO _result
         USING _id;
      RETURN;
    END;
    $$ LANGUAGE plpgsql;  
    

    【讨论】:

    • 感谢您的帮助,我会按您的要求尝试。
    猜你喜欢
    • 2020-10-06
    • 2012-07-05
    • 2021-08-16
    • 1970-01-01
    • 2015-04-07
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    • 2017-01-13
    相关资源
    最近更新 更多