간단한 PostgreSQL 스크립트에서 변수를 어떻게 사용합니까?


답변:


132

완전한 대답은 공식 PostgreSQL 문서에 있습니다.

새로운 PG9.0 익명 코드 블록 기능을 사용할 수 있습니다 ( http://www.postgresql.org/docs/9.1/static/sql-do.html )

DO $$
DECLARE v_List TEXT;
BEGIN
  v_List := 'foobar' ;
  SELECT *
  FROM   dbo.PubLists
  WHERE  Name = v_List;
  -- ...
END $$;

또한 마지막 삽입 ID를 얻을 수 있습니다 .

DO $$
DECLARE lastid bigint;
BEGIN
  INSERT INTO test (name) VALUES ('Test Name') 
  RETURNING id INTO lastid;

  SELECT * FROM test WHERE id = lastid;
END $$;

7
(그리고 잊지 마세요 ;후를 END $$과 같이, : END $$;.)
KajMagnus

3
나를 위해 작동하지 않습니다. 오류가 거의 없습니다. plpgsql 언어로 시작과 끝 사이에 몇 가지 기능이 있습니다.
Ash

51
이 예제의 코드는 작동하지 않습니다. ERROR: query has no destination for result data HINT: If you want to discard the results of a SELECT, use PERFORM instead. CONTEXT: PL/pgSQL function inline_code_block line 7 at SQL statement
Jasen

1
PostgreSQL을 완전히 처음 접했기 때문에 잠시 동안 저를 던졌습니다. 여기에 몇 가지 팁이 더 있습니다. + 세미콜론으로 문을 끝내십시오! + 변수 식별자가 없기 때문에 모호한 열 이름을 피하기 위해 _ 또는 유사한 것을 사용할 수 있습니다. + 다음과 같이 사용하여 변수를 줄의 값으로 설정할 수 있습니다. DECLARE _accountid INT : = 1;
The Coder

1
나를 위해 일하지 마십시오. 다람쥐 사용. 오류 : ERROR :이나 $$ "근처 종료되지 않은 달러 인용 된 문자열
올리버 왓킨스

39
DO $$
DECLARE  
   a integer := 10;  
   b integer := 20;  
   c integer;  
BEGIN  
   c := a + b;
    RAISE NOTICE'Value of c: %', c;
END $$;

3
나를 위해 일하지 마십시오. 다람쥐 사용. 오류 : ERROR :이나 $$ "근처 종료되지 않은 달러 인용 된 문자열
올리버 왓킨스

1
변수를 사용하기 위해 당신이 알아낼 걸 렸어요 으로 접두사 :다른 변수로. @ achilles-ram-nakirekanti select문 에서 이것을 사용하여 이것을 더 명확하게하기 위해 예제를 추가 할 수 있습니까?
exhuma

28

당신이 사용할 수있는:

\set list '''foobar'''
SELECT * FROM dbo.PubLists WHERE name = :list;

그렇게 할 것입니다


3
오류 : "\"근처에 구문 오류가 있습니다. 무엇을 놓치고 있습니까?
scw

14
@scw psql콘솔 에서만 사용할 수 있습니다 . 앱의 SQL에 이것을 작성할 수 없습니다.
owensmartin

당신은 사용할 수 있습니다 @owensmartin이 psql 프로그램을 통해 파이프됩니다 아무것도 .. 또는 psql의이 읽는 모든 스크립트는 ...이다
에반 캐롤

4
이것은 질문에 전혀 대답하지 않습니다. MS SQL에서는 쿼리에 var를 정의하고 동일한 도구에서 바로 사용할 수 있습니다. 나는 사람들이이 질문의 모든 버전에서 왜 이것을 대답으로 계속 제안하는지 이해하지 못합니다.

@stone은 이것이 큰 "미스" postgresql이고 가장 최악의 대안 이기 때문 입니다. 일반적으로 나는 매우 만족했다 postgresql: 그러나 이것은 의외로 큰 실패이다
javadba

10

다음은 plpgsql에서 변수를 사용하는 예입니다.

create table test (id int);
insert into test values (1);
insert into test values (2);
insert into test values (3);

create function test_fn() returns int as $$
    declare val int := 2;
    begin
        return (SELECT id FROM test WHERE id = val);
    end;
$$ LANGUAGE plpgsql;

SELECT * FROM test_fn();
 test_fn 
---------
       2

자세한 내용 은 plpgsql 문서 를 참조하십시오.


4

\set스크립팅 변수를 선언 하는 데 사용하는 다른 문서를 보았지만 값은 상수 값처럼 보이며 상수 변수가 아닌 변수처럼 작동 할 수있는 방법을 찾고 있습니다.

전의:

\set Comm 150

select sal, sal+:Comm from emp

다음 sal은 테이블 'emp' comm에있는 값이며 상수 값입니다.


2

이렇게해야 했어요

CREATE OR REPLACE FUNCTION MYFUNC()
RETURNS VOID AS $$
DO
$do$
BEGIN
DECLARE
 myvar int;
 ...
END
$do$
$$ LANGUAGE SQL;

2

Postgresql에는 베어 변수가 없으므로 임시 테이블을 사용할 수 있습니다. 변수는 코드 블록 또는 사용자 인터페이스 기능으로 만 사용할 수 있습니다.

베어 변수가 필요한 경우 임시 테이블을 사용할 수 있습니다.

CREATE TEMP TABLE list AS VALUES ('foobar');

SELECT dbo.PubLists.*
FROM   dbo.PubLists,list
WHERE  Name = list.column1;

부수적 인 이점으로이 접근 방식은 데이터베이스에 구애받지 않으므로 백엔드에서 테스트를보다 쉽게 ​​이식 할 수 있습니다.
감독

2

@ nad2000의 답변과 @Pavel의 답변을 바탕으로 여기 에서 Flyway 마이그레이션 스크립트를 완성했습니다 . 데이터베이스 스키마가 수동으로 수정 된 시나리오 처리.

DO $$
BEGIN
    IF NOT EXISTS(
        SELECT TRUE FROM pg_attribute 
        WHERE attrelid = (
            SELECT c.oid
            FROM pg_class c
            JOIN pg_namespace n ON n.oid = c.relnamespace
            WHERE 
                n.nspname = CURRENT_SCHEMA() 
                AND c.relname = 'device_ip_lookups'
            )
        AND attname = 'active_date'
        AND NOT attisdropped
        AND attnum > 0
        )
    THEN
        RAISE NOTICE 'ADDING COLUMN';        
        ALTER TABLE device_ip_lookups
            ADD COLUMN active_date TIMESTAMP;
    ELSE
        RAISE NOTICE 'SKIPPING, COLUMN ALREADY EXISTS';
    END IF;
END $$;


1

예를 들어 alter table에서 변수를 사용하려면 :

DO $$ 
DECLARE name_pk VARCHAR(200);
BEGIN
select constraint_name
from information_schema.table_constraints
where table_schema = 'schema_name'
      and table_name = 'table_name'
      and constraint_type = 'PRIMARY KEY' INTO name_pk;
IF (name_pk := '') THEN
EXECUTE 'ALTER TABLE schema_name.table_name DROP CONSTRAINT ' || name_pk;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.