예를 들어 MS-SQL에서 쿼리 창을 열고 다음을 실행할 수 있습니다.
DECLARE @List AS VARCHAR(8)
SELECT @List = 'foobar'
SELECT *
FROM dbo.PubLists
WHERE Name = @List
PostgreSQL에서 어떻게 수행됩니까? 할 수 있습니까?
예를 들어 MS-SQL에서 쿼리 창을 열고 다음을 실행할 수 있습니다.
DECLARE @List AS VARCHAR(8)
SELECT @List = 'foobar'
SELECT *
FROM dbo.PubLists
WHERE Name = @List
PostgreSQL에서 어떻게 수행됩니까? 할 수 있습니까?
답변:
완전한 대답은 공식 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 $$;
;
후를 END $$
과 같이, : END $$;
.)
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
DO $$
DECLARE
a integer := 10;
b integer := 20;
c integer;
BEGIN
c := a + b;
RAISE NOTICE'Value of c: %', c;
END $$;
:
다른 변수로. @ achilles-ram-nakirekanti select
문 에서 이것을 사용하여 이것을 더 명확하게하기 위해 예제를 추가 할 수 있습니까?
당신이 사용할 수있는:
\set list '''foobar'''
SELECT * FROM dbo.PubLists WHERE name = :list;
그렇게 할 것입니다
psql
콘솔 에서만 사용할 수 있습니다 . 앱의 SQL에 이것을 작성할 수 없습니다.
postgresql
이고 가장 최악의 대안 이기 때문 입니다. 일반적으로 나는 매우 만족했다 postgresql
: 그러나 이것은 의외로 큰 실패이다
다음은 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 문서 를 참조하십시오.
Postgresql에는 베어 변수가 없으므로 임시 테이블을 사용할 수 있습니다. 변수는 코드 블록 또는 사용자 인터페이스 기능으로 만 사용할 수 있습니다.
베어 변수가 필요한 경우 임시 테이블을 사용할 수 있습니다.
CREATE TEMP TABLE list AS VALUES ('foobar');
SELECT dbo.PubLists.*
FROM dbo.PubLists,list
WHERE Name = list.column1;
@ 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 $$;
예를 들어 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;