Menyimpan hasil kueri dalam variabel menggunakan dalam PL / pgSQL


130

Bagaimana cara menetapkan hasil kueri ke variabel dalam PL / pgSQL, bahasa prosedural PostgreSQL?

Saya memiliki fungsi:

CREATE OR REPLACE FUNCTION test(x numeric)
RETURNS character varying AS
$BODY$
DECLARE
name   character varying(255);
begin
 name ='SELECT name FROM test_table where id='||x;

 if(name='test')then
  --do somthing
 else
  --do the else part
 end if;
end;
return -- return my process result here
$BODY$
LANGUAGE plpgsql VOLATILE

Dalam fungsi di atas saya perlu menyimpan hasil dari query ini:

'SELECT name FROM test_table where id='||x;

ke variabel name.

Bagaimana prosesnya?

Jawaban:


198

Saya pikir Anda sedang mencari SELECT INTO:

select test_table.name into name from test_table where id = x;

Itu akan menarik namedari test_tablemana idargumen fungsi Anda dan membiarkannya dalam namevariabel. Jangan tinggalkan awalan nama tabel test_table.nameatau Anda akan mendapat keluhan tentang referensi yang ambigu.


2
Bagaimana jika saya membutuhkan banyak variabel. Suka pilih test_table.name, test_table.id, test_table.ssn?
— Dao Lam

2
@ QingdaoLam: Dari dokumentasi saya suka: "Hasil dari perintah SQL yang menghasilkan satu baris (mungkin beberapa kolom) dapat ditugaskan ke variabel rekaman, variabel tipe-baris, atau daftar variabel skalar."
— mu terlalu pendek

@muistooshort sehingga Anda mengatakan saya bisa melakukan hal yang sama dan saya dapat menggunakan name.id, name.ssn untuk mengambil? Saya mencobanya dengan JIKA ADA tapi tidak berhasil: JIKA ADA (pilih * ke nama dari test_table ...))
— Dao Lam

@PORLam Mengapa Anda menggabungkan INTO dengan IF EXISTS? Mungkin Anda harus mengajukan pertanyaan baru sehingga Anda dapat menjelaskan apa yang Anda coba lakukan.
— mu terlalu pendek

3
Tidak ada contoh dalam dokumentasi (atau saya melewatkannya), tetapi seperti yang dicatat oleh @muistooshort, Anda dapat memilih ke dalam beberapa variabel dengan satu pilihan:SELECT test_table.column1, test_table.column2 INTO variable1, variable2 FROM test_table WHERE id = x;
— Grengas

78

Selama Anda menetapkan variabel tunggal, Anda juga dapat menggunakan tugas polos dalam fungsi plpgsql:

name := (SELECT t.name from test_table t where t.id = x);

Atau gunakan SELECT INTOseperti @mu sudah disediakan .

Ini juga berfungsi:

name := t.name from test_table t where t.id = x;

Tapi lebih baik gunakan salah satu dari dua yang pertama, metode yang lebih jelas, seperti komentar @Pavel.

Saya mempersingkat sintaks dengan alias tabel.
Pembaruan: Saya menghapus contoh kode saya dan menyarankan untuk menggunakan IF EXISTS()sebagai gantinya disediakan oleh @Pavel .


1
Ini bukan ide yang baik - fitur ini tidak didokumentasikan dan jelek
— Pavel Stehule

2
PL / pgSQL memungkinkan campuran SQL dan PL - dan kadang-kadang Anda dapat membuat makhluk yang sangat aneh, tetapi lebih baik mencampur PL dan SQL dengan bersih - dalam pernyataan terisolasi.
— Pavel Stehule

@PavelStehule: Saya setuju, formulir Anda lebih disukai.
— Erwin Brandstetter

Sebenarnya saya memang lebih suka sintaks Anda, tetapi masalahnya adalah ketika Anda ingin menangani kesalahan, pernyataan Anda tidak mengirim DITEMUKAN di kebalikan dari pernyataan select into, checkout ( postgresql.org/docs/9.1/plpgsql-statements.html )
— SENHAJI RHAZI Hamza

18

Pola yang biasa adalah EXISTS(subselect):

BEGIN
  IF EXISTS(SELECT name
              FROM test_table t
             WHERE t.id = x
               AND t.name = 'test')
  THEN
     ---
  ELSE
     ---
  END IF;

Pola ini digunakan dalam PL / SQL, PL / pgSQL, SQL / PSM, ...


2

Buat Tabel Belajar:

CREATE TABLE "public"."learning" (
    "api_id" int4 DEFAULT nextval('share_api_api_id_seq'::regclass) NOT NULL,
    "title" varchar(255) COLLATE "default"
);

Sisipkan Tabel Pembelajaran Data:

INSERT INTO "public"."learning" VALUES ('1', 'Google AI-01');
INSERT INTO "public"."learning" VALUES ('2', 'Google AI-02');
INSERT INTO "public"."learning" VALUES ('3', 'Google AI-01');

Langkah: 01

CREATE OR REPLACE FUNCTION get_all (pattern VARCHAR) RETURNS TABLE (
        learn_id INT,
        learn_title VARCHAR
) AS $$
BEGIN
    RETURN QUERY SELECT
        api_id,
        title
    FROM
        learning
    WHERE
        title = pattern ;
END ; $$ LANGUAGE 'plpgsql';

Langkah: 02

SELECT * FROM get_all('Google AI-01');

Langkah: 03

DROP FUNCTION get_all();

Demo: masukkan deskripsi gambar di sini


-2

Anda bisa menggunakan contoh berikut untuk menyimpan hasil kueri dalam variabel menggunakan PL / pgSQL:

 select * into demo from maintenanceactivitytrack ; 
    raise notice'p_maintenanceid:%',demo;
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.