Stored procedures 在存储过程中为null时处理动态参数

Stored procedures 在存储过程中为null时处理动态参数,stored-procedures,amazon-redshift,plpgsql,Stored Procedures,Amazon Redshift,Plpgsql,我正在用红移处理存储过程。我看到,当传递给存储过程中Execute语句的参数为NULL时。它失败,无法执行空字符串 请告诉我如何解决这个问题 存储过程: CREATE OR REPLACE PROCEDURE outer_proc() LANGUAGE plpgsql AS $$ DECLARE cond_holder RECORD; iter RECORD; BEGIN drop table if exists tmp_direction_comms; create tempora

我正在用红移处理存储过程。我看到,当传递给存储过程中Execute语句的参数为
NULL
时。它失败,无法执行空字符串

请告诉我如何解决这个问题

存储过程:

CREATE OR REPLACE PROCEDURE outer_proc() LANGUAGE plpgsql
AS $$
DECLARE
cond_holder RECORD;
iter RECORD;
BEGIN

  drop table if exists tmp_direction_comms;

  create temporary table  tmp_direction_comms as select distinct code from direction_coms;

  DROP TABLE if exists final_direction_comms;

  EXECUTE  'CREATE TEMP TABLE final_direction_comms
     (
    code varchar(100),
    direction varchar(100),
    dir_flg  Boolean
    )';

  FOR iter IN select code from tmp_direction_comms LOOP
    RAISE INFO 'code is %', iter.code;

    SELECT INTO cond_holder distinct condition FROM mapping where  code = iter.code;

    RAISE INFO 'engmnt_cd is %', cond_holder.condition;

    EXECUTE 'INSERT INTO final_direction_comms select code, direction, case when  NVL('||cond_holder.condition||',false) then true else false end as dir_flg
    from direction_coms where code = '''||iter.code||'''';

  END LOOP;
END;
$$;
有两个变量可以为NULL-
iter.code
cond\u holder.condition
cond_holder.condition
NVL
包装,但
NVL
在结果字符串中,而不是在生成表达式中

第二个大问题是针对SQL注入的漏洞。也许你应该这样做:

 EXECUTE 'INSERT INTO final_direction_comms select code, direction, 
           case when  ' || NVL(cond_holder.condition, false) ' || then true else false end as dir_flg
              from acp_edw.stg_edw.direction_coms where code = $1'
    USING iter.code;
我不确定Redshift是否支持使用子句。如果没有,则应使用
quote\u literal
函数:

'... where code = ' || quote_literal(iter.code);

我相信是管道符号| |导致整个字符串变为空。我能知道是否还有其他方法。@kites-那么空值应该在
iter.code
中。没有其他可能。在执行之前尝试推送-
引发通知“%”,cond_holder.condition为null,iter.code为null
@风筝-
|
对空敏感。Postgres具有
concat
功能,但红移太旧。也许您可以使用
COALESCE
函数istead
NVL
NVL和coalese在红移中似乎是相同的。我得到这个错误合并类型字符变化和布尔不能匹配@kites,对于这种情况,您可以编写
'false'
,而不是
false
'... where code = ' || quote_literal(iter.code);