2017-12-21 24 views
0

아래 함수가 성공적으로 컴파일되었습니다. 내가 select schema.funtion_name();을 수행 할 때 함수가 실행되지만 테이블 schema.table_insert에 삽입 된 행이 없습니다됩니다 : 900 개 이상의 000 레코드를 반환 cur_1 커서에서plpgsql 함수가 의도 한대로 데이터를 삽입하지 않습니다.

CREATE OR REPLACE FUNCTION schema.function_name() 
RETURNS void AS 
$BODY$ 
DECLARE cur_1 CURSOR FOR 
    Select col1 from schema.table1 
    union 
    select col1 from schema.table2 
    union 
    select col1 from schema.table3 
    union 
    select col1 from schema.table4; 

BEGIN 
    FOR rec_i in cur_1 LOOP 
     insert into schema.table_insert (col1,col2,col3) 
     select col1,col2,col3 
     from schema.view 
     where col1=rec_i.col1 

     commit; 
    END LOOP;  
END; 
$BODY$ 
LANGUAGE plpgsql STABLE 

셀렉트. 단일 레코드에 대해 insert 문을 별도로 사용하면 레코드가 테이블에 삽입됩니다.

+0

[그래서 당신은 당신의 대답을해야합니까?] (https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) –

답변

1

다음 기능이 성공적으로 컴파일되었습니다.

아니요.

먼저, plpgsql 기능은 컴파일되지 않습니다. 생성시 표면 구문 확인 만 수행 된 다음 함수 본문이 그대로 저장됩니다. 편집 없음. 후기 바인딩. 중첩 된 SQL 문은 준비된 문으로 처리됩니다.

표시하는 기능을 제외하고는 전혀 만들 수 없습니다. 구문상의 난센스입니다. INSERT 뒤에 세미콜론이 누락되었습니다. COMMIT은 이해할 수 없으며 plpgsql에서 허용되지 않습니다. 이를 위해 커서가 필요 없습니다. 루핑도 안돼. 간단한 SQL 문을 사용하여

INSERT INTO schema.table_insert (col1, col2, col3) 
SELECT v.col1, v.col2, v.col3 
FROM schema.view v 
JOIN (
    SELECT col1 FROM schema.table1 
    UNION 
    SELECT col1 FROM schema.table2 
    UNION 
    SELECT col1 FROM schema.table3 
    UNION 
    SELECT col1 FROM schema.table4; 
    ) sub USING (col1); 

등가를 빠르게 할 수있다 :

INSERT INTO schema.table_insert (col1, col2, col3) 
SELECT v.col1, v.col2, v.col3 
FROM schema.view v 
WHERE EXISTS (SELECT 1 schema.table1 WHERE col1 = v.col1) 
OR  EXISTS (SELECT 1 schema.table2 WHERE col1 = v.col1) 
OR  EXISTS (SELECT 1 schema.table3 WHERE col1 = v.col1) 
OR  EXISTS (SELECT 1 schema.table4 WHERE col1 = v.col1); 

함수에 싸서하지만, 과잉 plpgsql입니다 수 있습니다. 그리고 STABLEINSERT을 포함하는 함수에 대해 잘못되었습니다. 나는 일반 SQL 함수를 제안하고 VOLATILE이 기본값이고이를 수정했다.

CREATE OR REPLACE FUNCTION schema.function_name() 
    RETURNS void AS 
$func$ 
INSERT ... 
$func$ LANGUAGE sql;