2014-06-13 3 views
1

"SELECT"쿼리를 변수에 할당하고 그 변수를 실행하고 결과를 표시하려고하지만 작은 따옴표를 인용하는 동안 멈추었습니다.변수에 SELECT 문을 할당하고 PostgreSQL을 사용하여 해당 변수를 실행하는 방법

:

create or replace function test() returns setof record as 
$BODY$ 
Declare 
     query1 varchar; 
Begin 

     query1 := SELECT DISTINCT c."Name", c."Address" 
      INTO temptable 
     FROM table1 l 
     INNER JOIN tablename c on l."Name" = c."Name" 
     ORDER BY "Name"; 

    /* Here need to execute query1 and get result of it */ 
end; 
$BODY$ 
language plpgsql; 

질문 어떻게 select 문에 대한 적절한 따옴표를 제공하고 실행하는 방법?

답변

2

의 비표준 (오래된, 역사적인) 구문이므로 실제로는 select .. into ... ...을 원하지 않는다고 가정합니다.

함수를 returns setof record으로 선언 했으므로 실제로 결과 집합을 반환한다고 가정합니다. 함수의 사용법이 더 쉽기 때문에 대신 returns table (...)을 사용하는 것이 좋습니다.

마지막으로 동적 SQL에 대한 이유는 여기에 표시되지 않지만 단순히 전체 내용을 말씀하지 않았다고 가정합니다.

다음은 (안된) 작동합니다 :

create or replace function test() 
    returns table (name text, address text) 
as 
$BODY$ 
Declare 
     query1 varchar; 
Begin 
    query1 := 'SELECT DISTINCT c."Name", c."Address" 
     FROM table1 l 
     INNER JOIN tablename c on l."Name" = c."Name" 
     ORDER BY "Name"'; 

    return query execute query1; 
end; 
$BODY$ 
language plpgsql; 

NameAddress 모두 varchar 또는 text 열이 있다고 가정합니다. 그렇지 않은 경우 returns table (text, text) 부분을 조정해야합니다.

create or replace function test() 
    returns table (name text, address text) 
as 
$body$ 
SELECT DISTINCT c."Name", c."Address" 
FROM table1 l 
    INNER JOIN tablename c on l."Name" = c."Name" 
ORDER BY "Name"'; 
$body$ 
language sql; 

또한 인용 식별자를 피해야한다 : 동적 SQL 또는 PL/pgSQL의 간단한 SQL 기능을 할 것입니다 (일반적으로 훨씬 빠를 것이다)에 대한 필요가 없습니다

하지만 당신의 예를 제공 . 그들은 장기적으로 가치가있는 것보다 더 많은 문제가 있습니다. 열 이름을 인용하지 않고 테이블을 만들면됩니다.

+0

정말 고마워요. – Meem

관련 문제