ตัวอย่างเช่นใน 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 $$;
นอกจากนี้คุณจะได้รับรหัสแทรกล่าสุด:
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สำหรับข้อมูลเพิ่มเติม
ฉันเจอเอกสารอื่น ๆ ที่ใช้\set
ในการประกาศตัวแปรสคริปต์ แต่ค่าดูเหมือนจะเป็นค่าคงที่และฉันกำลังหาวิธีที่สามารถทำหน้าที่เหมือนตัวแปรไม่ใช่ตัวแปรคงที่
เช่น:
\set Comm 150
select sal, sal+:Comm from emp
นี่sal
คือค่าที่มีอยู่ในตาราง 'emp' และcomm
เป็นค่าคงที่
ฉันต้องทำอะไรแบบนี้
CREATE OR REPLACE FUNCTION MYFUNC()
RETURNS VOID AS $$
DO
$do$
BEGIN
DECLARE
myvar int;
...
END
$do$
$$ LANGUAGE SQL;
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 $$;
สำหรับลูกค้า CLI อย่างเป็นทางการ "psql" ดูที่นี่ และ "pgAdmin3" 1.10 (ยังอยู่ในเบต้า) มี " pgScript "
สำหรับตัวแปรที่ใช้ในตัวอย่างเช่น 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;