Sql 使用PERFORM将SELECT语句的字符串插入临时表
我试图将数据插入temp_表,然后在分析结果后截断该表 这是我的密码: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
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
就在错误之前-请用它更新poststmt
的值是多少??错误在哪里?在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)
返回表。这完全取决于你需要什么。