จะแสดงรหัสโพรซีเดอร์ที่จัดเก็บแบบเต็มได้อย่างไร?


113

คุณดูกระบวนงาน / ฟังก์ชันที่จัดเก็บไว้อย่างไร?

สมมติว่าฉันมีฟังก์ชันเก่าที่ไม่มีคำจำกัดความดั้งเดิม - ฉันต้องการดูว่ามันกำลังทำอะไรใน pg / psql แต่ดูเหมือนว่าฉันจะหาวิธีทำไม่ได้

ใช้ Postgres เวอร์ชัน 8.4.1

คำตอบ:


19

ใช้ pgAdmin หรือใช้pg_procเพื่อรับแหล่งที่มาของกระบวนงานที่เก็บไว้ของคุณ pgAdmin ทำเช่นเดียวกัน


3
pg_proc แค่นั้นเอง! ฉันดีใจที่พวกเขาประหยัดพื้นที่ได้สองสามไบต์โดยไม่เรียกมันว่า pg_procedure ... geez :)
ดาร์เรน

14
มันค่อนข้างง่ายที่จะค้นหาว่า psql ใช้เคียวรีใดเพื่อดึงข้อมูลนั้น (เช่นสำหรับคำสั่ง \ df) โดยเริ่ม psql ด้วยพารามิเตอร์ --echo-hidden ซึ่งจะแสดงแบบสอบถามทั้งหมดที่ใช้ภายใน pg_proc ไม่ได้จัดเก็บคำสั่ง CREATE FUNCTION ที่สมบูรณ์ คุณสามารถใช้ pg_get_functiondef () เพื่อดึงแหล่งข้อมูลทั้งหมด
a_horse_with_no_name

5
ในกรณีที่มีใครสับสนว่าตารางนั้นอยู่ที่ไหน: pg_catalog -> ตารางระบบ -> pg_proc
Dimitris

244

\df+ <function_name>ในpsql


6
มีวิธีการพิมพ์ที่สวยงามหรือไม่? เหตุผลที่ฉันถามเพราะสิ่งนี้ทำให้อ่านไม่ได้
12hys

3
นี่เป็นภาพพิมพ์ที่สวยสำหรับฉัน จำไว้ว่าคุณกำลังทำสิ่งนี้แบบโต้ตอบใน psql และบรรทัดถูกพันและเพจเจอร์เริ่มทำงานคุณสามารถสลับบรรทัดที่ถูกตัดออกโดยพิมพ์ '-S' (เหมือนกับอาร์กิวเมนต์บรรทัดคำสั่ง 'less') จากนั้นใช้ปุ่มลูกศรเพื่อเลื่อน รอบ ๆ .
Jonathan Hartley

10
เพื่อความชัดเจนคุณสามารถใช้\x เมตา - คำสั่ง psqlก่อนที่จะแสดงนิยามฟังก์ชัน \xยังมีประโยชน์สำหรับการดูผลการค้นหาที่มีระเบียนที่มีสตริงยาว
สตูว์

148

\ef <function_name>ใน psql มันจะให้ฟังก์ชันทั้งหมดพร้อมข้อความที่แก้ไขได้


2
คำตอบที่แน่นอน สิ่งนี้จะเปิดนิยามฟังก์ชันในตัวแก้ไข
Ponnusamy K

2
นี่คือคำตอบที่ดีที่สุด! แสดงนิยามของฟังก์ชันในรูปแบบที่อ่านได้
faramka

3
อย่าลืมพิมพ์; <enter>after เพื่อดำเนินการบัฟเฟอร์
redolent

5
ERROR: more than one function named
Brian Cannard

64
SELECT prosrc FROM pg_proc WHERE proname = 'function_name';

สิ่งนี้จะบอกตัวจัดการฟังก์ชันถึงวิธีเรียกใช้ฟังก์ชัน อาจเป็นซอร์สโค้ดจริงของฟังก์ชันสำหรับภาษาที่ตีความสัญลักษณ์ลิงก์ชื่อไฟล์หรืออะไรก็ได้ขึ้นอยู่กับหลักการใช้งานภาษา / การเรียก


สิ่งนี้มีประโยชน์ มีวิธีการพิมพ์ออกมาสวยหรือไม่?
Setjmp

psqlนี้จะเป็นประโยชน์เพราะมันไม่จำเป็นต้องมี โปรดทราบว่าชื่อฟังก์ชันดูเหมือนจะลดขนาดลง
Seamus Abshere

@ Maxim คุณรู้วิธีตรวจจับประเภทการส่งคืนและอาร์กิวเมนต์อินพุตหรือไม่?
ไฟว์ล

@Fivell สำหรับชื่ออาร์กิวเมนต์เท่านั้นไม่ใช่ประเภท: SELECT proname, prosrc, proargnames FROM pg_proc WHERE proname like '%func_name%'. อย่างน้อยก็ในหน้า 9.6 คุณสามารถรับรหัสตัวเลขของประเภทผ่านคุณสมบัติproargtypesได้ แต่คุณต้องเข้าร่วมกับตารางอื่นเพื่อให้เป็นชื่อ
Thalis K.


9

หากใครสงสัยว่าจะค้นหาตารางแค็ตตาล็อกได้อย่างรวดเร็วและใช้ประโยชน์จากpg_get_functiondef()ฟังก์ชันนี้ได้อย่างไรตัวอย่างแบบสอบถาม:

SELECT n.nspname AS schema
      ,proname AS fname
      ,proargnames AS args
      ,t.typname AS return_type
      ,d.description
      ,pg_get_functiondef(p.oid) as definition
--      ,CASE WHEN NOT p.proisagg THEN pg_get_functiondef(p.oid)
--            ELSE 'pg_get_functiondef() can''t be used with aggregate functions'
--       END as definition
  FROM pg_proc p
  JOIN pg_type t
    ON p.prorettype = t.oid
  LEFT OUTER
  JOIN pg_description d
    ON p.oid = d.objoid
  LEFT OUTER
  JOIN pg_namespace n
    ON n.oid = p.pronamespace
 WHERE NOT p.proisagg
   AND n.nspname~'<$SCHEMA_NAME_PATTERN>'
   AND proname~'<$FUNCTION_NAME_PATTERN>'

pg_get_functiondef () ดูเหมือนจะไม่จัดการกับฟังก์ชันการรวมที่ผู้ใช้กำหนด เมื่อฉันได้รับข้อผิดพลาด: "ฮิสโตแกรม" เป็นฟังก์ชันรวมเมื่อฉันค้นหา UDA
Tim Child

3
[42809] ข้อผิดพลาด: "array_agg" เป็นฟังก์ชันรวม
Daniel L. VanDenBosch

1
@ DanielL.VanDenBosch แก้ไขแล้ว (เพื่อไม่รวมฟังก์ชันรวม)
msciwoj

คุณช่วยชีวิตฉันไว้ ... pg_get_functiondef () สามารถใช้เพื่อค้นหา procs ด้วยคำเฉพาะในคำจำกัดความpg_get_functiondef(p.oid) ilike '%indicator_loss%'
Zero

0

คุณยังสามารถรับ phpPgAdmin ได้หากคุณกำหนดค่าไว้ในระบบของคุณ

ขั้นตอนที่ 1: เลือกฐานข้อมูลของคุณ

ขั้นตอนที่ 2: คลิกที่ปุ่มค้นหา

ขั้นตอนที่ 3: เปลี่ยนตัวเลือกการค้นหาเป็นฟังก์ชันจากนั้นคลิกที่ค้นหา

คุณจะได้รับรายการฟังก์ชันที่กำหนดไว้คุณสามารถค้นหาฟังก์ชันตามชื่อได้เช่นกันหวังว่าคำตอบนี้จะช่วยผู้อื่นได้


-1

หากต้องการดูรหัสทั้งหมด (แบบสอบถาม) ที่เขียนในขั้นตอน / ฟังก์ชันที่จัดเก็บไว้ให้ใช้คำสั่งด้านล่าง:

sp_helptext procedure/function_name

สำหรับชื่อฟังก์ชันและชื่อกระบวนงานอย่าเพิ่มคำนำหน้า 'dbo' หรือ 'sys.'

อย่าเพิ่มวงเล็บที่ส่วนท้ายของขั้นตอนหรือชื่อฟังก์ชันและอย่าส่งผ่านพารามิเตอร์

ใช้คำสำคัญ sp_helptext จากนั้นส่งผ่านขั้นตอน / ชื่อฟังก์ชัน

ใช้คำสั่งด้านล่างเพื่อดูโค้ดทั้งหมดที่เขียนขึ้นสำหรับ Procedure:

sp_helptext ProcedureName

ใช้คำสั่งด้านล่างเพื่อดูโค้ดทั้งหมดที่เขียนขึ้นสำหรับฟังก์ชัน:

sp_helptext FunctionName

ไม่มีsp_helptextใน postgresql
GSerg

-2

โดยปกติแล้วคุณจะใช้แอปพลิเคชันตัวจัดการฐานข้อมูลเช่นpgAdminเรียกดูวัตถุที่คุณสนใจและคลิกขวาเพื่อไปที่ "script as create" หรือสิ่งที่คล้ายกัน

คุณกำลังพยายามทำสิ่งนี้ ... โดยไม่มีแอปการจัดการหรือไม่?


2
เพียงแค่บรรทัดคำสั่ง - ไม่มีแอปการจัดการ ถ้า pgAdmin สามารถทำได้ต้องใช้คำสั่งบางอย่าง - ฉันไม่พบเอกสารใด ๆ เกี่ยวกับเรื่องนี้ ฉันกำลังดูตาราง pg_ * แต่ดูเหมือนจะไม่มีใครโดดเด่น
darren

ดีใจที่คุณพบคำตอบ แต่ไม่แน่ใจว่าทำไมคุณถึงทำให้ชีวิตตัวเองลำบาก! ทำไมไม่ติดตั้ง pgAdmin?
annakata

7
เมื่อเชื่อมต่อกับฐานข้อมูลจากระยะไกลในเซสชัน ssh มันไม่ใช่เรื่องง่ายที่จะเรียกใช้แอปการจัดการ
jutky
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.