PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

plpgsql फ़ंक्शन:यादृच्छिक तालिका से बनाए गए दृश्य से पंक्तियाँ लौटाएँ

यह इस तरह काम कर सकता है:

CREATE OR REPLACE FUNCTION tt_query(orig_name regclass, data_tt timestamp)
  RETURNS SETOF record AS
$func$
BEGIN

EXECUTE 'CREATE OR REPLACE TEMP VIEW tmp as 
select * 
from  '
|| orig_name 
|| ' where trigger_changed >'
|| quote_literal(data_tt)
|| ' ORDER BY trigger_changed DESC';

-- other work on view tmp

-- return the rows of view temp
RETURN QUERY
SELECT * FROM tmp;

END
$func$  LANGUAGE plpgsql;
  • ऑब्जेक्ट आइडेंटिफ़ायर प्रकार regclass स्वचालित रूप से SQL इंजेक्शन से बचने के लिए।

  • पुराने सिंटैक्स का उपयोग न करें var ALIAS for $1 अगर आपको नहीं करना है। इसके बजाय पैरामीटर नाम घोषित करें।

  • मैं temp कीवर्ड का उपयोग नहीं करूंगा पहचानकर्ता के रूप में, भले ही इसकी अनुमति हो। tmp का उपयोग करना इसके बजाय।

  • रिटर्न क्वेरी का उपयोग करें रिकॉर्ड का एक सेट वापस करने के लिए। यह EXECUTE . के बिना भी एक स्थिर कॉल हो सकता है . हालांकि, आप गुमनाम रिकॉर्ड लौटा रहे हैं और पोस्टग्रेज़ एक कॉलम परिभाषा सूची की मांग करता है हर कॉल के साथ:

SELECT * FROM tt_query('tbl_name', '2014-02-15 12:00')
AS f(col1 int, col2 text, ...);

यह बल्कि बोझिल है।

बेहतर समाधान

अगर आप जानते हैं वापसी प्रकार (भले ही तालिका के नाम बदल रहे हों, स्तंभों की सूची समान प्रकार साझा कर सकती है), इसे निर्माण के समय घोषित करें। इस संबंधित प्रश्न पर विचार करें:
PostgreSQL:ERROR:42601:"रिकॉर्ड" लौटाने वाले फंक्शन के लिए एक कॉलम परिभाषा सूची की आवश्यकता होती है

यदि रिटर्न प्रकार भिन्न होता है प्रदान किए गए तालिका नाम के साथ, अभी भी एक बेहतर समाधान है। चूंकि आप सेलेक्ट * tbl से . के साथ एक व्यू बना रहे हैं , आप तालिका के प्रसिद्ध प्रकार का उपयोग बहुरूपी पैरामीटर:

CREATE OR REPLACE FUNCTION tt_query(orig_name anyelement, data_tt timestamp)
  RETURNS SETOF anyelement AS
$func$
BEGIN

EXECUTE format('CREATE OR REPLACE TEMP VIEW tmp AS
   SELECT * FROM  %s
   WHERE  trigger_changed > %L
   ORDER  BY trigger_changed DESC'
  ,pg_typeof(orig_name)
  ,data_tt);

-- other work on view tmp

-- return the rows of view tmp
RETURN QUERY
SELECT * FROM tmp;

END
$func$  LANGUAGE plpgsql;

सरलीकृत कॉल:

SELECT * FROM tt_query(NULL::tbl_name, '2014-02-15 12:00');

साथ ही format()<का उपयोग करना /कोड> सुरक्षित और सरल स्ट्रिंग संयोजन के लिए।

इस संबंधित उत्तर में अधिक विवरण:
विभिन्न SELECT क्वेरीज़ के आउटपुट को वापस करने के लिए PL/pgSQL फ़ंक्शन को रिफ़ैक्टर करें




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एक अलग लोकेल के साथ PostgreSQL ऊपरी () फ़ंक्शन का उपयोग कैसे करें?

  2. एडब्ल्यूएस गोंद - सम्मिलित करने से पहले गंतव्य पोस्टग्रेज तालिका को छोटा करें

  3. आवारा में पोस्टग्रेज (ubuntu14.04)

  4. PostgreSQL त्रुटि:संबंध पहले से मौजूद है

  5. PostgreSQL में एक अस्थायी फ़ंक्शन कैसे बनाएं?