2017-01-14 1 views
1

테이블 이름의 접미사를 입력으로 사용하는 절차가 있습니다. 그런 다음 execute format()을 사용하여이 매개 변수를 전달하여 동적 쿼리를 실행합니다.동일한 인수를 여러 번 사용하여 format()을 사용하는 동적 쿼리

execute format('SELECT table_%s.field1, table_%s.field2,table_%s.field3 
FROM table_%s', inTableSuffix) 

내가 이해 :

execute format('SELECT table_%s.field1, table_%s.field2,table_%s.field3 
FROM table_%s', inTableSuffix, inTableSuffix, inTableSuffix, inTableSuffix, ...) 

나는 다음과 같은 형식을 싶습니다 내가 같은 시간을 X 통과하고 싶지 않아 - 문제는이 매개 변수를 통해 동일한 것입니다 테이블 이름에 별칭을 사용하여이 문제를 해결할 수 있지만 다른 대안이 있습니까?

+0

그래서 당신은 당신의 대답을해야합니까? –

답변

3

할 수 있습니다 반복적으로 주소이 같은 위치 인수 :


execute format('SELECT table_%1$s.field1 
    , table_%1$s.field2,table_%1$s.field3 
FROM table_%1$s;', inTableSuffix); 

참고 :


:이 특별한 경우에, 당신은 별칭을 사용하여 자신을 반복하지 않도록 할 수 있습니다
execute format('SELECT tx.field1 
    , tx.field2, tx.field3 
FROM table_%s tx;', inTableSuffix); 
+0

또한 조인이 없으면 각 열에 테이블 이름을 사용할 필요가 없지만 조인이 있어도 테이블에 별칭을 사용할 수 있기 때문에 전체 테이블 이름을 여러 번 연결할 필요가 없습니다. – llouk

+1

그게 바로 내가 대답에 추가 한 것입니다 ... – wildplasser

1

@wildplasser already provided the syntax 동일한 매개 변수를 반복적으로 참조하는 방법은 format()입니다. 그래도 코드는 여전히 위험합니다. 당신은 는 사용자 입력에서 내장 된 식별자를 탈출 필요합니다

EXECUTE format('SELECT field1, field2, field3 FROM %I', 'table_' || inTableSuffix); 

주어진 예를 들어, 한 번만 어쨌든 매개 변수가 필요합니다. plpgsql에서 EXECUTE으로 실행되는 동적 쿼리의 범위는 쿼리 자체로 제한됩니다. 함수의 다른 변수 또는 매개 변수는 이 아니며 안에이 표시됩니다. 따라서 FROM 절에있는 단일 테이블로 동적 쿼리의 열을 테이블 한정 할 필요가 없습니다.

그러나 더 중요한 것은 구문 오류, 잘못된 안내문 오류 또는 SQL 주입 오류를 피하기 위해 식별자에 대해 %I is used in format()입니다. 그렇지 않으면 불법적 인 식별자 인, just like quote_ident() would을 큰 따옴표로 묶어서 (단!)!

세부 사항 :

+0

@wildplasser : 이미 그렇게하고있는 것 같습니다. (더 비싼) 변수가 필요 없기 때문에 연결된 표현식을 매개 변수로 전달할 수 있습니다. 옆으로 :'quote_identifier()'가 아니라'quote_ident()'입니다. –

+0

죄송합니다. 나는 그것을 보지 못했습니다. – wildplasser

관련 문제