Postgresql EXECUTE的查询字符串参数为null
编辑 我的问题似乎是当这个select语句返回null时(我正试图处理这种情况——当它返回null时,我希望我的新值为-999)。如果每当发现空值时它就会出错,我怎么做呢 原创 我已经阅读了关于这个错误的所有其他帖子,但似乎没有一篇能够解决我问题的根源 这个错误非常简单——我的EXECUTE语句中的一个参数为null。伟大的然而,在调用EXECUTE语句之前,我打印出了构成EXECUTE语句的每个值,我可以清楚地看到没有一个值是空的 代码: 输出:Postgresql EXECUTE的查询字符串参数为null,postgresql,plpgsql,dynamic-sql,psql,Postgresql,Plpgsql,Dynamic Sql,Psql,编辑 我的问题似乎是当这个select语句返回null时(我正试图处理这种情况——当它返回null时,我希望我的新值为-999)。如果每当发现空值时它就会出错,我怎么做呢 原创 我已经阅读了关于这个错误的所有其他帖子,但似乎没有一篇能够解决我问题的根源 这个错误非常简单——我的EXECUTE语句中的一个参数为null。伟大的然而,在调用EXECUTE语句之前,我打印出了构成EXECUTE语句的每个值,我可以清楚地看到没有一个值是空的 代码: 输出: NOTICE: tablename: inf
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注入易受攻击)。您可以使用以下一些技巧:
使用语句的
作为常用参数
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转换,可读性更强一点(因为字符串表达式更短)format
。建筑查询字符串将更短,可读性更强(表别名也有帮助):
错误消息是干净的-您正在使用标识符
temp\u table\u icrm\u prob\u flow.date\u valid
,但是查询中没有提到表temp\u table\u icrm\u prob\u flow。查询缺少连接部分。很抱歉,这个主题太小了。您的代码非常不可读(SQL注入易受攻击)。您可以使用以下一些技巧:
使用语句的
作为常用参数
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转换,可读性更强一点(因为字符串表达式更短)format
。建筑查询字符串将更短,可读性更强(表别名也有帮助):
错误消息是干净的-您正在使用标识符
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;