Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql EXECUTE的查询字符串参数为null_Postgresql_Plpgsql_Dynamic Sql_Psql - Fatal编程技术网

Postgresql EXECUTE的查询字符串参数为null

Postgresql EXECUTE的查询字符串参数为null,postgresql,plpgsql,dynamic-sql,psql,Postgresql,Plpgsql,Dynamic Sql,Psql,编辑 我的问题似乎是当这个select语句返回null时(我正试图处理这种情况——当它返回null时,我希望我的新值为-999)。如果每当发现空值时它就会出错,我怎么做呢 原创 我已经阅读了关于这个错误的所有其他帖子,但似乎没有一篇能够解决我问题的根源 这个错误非常简单——我的EXECUTE语句中的一个参数为null。伟大的然而,在调用EXECUTE语句之前,我打印出了构成EXECUTE语句的每个值,我可以清楚地看到没有一个值是空的 代码: 输出: NOTICE: tablename: inf

编辑

我的问题似乎是当这个select语句返回null时(我正试图处理这种情况——当它返回null时,我希望我的新值为-999)。如果每当发现空值时它就会出错,我怎么做呢

原创

我已经阅读了关于这个错误的所有其他帖子,但似乎没有一篇能够解决我问题的根源

这个错误非常简单——我的EXECUTE语句中的一个参数为null。伟大的然而,在调用EXECUTE语句之前,我打印出了构成EXECUTE语句的每个值,我可以清楚地看到没有一个值是空的

代码:

输出:

NOTICE:  tablename: inform_tseries_data_basin_proc_fcst_prob_flow
NOTICE:  location_id: 38
NOTICE:  product_date: 2015-02-05 12:00:00+00
NOTICE:  count: 1
ERROR:  query string argument of EXECUTE is null
CONTEXT:  PL/pgSQL function inform_icrm_prob_flow_query(text,integer,text,integer,integer,integer,integer,text) line 38 at EXECUTE
如果我传递的变量中没有一个是空的,并且唯一引用的是我知道存在的临时表,那么是什么导致了这个错误

注意:将我的查询更改为:

query := 'SELECT value FROM '|| tablename ||' WHERE '|| tablename ||'.id_location = '|| location_id ||' AND '|| tablename ||'.date_product = '''|| product_date ||''' AND '|| tablename ||'.id_member = '|| count ||' AND temp_table_icrm_prob_flow.date_va    lid = '|| tablename ||'.date_valid';
我得到以下错误:

NOTICE:  tablename: inform_tseries_data_basin_proc_fcst_prob_flow
NOTICE:  location_id: 38
NOTICE:  product_date: 2015-02-05 12:00:00+00
NOTICE:  count: 1
ERROR:  missing FROM-clause entry for table "temp_table_icrm_prob_flow"
LINE 1: ..._data_basin_proc_fcst_prob_flow.id_member = 1 AND temp_table...
                                                         ^
QUERY:  SELECT value FROM inform_tseries_data_basin_proc_fcst_prob_flow WHERE inform_tseries_data_basin_proc_fcst_prob_flow.id_location = 38 AND inform_tseries_data_basin_proc_fcst_prob_flow.date_product = '2015-02-05 12:00:00+00' AND inform_tseries_data_basin_proc_fcst_prob_flow.id_member = 1 AND temp_table_icrm_prob_flow.date_valid = inform_tseries_data_basin_proc_fcst_prob_flow.date_valid
CONTEXT:  PL/pgSQL function inform_icrm_prob_flow_query(text,integer,text,integer,integer,integer,integer,text) line 35 at EXECUTE

对不起,有点离题了。您的代码非常不可读(SQL注入易受攻击)。您可以使用以下一些技巧:

  • Use子句
    使用语句的
    作为常用参数

    DO $$
    DECLARE
      tablename text := 'mytab';
      from_date date := CURRENT_DATE;
    BEGIN
       EXECUTE 'INSERT INTO ' || quote_ident(tablename) || ' VALUES($1)'
          USING from_date;
    END
    $$;
    
    此代码将是安全的(由于使用
    quote_ident
    函数),更快一点(由于使用from_date变量的二进制值-删除了多个stringdate转换,可读性更强一点(因为字符串表达式更短)

  • 使用function
    format
    。建筑查询字符串将更短,可读性更强(表别名也有帮助):

  • 使用诸如重要SQL关键字和标识符之类的变量是错误的想法-名称计数,值是错误的


    错误消息是干净的-您正在使用标识符
    temp\u table\u icrm\u prob\u flow.date\u valid
    ,但是查询中没有提到表temp\u table\u icrm\u prob\u flow。查询缺少连接部分。

    很抱歉,这个主题太小了。您的代码非常不可读(SQL注入易受攻击)。您可以使用以下一些技巧:

  • Use子句
    使用语句的
    作为常用参数

    DO $$
    DECLARE
      tablename text := 'mytab';
      from_date date := CURRENT_DATE;
    BEGIN
       EXECUTE 'INSERT INTO ' || quote_ident(tablename) || ' VALUES($1)'
          USING from_date;
    END
    $$;
    
    此代码将是安全的(由于使用
    quote_ident
    函数),更快一点(由于使用from_date变量的二进制值-删除了多个stringdate转换,可读性更强一点(因为字符串表达式更短)

  • 使用function
    format
    。建筑查询字符串将更短,可读性更强(表别名也有帮助):

  • 使用诸如重要SQL关键字和标识符之类的变量是错误的想法-名称计数,值是错误的


    错误消息是干净的-您正在使用标识符
    temp\u table\u icrm\u prob\u flow.date\u valid
    ,但是表temp\u table\u icrm\u prob\u flow没有在查询中提到。查询缺少连接部分。

    执行查询到curr\u value之后检查
    curr\u value
    curr\u value为空,因此我们发现您的问题em.使用
    execute'.'转换为strict…;
    以确保查询返回数据。这似乎有效。谢谢!@Abelisto根据文档:
    如果提供了strict选项,则会报告错误,除非查询只生成一行
    。您解决了一个症状,而不是一个问题。在
    EXECUT之后检查
    curr\u value
    E查询到curr_value;
    curr_value为空并不奇怪,因此我们发现了您的问题。使用
    execute'…'到strict…;
    确保查询返回数据。这似乎有效。谢谢!@Abelisto根据文档:
    如果给定strict选项,除非查询只生成一行,否则将报告错误。您解决的是症状,而不是问题。
    
    query := format('
    SELECT value
       FROM %I _dtn
            INNER JOIN temp_table_icrm_prob_flow t ON t.date_valid = _dtn.date_valid
      WHERE _dtn.id_location = $1
        AND _dtn.date_product = $2
        AND _dtd.id_member = $3'
                     , tablename);
     EXECUTE query INTO curr_value USING location_id, product_date, count;