Sql 使用PERFORM将SELECT语句的字符串插入临时表

Sql 使用PERFORM将SELECT语句的字符串插入临时表,sql,postgresql,plpgsql,Sql,Postgresql,Plpgsql,我试图将数据插入temp_表,然后在分析结果后截断该表 这是我的密码: CREATE OR REPLACE FUNCTION validation() RETURNS text AS $$ DECLARE counter INTEGER; DECLARE minsid INTEGER; DECLARE maxsid INTEGER; DECLARE rec RECORD; DECLARE stmt varchar; BEGIN SELECT MIN(sid) INTO minsid FR

我试图将数据插入temp_表,然后在分析结果后截断该表

这是我的密码:

CREATE OR REPLACE FUNCTION validation()
  RETURNS text AS $$
DECLARE counter INTEGER;
DECLARE minsid INTEGER;
DECLARE maxsid INTEGER;
DECLARE rec RECORD;
DECLARE stmt varchar;
BEGIN
  SELECT MIN(sid) INTO minsid FROM staging.validation;
  SELECT MAX(sid) INTO maxsid FROM staging.validation;

  CREATE TEMPORARY TABLE temp_table (col1 TEXT, col2 INTEGER, col3 BOOLEAN) ON COMMIT DROP;

  FOR counter IN minsid..maxsid LOOP
    RAISE NOTICE 'Counter: %', counter;
    SELECT sql INTO stmt FROM staging.validation WHERE sid = counter;

    RAISE NOTICE 'sql: %', stmt;

    PERFORM 'INSERT INTO temp_table (col1, col2, col3) ' || stmt;

    IF temp_table.col3 = false THEN
      RAISE NOTICE 'there is a false value';
    END IF;

  END LOOP;
END; $$
LANGUAGE plpgsql;
每当我运行这个函数时
SELECT*FROM validation()
我得到一个错误:

错误:缺少表“temp_table”的子句条目,其中:IF处的PL/pgSQL函数验证()第21行

以下是我的staging.validation表的外观-


首先,您不必对每个变量都使用DECLARE,一个就足够了

DECLARE
    counter INTEGER;
    minsid INTEGER;
    maxsid INTEGER;
    rec RECORD;
    stmt varchar;
其次,不能像那样使用temp_table.col3,必须查询它,因为它是一个表。您可以创建一个变量并查询到表中,也可以直接进行查询

变量:

-- First you declare de varialbe:
DECLARE
    temp BOOLEAN;

... -- rest of your code

temp := temp_table.col3 FROM temp_table WHERE temp_table.col2=counter;
-- you need something to make the query, here as a test I put col2=counter
IF temp=false THEN
... -- rest of your code
直接:

... -- rest of your code
IF (SELECT temp_table.col3 FROM temp_table WHERE temp_table.col2=counter)=false THEN
-- Again, you need something to make the query
... -- rest of your code

第三,您的函数有返回文本,在pl中,返回丢失

首先,您不必对每个变量都使用DECLARE,只需使用一个变量就足够了

DECLARE
    counter INTEGER;
    minsid INTEGER;
    maxsid INTEGER;
    rec RECORD;
    stmt varchar;
其次,不能像那样使用temp_table.col3,必须查询它,因为它是一个表。您可以创建一个变量并查询到表中,也可以直接进行查询

变量:

-- First you declare de varialbe:
DECLARE
    temp BOOLEAN;

... -- rest of your code

temp := temp_table.col3 FROM temp_table WHERE temp_table.col2=counter;
-- you need something to make the query, here as a test I put col2=counter
IF temp=false THEN
... -- rest of your code
直接:

... -- rest of your code
IF (SELECT temp_table.col3 FROM temp_table WHERE temp_table.col2=counter)=false THEN
-- Again, you need something to make the query
... -- rest of your code


第三,您的函数有返回文本,在pl中,返回丢失

stmt
的值是多少??错误在哪里?在
PERFORM
stmt
是一条SQL语句,它从
staging.validation
表中获取该值。我认为问题在于IF条件。您知道执行“某物”的
与选择“某物”的
几乎相同吗?可能您希望使用
EXECUTE
语句?
发出通知“sql:%”,stmt
给出了一条没有我猜想的语句-smth like
选择col1col2,col3 form temp_table
就在错误之前-请用它更新post
stmt
的值是多少??错误在哪里?在
PERFORM
stmt
是一条SQL语句,它从
staging.validation
表中获取该值。我认为问题在于IF条件。您知道执行“某物”的
与选择“某物”的
几乎相同吗?可能您希望使用
EXECUTE
语句?
发出通知“sql:%”,stmt
给了你一个没有我猜想的陈述-smth喜欢
选择Col1 Col2,col3 form temp_table
就在错误之前-请用它更新帖子好的答案,但是有两个注释:
如果temp=false那么
是不明确的,
如果temp那么
应该足够了;第三种方法:
插入到。。。将*返回rec;如果rec.col3然后…
。完全正确@Abelisto,我没有注意到记录。但是由于查询是执行的,第三种方式也应该是执行成格式的。@Abelisto你能详细说明第三种方式吗?@Dan谢谢所有的指针,我更正了代码,但仍然坚持内部逻辑,我想执行INSERT INTO语句,这样,我就可以填充我的temp_表,并在出现“false”值时查询它。如果有一个“false”值,我想返回col1、col2和生成输出的结果查询。目前,我正在使用
raisenotice“存在错误值”
就像占位符一样,而且
返回VOID
,因为我不确定返回什么。如果要返回行,可以使用
创建类型测试as(col1 text,col2 integer)
并返回它(RETURNS test)。如果要返回多行,则返回一组记录
;还可以使用
返回表(col1 text,col2 integer)
返回表。答案很好,但有两点需要注意:
如果temp=false则
不明确,
如果temp则
就足够了;第三种方法:
插入到。。。将*返回rec;如果rec.col3然后…
。完全正确@Abelisto,我没有注意到记录。但是由于查询是执行的,第三种方式也应该是执行成格式的。@Abelisto你能详细说明第三种方式吗?@Dan谢谢所有的指针,我更正了代码,但仍然坚持内部逻辑,我想执行INSERT INTO语句,这样,我就可以填充我的temp_表,并在出现“false”值时查询它。如果有一个“false”值,我想返回col1、col2和生成输出的结果查询。目前,我正在使用
raisenotice“存在错误值”
就像占位符一样,而且
返回VOID
,因为我不确定返回什么。如果要返回行,可以使用
创建类型测试as(col1 text,col2 integer)
并返回它(RETURNS test)。如果要返回多行,则返回一组记录
;还可以使用
返回表(col1 text,col2 integer)
返回表。这完全取决于你需要什么。