2017-09-15 1 views
0

temp_table에 데이터를 삽입하고 결과를 분석 한 후 테이블을 잘라내려고합니다. -PERFORM을 사용하여 SELECT 문의 문자열을 임시 테이블에 삽입하십시오.

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

내 staging.validation 테이블 보이는 방법 :

나는이 기능을 실행 할 때마다
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(); 나는 오류가 발생 : 여기

내 코드입니다

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

+0

'stmt'의 값은 무엇입니까 ?? 그리고 그 오류는 어디에 있습니까? '공연'? –

+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 

셋째, 당신의 기능, RETURNS 텍스트을 가지고 당신의 PL 반환이없는;

+1

좋은 답변이지만 두 가지 메모가 있습니다 : 'IF temp = false THEN'은 모호하며'IF temp THEN'이면 충분합니다. 그리고 세 번째 방법은'insert into ... rec * into rec; rec.col3 then ... '이면. – Abelisto

+1

@ rigisto, 나는 기록을 알아 차리지 못했습니다. 그러나 쿼리가 PERFORM이기 때문에 세 번째 방법은 EXECUTE INTO 형식이어야합니다. – Dan

+0

@Abelisto 제 3의 방법을 자세히 설명해 주시겠습니까? – hky404

관련 문제