2017-09-15 76 views
0

我试图将数据插入到temp_table中,然后在分析结果后截断表。使用PERFORM将SELECT语句的字符串插入临时表

这里是我的代码:

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(); 我得到一个错误:

ERROR: missing FROM-clause entry for table "temp_table" Where: PL/pgSQL function validation() line 21 at IF

这里我有多么staging.validation表看起来是 -

https://docs.google.com/spreadsheets/d/1bXO9gqFS-GtcC1qJtgNbFkR6ygOuPtR_RZoU7VNhgrI/edit?usp=sharing

+0

'stmt'的值是什么?错误在哪里?在“PERFORM”上? –

+0

'stmt'是一条SQL语句,它从'staging.validation'表中获取该值。我认为这个问题与IF条件有关。 – hky404

+0

你知道'执行'某事'与'选择'某事'几乎相同吗?可能你想要'EXECUTE'语句呢? – Abelisto

回答

3

首先,你不必为每个变量都使用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回丢失;

+1

好的答案,但是两个注意事项: “IF temp = false THEN'不明确,”IF temp THEN“应该足够;第三种方式:'插入...返回*到rec;如果rec.col3那么......'。 – Abelisto

+1

完全可行@Abelisto,我没有注意到RECORD。但由于查询处于PERFORM中,因此第三种方式也应该采用EXECUTE INTO格式。 – Dan

+0

@Abelisto能否请您详细说明第三种方式? – hky404

相关问题