2010-04-02 4 views
41

SQL Server를 사용하면 SQL Server Management Studio 또는 다른 클라이언트를 통해 전체 프로 시저 논리로 코드 임시 T-SQL 코드를 실행할 수 있습니다. 필자는 PostgreSQL으로 작업을 시작했으며, PGSQL이 어떤 로직을 함수에 임베드해야한다는 점에서 약간의 차이점이 있습니다.함수를 작성하지 않고 pl/pgsql 코드를 어떻게 실행할 수 있습니까?

함수를 실행하지 않고 PL/PGSQL 코드를 실행할 수있는 방법이 있습니까?

답변

51

포스트 그레스

DO $$ 
-- declare 
BEGIN 
    /* pl/pgsql here */ 
END $$; 
+3

이 답변을 발견하고 "ERROR : syntax "SELECT"또는 근처에서 오류가 발생하면 BEGIN 및 END가 필요합니다. DO $$ BEGIN/* pl/pgsql here// END $$ –

+2

하지만이 코드는 어떻게 쿼리 결과를 반환 할 수 있습니까? 내가 pl/pgsql 부분에 SELECT를 넣으면'오류 : 결과 데이터에 대한 목적지가 쿼리에 없다 ' – isapir

+2

@Igal : 할 수 없다. DO 문에서 아무것도 반환 할 수 없습니다. 가능한 조치로주의 사항을 올리거나 임시 테이블에 기록하거나 커서를 열 수 있습니다. –

5

아니요, 아직 없습니다. 버전 9.0 (여전히 알파)에는이 옵션 (do)이 있으며 릴리스 될 때까지 기다려야합니다.

+0

+1,하지만 난이 8.5 발표 생각 - http://developer.postgresql.org/pgdocs/postgres/release-8.5.html –

+1

을 나는 8.5 9.0되었다 생각 구현 된 몇 가지 주요 기능 때문에 ... –

+0

아, 그게 설명 할 수 있습니다. –

1

9 나는 딱 맞는 장소에서 세미 콜론을 추가하는 방법에 대한 매우 엄격한이기 때문에이 작업을 진행하기 위해 노력. 그러나 일단 익숙해지면 잘 작동합니다. 물론 레코드를 반환 할 수 없다는 것 외에도 알림 & 예외를 발생시키고 위의 설명에서 @ErwinBrandstetter가 지적한 임시 테이블 사용과 같은 다른 해결 방법을 사용할 수 있습니다.

예 :

DO 
$$ 
BEGIN 
    IF EXISTS(SELECT 'any rows?' 
       FROM {your_table} 
       WHERE {your_column} = 'blah') 
    THEN 
     RAISE NOTICE 'record exists'; 
    ELSE 
     RAISE EXCEPTION 'record does not exist'; 
    END IF; 

    DROP TABLE IF EXISTS foo; 

    CREATE TEMP TABLE foo AS 
    SELECT 'bar'::character varying(5) as baz; 
END 
$$; 

SELECT * FROM foo; 
+0

SQL Server/Oracle 저장 프로 시저와 비슷한 행을 반환하는 기능이 PostgreSQL의 다음 버전에서 제공 될 것으로 생각합니다. 그것이 왜 오래 걸렸는가? –

관련 문제