ร่างกายของฟังก์ชั่นจะถูกเก็บไว้เช่นเดียวกับสตริง ไม่มีรายการของวัตถุที่อ้างอิง (ซึ่งแตกต่างจากมุมมองเช่นที่บันทึกลิงก์จริงไปยังตารางอ้างอิง)
เคียวรีสำหรับPostgres 10 หรือเก่ากว่านี้ใช้ฟังก์ชันข้อมูลระบบแค็ตตาล็อกpg_get_functiondef()
เพื่อสร้างCREATE FUNCTION
สคริปต์ใหม่สำหรับฟังก์ชันที่เกี่ยวข้องและค้นหาชื่อตารางด้วยนิพจน์ทั่วไป
SELECT n.nspname AS schema_name
, p.proname AS function_name
, pg_get_function_arguments(p.oid) AS args
, pg_get_functiondef(p.oid) AS func_def
FROM pg_proc p
JOIN pg_namespace n ON n.oid = p.pronamespace
WHERE NOT p.proisagg
AND n.nspname NOT LIKE 'pg_%'
AND n.nspname <> 'information_schema'
AND pg_get_functiondef(p.oid) ~* '\mbig\M';
มันควรจะทำงาน แต่เห็นได้ชัดว่ามันไม่ได้พิสูจน์กระสุน สามารถล้มเหลวสำหรับ SQL แบบไดนามิกที่ชื่อตารางถูกสร้างแบบไดนามิกและสามารถส่งกลับจำนวนบวกเท็จใด ๆ - โดยเฉพาะถ้าชื่อตารางเป็นคำทั่วไป
ฟังก์ชั่นรวมและฟังก์ชั่นทั้งหมดจากสคีมาของระบบจะไม่รวม
\m
และ\M
ทำเครื่องหมายจุดเริ่มต้นและจุดสิ้นสุดของคำในนิพจน์ปกติ
แคตตาล็อกระบบที่pg_proc
เปลี่ยนแปลงใน Postgres 11 proisagg
ถูกแทนที่ด้วยprokind
มีการเพิ่มกระบวนงานที่เก็บจริง คุณต้องปรับตัว ที่เกี่ยวข้อง:
EXECUTE
การแสดงออกเช่น'mm_'||name_parameter
นั้นและมันจะไม่รับมืออย่างถูกต้องกับชื่อที่ยกมาเช่น"my""table""
หรือแบบตัวพิมพ์เล็ก แต่มันจะทำในสิ่งที่คนส่วนใหญ่ต้องการ .