CREATE OR REPLACE FUNCTION drop_now()
RETURNS void AS
$func$
DECLARE
_tbl regclass;
_found int;
BEGIN
FOR _tbl IN
SELECT relid
FROM pg_stat_user_tables
WHERE schemaname = 'public'
AND relname LIKE '%test%'
LOOP
EXECUTE format($f$SELECT 1 FROM %s
WHERE tm < now() - interval '90 min'$f$, _tbl);
GET DIAGNOSTICS _found = ROW_COUNT;
IF _found > 0 THEN
-- EXECUTE 'DROP TABLE ' || _tbl;
RAISE NOTICE 'Dropped table: %', _tbl;
END IF;
END LOOP;
END
$func$ LANGUAGE plpgsql;
प्रमुख बिंदु
-
row
एक आरक्षित शब्द है एसक्यूएल मानक में। Postgres में इसका उपयोग करने की अनुमति है, लेकिन यह अभी भी नासमझी है। मैं इसे अंडरस्कोर_
. के साथ psql वैरिएबल को प्रीपेन्ड करने की आदत बना लेता हूं किसी भी नामकरण विरोध से बचने के लिए। -
आप पूरी पंक्ति का चयन नहीं करते हैं वैसे भी, इस उदाहरण में केवल तालिका का नाम।
regclass
. प्रकार के वेरिएबल का सर्वोत्तम उपयोग करें , जिससे स्वचालित रूप से अवैध तालिका नामों के माध्यम से SQL इंजेक्शन से बचा जा सकता है। इस संबंधित उत्तर में विवरण:
तालिका नाम PostgreSQL फ़ंक्शन पैरामीटर के रूप में -
आपको
LIMIT
की आवश्यकता नहीं है एकEXISTS
. में अभिव्यक्ति, जो केवल किसी . के अस्तित्व की जांच करती है पंक्तियाँ। और आपको उसी कारण से सार्थक लक्ष्य स्तंभों की आवश्यकता नहीं है। बस लिखेंSELECT 1
कोड> याSELECT *
या कुछ । -
आपको डायनामिक SQL की आवश्यकता है परिवर्तनीय पहचानकर्ताओं के साथ प्रश्नों के लिए। सादा एसक्यूएल इसके लिए अनुमति नहीं देता है। यानी:एक क्वेरी स्ट्रिंग बनाएं और
EXECUTE
यह। इस निकट से संबंधित उत्तर में विवरण:
डायनामिक SQL (EXECUTE) IF स्टेटमेंट के लिए शर्त के रूप में -
DROP
. के लिए भी यही सच है कथन, क्या आप इसे चलाना चाहते हैं। मैंने एक टिप्पणी जोड़ी।