คำถามติดแท็ก plpgsql

PL / pgSQL เป็นภาษาโพรซีเดอร์เริ่มต้นสำหรับระบบฐานข้อมูล PostgreSQL คำถามเกี่ยวกับ PL / pgSQL ควรจะติดแท็ก "PostgreSQL" ด้วย

2
สร้างดัชนีหากไม่มีอยู่
ฉันกำลังทำงานกับฟังก์ชั่นที่อนุญาตให้ฉันเพิ่มดัชนีหากไม่มีอยู่ ฉันพบปัญหาที่ฉันไม่สามารถรับรายการดัชนีเพื่อเปรียบเทียบได้ ความคิดใด ๆ นี่เป็นปัญหาที่คล้ายคลึงกับการสร้างคอลัมน์ที่แก้ไขด้วยรหัสนี้: https://stackoverflow.com/a/12603892/368511

4
ฟังก์ชั่นประสิทธิภาพ
มาจากพื้นหลังของ MySQL ที่ประสิทธิภาพของขั้นตอนการจัดเก็บ(บทความเก่า)และการใช้งานเป็นที่น่าสงสัยฉันกำลังประเมิน PostgreSQL สำหรับผลิตภัณฑ์ใหม่สำหรับ บริษัท ของฉัน หนึ่งในสิ่งที่ฉันอยากทำคือย้ายบางส่วนของตรรกะแอปพลิเคชันลงในกระบวนงานที่เก็บไว้ดังนั้นฉันจึงขอ DOs และ DON'Ts (แนวทางปฏิบัติที่ดีที่สุด) เกี่ยวกับการใช้ฟังก์ชันใน PostgreSQL (9.0) โดยเฉพาะเกี่ยวกับประสิทธิภาพการทำงานผิดพลาด

3
วิธีการใช้ UPSERT ใน PostgreSQL
ฉันได้อ่านเกี่ยวกับUPSERTการใช้งานที่แตกต่างกันใน PostgreSQL แต่โซลูชันเหล่านี้ทั้งหมดค่อนข้างเก่าหรือค่อนข้างแปลกใหม่ (โดยใช้CTE ที่เขียนได้ ) และฉันก็ไม่ใช่ผู้เชี่ยวชาญ psql เลยที่จะรู้ได้ทันทีว่าโซลูชันเหล่านี้เก่าหรือไม่เพราะพวกเขาได้รับการแนะนำอย่างดีหรือพวกเขา (ดีเกือบทั้งหมดเป็น) เพียงตัวอย่างของเล่นที่ไม่เหมาะสมกับการใช้งานจริง อะไรคือวิธีที่ปลอดภัยที่สุดในการใช้ UPSERT ใน PostgreSQL

5
วิธีแทรกข้อมูล (ไฟล์) ลงในคอลัมน์ PostgreSQL bytea ได้อย่างไร
คำถามนี้ไม่เกี่ยวกับ bytea v. oid v. blobs v. วัตถุขนาดใหญ่ ฯลฯ ฉันมีตารางที่ประกอบด้วยintegerเขตข้อมูลคีย์หลักและbyteaเขตข้อมูล ฉันต้องการป้อนข้อมูลลงในbyteaช่อง สิ่งนี้สามารถสันนิษฐานได้ว่าทำได้ด้วยPL/ภาษาใดภาษาหนึ่งและฉันอาจจะลองทำสิ่งนี้PL/Pythonในอนาคต ขณะที่ฉันยังคงทดสอบและทดลองใช้ฉันต้องการแทรกข้อมูลจากไฟล์ (บนเซิร์ฟเวอร์) โดยใช้คำสั่ง SQL "มาตรฐาน" ฉันทราบว่าผู้ดูแลระบบที่มีสิทธิ์เขียนบนเซิร์ฟเวอร์เท่านั้นที่จะสามารถแทรกข้อมูลในแบบที่ฉันต้องการ ฉันไม่ได้กังวลเกี่ยวกับเรื่องนี้ในขณะนี้เนื่องจากผู้ใช้จะไม่สามารถแทรกbyteaข้อมูลในปัจจุบัน ฉันได้ค้นหาไซต์ StackExchange ต่างๆ, คลังข้อมูล PostgreSQL และอินเทอร์เน็ตโดยทั่วไปแล้ว แต่ไม่สามารถหาคำตอบได้ แก้ไข: นี้การอภิปรายจาก 2008 แสดงให้เห็นว่าสิ่งที่ฉันต้องการจะทำคือไปไม่ได้ มีการbyteaใช้ฟิลด์อย่างไร แก้ไข: คำถามที่คล้ายกันนี้จากปี 2005 ยังไม่มีคำตอบ แก้ไขได้:รายละเอียดที่ให้ไว้ที่นี่ในpsycopgเว็บไซต์เป็นพื้นฐานสำหรับการแก้ปัญหาที่ฉันเขียนใน Python มันก็อาจจะเป็นไปได้ที่จะใส่ข้อมูลไบนารีเป็นคอลัมน์ที่ใช้bytea PL/Pythonฉันไม่ทราบว่าสิ่งนี้เป็นไปได้โดยใช้ "บริสุทธิ์" SQL

6
อะไรคือความแตกต่างระหว่าง“ ขั้นตอนการจัดเก็บ” และ“ ฟังก์ชั่นที่จัดเก็บ”?
ดังนั้นความคิดเห็นจากคำถามนี้กล่าวว่ามีความแตกต่างกันเล็กน้อยใน "วิธีการจัดเก็บ" และ "จัดเก็บ funtions" ใน PostgreSQL ความคิดเห็นเชื่อมโยงไปยังบทความวิกิพีเดียแต่บางส่วนดูเหมือนจะไม่นำไปใช้ (เช่นสามารถนำไปใช้ในการSELECTแถลง) ไวยากรณ์ตัวเองดูเหมือนจะสับสนนิด ๆ หน่อย ๆ : CREATE FUNCTION emp_stamp() RETURNS trigger AS $emp_stamp$ BEGIN [...] END; $emp_stamp$ LANGUAGE plpgsql; CREATE TRIGGER emp_stamp BEFORE INSERT OR UPDATE ON emp FOR EACH ROW EXECUTE PROCEDURE emp_stamp(); คุณสามารถสร้างแต่หมายถึงว่ามันเป็นFUNCTIONPROCEDURE ดังนั้นความแตกต่างระหว่างสองสิ่งนี้คืออะไร?

1
การฉีด SQL ในฟังก์ชัน Postgres กับเคียวรีที่เตรียมไว้
ใน Postgres แบบสอบถามที่เตรียมไว้และฟังก์ชั่นที่ผู้ใช้กำหนดเองนั้นเทียบเท่ากับกลไกในการป้องกันการฉีด SQLหรือไม่ มีข้อดีโดยเฉพาะอย่างยิ่งในแนวทางหนึ่งมากกว่าอีกวิธีหนึ่งหรือไม่?

1
ฟังก์ชัน Postgres จะกำหนดผลลัพธ์ของแบบสอบถามให้กับตัวแปรหลายตัว
ฉันต้องการกำหนดค่าให้กับตัวแปร 2 ตัวดังต่อไปนี้ในฟังก์ชัน Postgres a := select col1 from tbl where ... b := select col2 from tbl where ... ฉันจะกำหนด 2 ค่าให้กับ 2 ตัวแปรในคำสั่งหนึ่งบรรทัดได้อย่างไร ชอบ a,b := select col1,col2 from tbl where ...

1
มีวิธีที่ดีในการเรียกใช้ทริกเกอร์สำหรับแต่ละระเบียนในตาราง postgres หรือไม่?
ฉันมีระบบที่ฉันไม่สามารถควบคุมการออกแบบของบางตาราง (ทำซ้ำผ่าน Slony-I) และดังนั้นฉันจึงมีชุดของสิ่งที่เราอ้างถึงเป็น 'shadow tables' ซึ่งฉันดึงข้อมูลบางส่วนออกจากตารางที่จำลองแบบแล้ว และเก็บไว้ในแบบฟอร์มการประมวลผลที่ฉันต้องการในขณะที่แยกระเบียนที่ฉันต้องการละเว้น ตอนนี้หลังจากตั้งค่าแบบจำลองใหม่ฉันเรียกใช้การอัปเดตและตั้งค่ากลับเป็นของตัวเอง (เช่นUPDATE tablename SET field=field) เพื่อบังคับให้ทริกเกอร์ทำงาน แต่ตารางบางตารางมีระเบียนนับล้านและเติบโตและใช้เวลา 30 นาที . (แล้วมีวัคซีนด้วย) มีวิธีที่ดีกว่าในการทริกเกอร์มันหรือวิธีเขียนฟังก์ชั่นบางอย่างเพื่อให้ทำงานกับอินพุตที่ส่งผ่านหรือNEWขึ้นอยู่กับบริบทการโทร? ฉันลังเลที่จะเก็บฟังก์ชั่นที่แตกต่างกันสองอย่างเอาไว้เพราะฉันเห็นหลายครั้งที่มีการอัปเดต

2
ภาษาโพรซีเดอร์ PostgreSQL - ความแตกต่างระหว่าง PL / pgSQL และ SQL
ใครช่วยได้โปรดสรุปความแตกต่างระหว่าง: http://www.postgresql.org/docs/9.1/static/xfunc-sql.html และ http://www.postgresql.org/docs/9.1/static/plpgsql.html ? ประเด็นหลัก: ความแตกต่างทางแนวคิด ให้ครอบครัวที่มีปัญหาความสะดวกสบายในการใช้งาน ประเด็นทางการเมือง

2
เลื่อนระดับแผนแบบสอบถามของการเรียกใช้ฟังก์ชันที่เขียนใน plpgsql
มันเป็นไปได้เมื่อใช้pgadminหรือplsqlจะได้รับถือของแผนแบบสอบถามสำหรับคำสั่ง SQL ดำเนินการภายในU ser d efined ฉตื่นเต้น (UDF) EXPLAINโดยใช้ ดังนั้นฉันจะได้รับแผนแบบสอบถามสำหรับการร้องขอ UDF โดยเฉพาะได้อย่างไร ฉันเห็น UDF ที่แยกออกไปเป็นการดำเนินการเดียวF()ใน pgadmin ฉันดูเอกสารแล้ว แต่หาอะไรไม่เจอ ขณะนี้ฉันกำลังดึงคำแถลงและเรียกใช้ด้วยตนเอง แต่สิ่งนี้จะไม่ถูกตัดออกไปสำหรับข้อความค้นหาขนาดใหญ่ ตัวอย่างเช่นพิจารณา UDF ด้านล่าง UDF นี้แม้ว่ามันจะมีความสามารถในการพิมพ์สตริงการสืบค้นของมันจะไม่ทำงานกับการคัดลอกวางเพราะมันมีตารางชั่วคราวที่สร้างขึ้นในท้องถิ่นซึ่งไม่มีอยู่เมื่อคุณวางและดำเนินการ CREATE OR REPLACE FUNCTION get_paginated_search_results( forum_id_ INTEGER, query_ CHARACTER VARYING, from_date_ TIMESTAMP WITHOUT TIME ZONE DEFAULT NULL, to_date_ TIMESTAMP WITHOUT TIME ZONE DEFAULT NULL, in_categories_ …

1
อธิบายการวิเคราะห์ไม่แสดงรายละเอียดของการสืบค้นภายในฟังก์ชั่น plpgsql
ฉันใช้ฟังก์ชั่น PL / pgSQL ใน PostgreSQL 9.3 พร้อมกับคำสั่งที่ซับซ้อนหลายอย่างภายใน create function f1() returns integer as $$ declare event tablename%ROWTYPE; .... .... begin FOR event IN SELECT * FROM tablename WHERE condition LOOP EXECUTE 'SELECT f2(event.columnname)' INTO dummy_return; END LOOP; ... INSERT INTO ... FROM a LEFT JOIN b ... LEFT JOIN …

2
ทริกเกอร์: ย้ายแถวที่ถูกลบไปยังตารางเก็บถาวร
ฉันมีตารางเล็ก ๆ (~ 10 แถว) ที่เรียกว่าrestrictionsในฐานข้อมูล PostgreSQL ของฉันซึ่งค่าจะถูกลบและแทรกทุกวัน ฉันต้องการเรียกตารางrestrictions_deletedที่ซึ่งทุกแถวที่ถูกลบrestrictionsจะถูกเก็บไว้โดยอัตโนมัติ เนื่องจากrestrictionsมีรหัสซีเรียลจะไม่มีการทำซ้ำ ฉันจะเขียนทริกเกอร์ใน PostgreSQL ได้อย่างไร

1
การตั้งชื่อความขัดแย้งระหว่างฟังก์ชั่นพารามิเตอร์และผลลัพธ์ของการเข้าร่วมกับการใช้ข้อ
รับการตั้งค่านี้ใน Postgres ปัจจุบัน 9.4 ( จากคำถามที่เกี่ยวข้อง ): CREATE TABLE foo (ts, foo) AS VALUES (1, 'A') -- int, text , (7, 'B'); CREATE TABLE bar (ts, bar) AS VALUES (3, 'C') , (5, 'D') , (9, 'E'); นอกจากนี้ยังมีซอ Fiddleจากคำถามก่อนหน้านี้ ฉันเขียนSELECTด้วยFULL JOINเพื่อให้บรรลุวัตถุประสงค์ของคำถามอ้างอิง ย่อ: SELECT ts, f.foo, b.bar FROM foo f FULL …

2
มีวิธีง่ายๆใน PL / pgSQL เพื่อตรวจสอบว่าแบบสอบถามไม่ส่งคืนผลลัพธ์หรือไม่?
ฉันกำลังทดลองกับ PL / pgSQL เล็กน้อยและต้องการทราบว่ามีวิธีที่สง่างามกว่านี้ในการทำสิ่งนี้หรือไม่: select c.data into data from doc c where c.doc_id = id and c.group_cur > group_cur order by c.id desc limit 1; EXCEPTION WHEN NO_DATA_FOUND THEN select c.data into data from doc c where c.doc_id = id and c.global_cur > global_cur order by c.id desc limit …

3
ฉันจะคืนค่าเรคคอร์ดหลายแถวใน PL / pgSQL ได้อย่างไร
ฉันกำลังพยายามส่งคืนหลายระเบียนโดยใช้ชนิดข้อมูล RECORD มีวิธีที่ฉันสามารถผนวกเข้ากับ RECORD และเพิ่ม / ผนวกค่าใหม่ด้วยการวนซ้ำแต่ละครั้งในการบันทึกนี้ นั่นคือฉันต้องการผนวกrecเพื่อที่recจะกลายเป็นชุดของแถวเมื่อวนซ้ำซึ่งฉันสามารถกลับมาที่ส่วนท้ายของฟังก์ชั่นของฉัน ขณะนี้ฉันกำลังทำสิ่งนี้ - SELECT temp_table.col1, temp_table.col2, temp_table.col3 INTO rec FROM temp_table WHERE temp_table.col3 = false; รหัสเต็มของฉันอยู่ที่นี่: CREATE OR REPLACE FUNCTION validation() RETURNS RECORD AS $$ DECLARE rec RECORD; temp_row RECORD; BEGIN CREATE TEMPORARY TABLE temp_table (col1 TEXT, col2 INTEGER, col3 BOOLEAN) ON COMMIT …

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