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?

Sathish
sumber

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.

mu terlalu pendek
sumber
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 .

Erwin Brandstetter
sumber
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, ...

Pavel Stehule
sumber
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

Ram Pukar
sumber
-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;
rinku Choudhary
sumber