मैं सोच रहा था कि PostgreSQL फ़ंक्शन के पैरामीटर के रूप में परिणाम सेट प्रदान करने का कोई तरीका है या नहीं। उत्तर शायद "नहीं" है, लेकिन यह पूछने में कोई हर्ज नहीं है। शायद इससे कुछ विचार निकल सकें।

मेरे पास सरल विज़ुअलाइज़ेशन उद्देश्यों के लिए एक परिणाम सेट को एक पेड़ के रूप में प्रारूपित करने का तर्क है और मैं इसे डेटाबेस में एक फ़ंक्शन (format_tree()) के रूप में जोड़ना चाहता था।

उदाहरण के लिए यदि कोई परिणाम सेट लौटाता है:

id parent_id title
-- --------- --------------
 1      null Animal
 2         1 Mammal
 3         1 Bird
 4         3 Eagle
 5         2 Marsupial
 6         5 Cangaroo

तर्क वर्तमान में इसे इस प्रकार प्रारूपित कर सकता है:

+- Animal
   +- Mammal
   |  +- Marsupial
   |     +- Cangaroo
   +- Bird
     +- Eagle

कोई भी SQL सिंटैक्स कर सकता है (उम्मीद है कि एक साधारण)। शायद कुछ ऐसा:

select *
from (
  format_tree(
    select a as id, b as parent_id, c as title
    from ...
    where ...
  )
) x

इस रिपोर्टिंग डेटाबेस के लिए मुझे इंजन चुनने की कुछ स्वतंत्रता है, इसलिए यदि किसी अन्य डेटाबेस (Oracle, DB2, SQL Server, MariaDB, आदि) के लिए कोई विचार है जो काम भी कर सकता है।

0
The Impaler 20 जिंदा 2021, 23:11
"परिणाम" क्यों पास करें? क्यों न केवल एक ऐसा फ़ंक्शन बनाएं जो तालिका से पूछताछ करे और "स्वरूपित आउटपुट" लौटाए?
 – 
a_horse_with_no_name
20 जिंदा 2021, 23:56
टिप्पणी के लिए धन्यवाद। बात यह है कि "पैरामीटर डेटा" मक्खी पर इकट्ठा किया जाता है और कोई भी प्रश्न हो सकता है जो एक पेड़ पैदा करता है। मैं किसी भी तरह format_tree() तर्क को डेटाबेस में ही एक प्रक्रिया/कार्य के रूप में संग्रहीत करना चाहता था यदि संभव हो तो।
 – 
The Impaler
21 जिंदा 2021, 00:05

1 उत्तर

सबसे बढ़िया उत्तर

मुझे ऐसा करने में कोई बात नहीं दिख रही है, लेकिन आप पूर्व-परिभाषित प्रकार की एक सरणी पास कर सकते हैं:

create type tree_line 
(
  id  integer, 
  parent_id integer, 
  title text
);

फिर आप उस फ़ंक्शन को परिभाषित कर सकते हैं जो उस प्रकार की सरणी स्वीकार करता है:

create function format_tree(p_data tree_line[])
  returns table (line text)
as
$$
  ...
$$

और इसे इस तरह कहते हैं:

select *
from format_tree(array(select (a, b, c)::tree_line
                       from ...
                       where ...));

एक अन्य विकल्प JSONB मान को "परिणाम सेट धारक" के रूप में उपयोग करना हो सकता है:

create function format_tree(p_data jsonb)
  returns table (line text)
as
$$
  ...
$$

फिर इसे इस तरह इस्तेमाल करें:

select *
from format_tree((select jsonb_agg(t)
                  from ( 
                    select a as id, b as parent_id, c as text
                    from ...
                  )  t
                 ));
1
a_horse_with_no_name 21 जिंदा 2021, 00:27
मैं बस यही सोच रहा था। उत्कृष्ट विचार। इसे आजमाएंगे।
 – 
The Impaler
21 जिंदा 2021, 00:15
@TheImpaler: एक अन्य विकल्प परिणाम को JSONB सरणी में एकत्र करना होगा। थोड़ा अधिक "गतिशील" और लचीला, लेकिन tree_line प्रकार की आवश्यकता नहीं है।
 – 
a_horse_with_no_name
21 जिंदा 2021, 00:21