sql - 如何在执行 select 语句 where 子句中使用变量而不在列上出错?

标签 sql postgresql

我在运行存储过程时遇到了一些问题,其中 select 语句在列名称上抛出错误?

下面的存储过程根据 select 语句的结果在循环内创建数据。问题是 where 子句 WHERE r.report_status = IN_CONSIDERATION THROWING EXCEPTION INDICATING THAT IN_CONSIDERATION 不是一个列,是的,它确实不是一个列,它不应该是,但为什么它不起作用?任何线索?非常感谢。我将在下面发布异常(exception)情况

 CREATE OR REPLACE FUNCTION public.field_validations2(
  )
    RETURNS void
    LANGUAGE 'plpgsql'

    COST 100
    VOLATILE 
AS $BODY$
DECLARE
   cust_rec RECORD;
    new_signature_id bigint;
   inconsideration varchar;
BEGIN
    inconsideration := 'IN_CONSIDERATION';
    FOR cust_rec IN
        EXECUTE format('SELECT l.* FROM public.report_attached_person_many_to_many l INNER JOIN public.report r ON l.report_id = r.id WHERE r.report_status=%I', inconsideration)
    LOOP
  INSERT INTO public.report_signature(
    id, active, created, created_by, deleted, modified, modified_by, comment, status, type, staff, is_finished)
  VALUES (nextval('hibernate_sequence'),'true','1561713543512', '123', 'false', '1561713543512', '123', 'should be deleted after testing', '0', '1' , cust_rec.staff_id , 'false')
  RETURNING new_signature_id;
  INSERT INTO public.report_required_signatures_many_to_many(
      report_id, signature_id)
      VALUES (cust_rec.report_id, new_signature_id);
    END LOOP;
END
$BODY$;

ALTER FUNCTION public.field_validations2()
    OWNER TO postgres;

我得到的异常:

    ERROR:  column "IN_CONSIDERATION" does not exist
LINE 1: ...ort r ON l.report_id = r.id WHERE r.report_status="IN_CONSID...
                                                             ^
QUERY:  SELECT l.* FROM public.report_attached_person_many_to_many l INNER JOIN public.report r ON l.report_id = r.id WHERE r.report_status="IN_CONSIDERATION"
CONTEXT:  PL/pgSQL function field_validations2() line 8 at FOR over EXECUTE statement
SQL state: 42703

最佳答案

尝试在格式字符串中使用 %L 而不是 %I

EXECUTE format('SELECT l.* FROM public.report_attached_person_many_to_many l INNER JOIN public.report r ON l.report_id = r.id WHERE r.report_status=%L', inconsideration)

编辑

为什么要对选择查询使用执行?为什么不只是

FOR cust_rec IN (
  SELECT l.*
  FROM public.report_attached_person_many_to_many l
    INNER JOIN public.report r ON l.report_id = r.id
   WHERE r.report_status = inconsideration)
LOOP

关于sql - 如何在执行 select 语句 where 子句中使用变量而不在列上出错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57008649/

相关文章:

sql - Oracle 条件连接语句

sql - Postgresql 独特语句

sql - 分数 = 伯努利参数的 Wilson 分数置信区间的下限

c# - 如何将复合类型传递给 PL/pgsql 函数?

ruby-on-rails - 从 RoR 查询 postgreSQL 比从提示查询慢?

sql - PostgreSQL触发器和存储过程使用什么语言?

mysql - 三张表的两次求和和内连接的SQL语句

sql - 选择表中的所有表,其中表 1 中的列存在于另一个表中,第二列等于第二个表中的变量

node.js - 使用模式数据库时,sails.js 如何处理数据库迁移?

sql - 为什么 COUNT(*) 需要对 SQL Server 上的所有表列具有 SELECT 权限?