Rumah > pangkalan data > tutorial mysql > Bagaimana untuk Memfaktorkan Semula Fungsi PL/pgSQL untuk Mengendalikan Jenis Pengembalian SQL Dinamik?

Bagaimana untuk Memfaktorkan Semula Fungsi PL/pgSQL untuk Mengendalikan Jenis Pengembalian SQL Dinamik?

Linda Hamilton
Lepaskan: 2025-01-22 23:32:11
asal
148 orang telah melayarinya

How to Refactor a PL/pgSQL Function to Handle Dynamic SQL Return Types?

Refactor PL/pgSQL berfungsi untuk mengembalikan output pelbagai pertanyaan PILIH

SQL dinamik dan jenis pemulangan

Pada masa ini, fungsi anda mengembalikan rentetan teks yang mewakili pernyataan SELECT yang dijana. Untuk mengautomasikan pelaksanaan dan mengembalikan hasil, anda boleh menggunakan SQL dinamik. Walau bagaimanapun, kesukaran terletak pada jenis pulangan yang tidak ditentukan. Fungsi perlu menentukan jenis pulangan dalam klausa RETURNS.

Penyelesaian jenis pulangan tetap

Dengan mengandaikan jenis pulangan tetap, yang mengandungi lajur cap masa bernama datahora dan dua lajur tambahan dengan nama dan jenis yang berbeza, anda boleh melaksanakan perkara berikut:

<code class="language-sql">CREATE OR REPLACE FUNCTION data_of(_id integer)
  RETURNS TABLE (datahora timestamp, col2 text, col3 text)
  LANGUAGE plpgsql AS
$func$
DECLARE
   _sensors text := 'col1::text, col2::text';  -- 将每一列强制转换为文本类型
   _type    text := 'foo';
BEGIN
   RETURN QUERY EXECUTE '
      SELECT datahora, ' || _sensors || '
      FROM   ' || quote_ident(_type) || '
      WHERE  id = 
      ORDER  BY datahora'
   USING  _id;
END
$func$;</code>
Salin selepas log masuk

Bilangan lajur adalah berubah-ubah, tetapi jenisnya adalah sama

Jika jenis pulangan mempunyai bilangan lajur yang berubah-ubah, tetapi semua lajur adalah daripada jenis yang sama (contohnya, dua kali ganda), gunakan jenis tatasusunan:

<code class="language-sql">CREATE OR REPLACE FUNCTION data_of(_id integer)
  RETURNS TABLE (datahora timestamp, names text[], values float8[])
  LANGUAGE plpgsql AS
$func$
DECLARE
   _sensors text := 'col1, col2, col3';  -- 列名的简单列表
   _type    text := 'foo';
BEGIN
   RETURN QUERY EXECUTE format('
      SELECT datahora
           , string_to_array()  -- 作为名称
           , ARRAY[%s]            -- 作为值
      FROM   %s
      WHERE  id = 
      ORDER  BY datahora'
    , _sensors, _type)
   USING  _sensors, _id;
END
$func$;</code>
Salin selepas log masuk

Jenis jadual lengkap

Untuk mengembalikan semua lajur jadual, gunakan jenis polimorfik:

<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  -- pg_typeof 返回 regtype,自动引用
      WHERE  id = 
      ORDER  BY datahora'
    , pg_typeof(_tbl_type))
   USING  _id;
END
$func$;</code>
Salin selepas log masuk

Cara menggunakan:

<code class="language-sql">SELECT * FROM data_of(NULL::pcdmet, 17);</code>
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Memfaktorkan Semula Fungsi PL/pgSQL untuk Mengendalikan Jenis Pengembalian SQL Dinamik?. 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan