Rumah > pangkalan data > tutorial mysql > Bagaimanakah Fungsi PL/pgSQL Dapat Mengembalikan Hasil Secara Dinamik daripada Pelbagai Pertanyaan SELECT?

Bagaimanakah Fungsi PL/pgSQL Dapat Mengembalikan Hasil Secara Dinamik daripada Pelbagai Pertanyaan SELECT?

DDD
Lepaskan: 2025-01-22 23:31:12
asal
605 orang telah melayarinya

How Can a PL/pgSQL Function Dynamically Return Results from Various SELECT Queries?

Refactor PL/pgSQL berfungsi untuk mengembalikan output pertanyaan SELECT yang berbeza

SQL dinamik dan jenis pemulangan

Mengembalikan rekod jenis yang tidak ditentukan

Fungsi asal mengisytiharkan jenis teks pemulangan, tetapi kini matlamatnya adalah untuk melaksanakan pernyataan SQL yang dijana dan mengembalikan hasilnya sebagai rekod. Untuk melakukan ini, anda perlu menggunakan SQL dinamik dan menangani rekod pengembalian jenis yang belum ditentukan.

Jenis tersuai dengan kebolehubah jenis angka dan data

Satu pendekatan adalah untuk mencipta jenis pulangan tersuai dengan bilangan lajur tetap tetapi jenis data berubah-ubah. Walau bagaimanapun, ini memerlukan penentuan senarai definisi lajur untuk setiap panggilan, yang menjadi tidak praktikal apabila nama lajur dan jenis data tidak diketahui terlebih dahulu.

Gunakan jenis polimorfik

pg_typeof() Mengembalikan nama jadual sebagai jenis pengecam objek (jenis reg). Apabila ditukar secara automatik kepada teks, pengecam secara automatik disebut dua kali dan memenuhi syarat corak, sekali gus menghalang suntikan SQL.

LAKSANAKAN SOALAN KEMBALI

Cara pilihan untuk melaksanakan SQL dinamik dan mengembalikan baris ialah RETURN QUERY EXECUTE. Ia membolehkan anda melaksanakan pertanyaan SQL dan mengembalikan hasil sebagai set baris dengan jenis baris yang jelas.

Contoh Kod

Andaikan anda ingin mengembalikan semua lajur mana-mana jadual berdasarkan parameter jenis jadual:

<code class="language-sql">CREATE OR REPLACE FUNCTION data_of(_tbl_type anyelement, _id int)
  RETURNS SETOF anyelement
  LANGUAGE plpgsql AS
$func$
BEGIN
   RETURN QUERY EXECUTE format('
      SELECT *
      FROM   %s  -- 自动用双引号括起来并进行模式限定
      WHERE  id = 
      ORDER  BY datahora'
    , pg_typeof(_tbl_type))
   USING  _id;
END
$func$;</code>
Salin selepas log masuk

Penggunaan

Panggil fungsi ini dengan jenis jadual sebagai parameter pertama dan ID sebagai parameter kedua. Fungsi ini akan mengembalikan semua lajur rekod dengan ID yang diberikan dalam jadual yang ditentukan.

<code class="language-sql">SELECT * FROM data_of(NULL::pcdmet, 17);
-- 将pcdmet替换为任何其他表名。</code>
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimanakah Fungsi PL/pgSQL Dapat Mengembalikan Hasil Secara Dinamik daripada Pelbagai Pertanyaan SELECT?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan