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

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

1
สร้างข้อยกเว้นด้วยบริบท
เมื่อ PostgreSQL มีข้อผิดพลาดจะมีบรรทัด "CONTEXT" เช่น: ERROR: INSERT has more target COLUMNS than expressions LINE 3: ... ^ QUERY: INSERT INTO ... CONTEXT: PL/pgSQL FUNCTION "XXXXX" line 4 at SQL statement แต่เมื่อฉันโยนข้อยกเว้นบรรทัดนี้ไม่ได้มี ฉันไม่พบวิธีเพิ่ม RAISE EXCEPTION 'blablabla' USING HINT = 'blablablabla'; เป็นไปได้ไหมที่จะเพิ่มบรรทัดนี้ในข้อยกเว้นของฉัน?

3
จะเกิดอะไรขึ้นหากทั้งสองกระบวนการพยายามที่จะดูข้อมูลอ้างอิงใหม่อย่างต่อเนื่องในเวลาเดียวกัน
ตามเอกสาร: รีเฟรชมุมมองที่เป็นรูปธรรมอย่างไม่หยุดยั้งโดยไม่ล็อคออกพร้อมกันเลือกบนมุมมองที่ปรากฏ ( ... ) ... เนื้อหาอื่น ๆ ... แม้จะมีตัวเลือกนี้REFRESH ครั้งละหนึ่งอาจทำงานกับ มุมมองที่ปรากฏขึ้นใด ๆ ฉันมีฟังก์ชั่นที่ตรวจสอบเวลารีเฟรชครั้งล่าสุดสำหรับ VIEW MATERIALIZED และถ้าผ่านไป 60 วินาทีมันจะรีเฟรช อย่างไรก็ตามจะเกิดอะไรขึ้นหากฉันพยายามรีเฟรชมุมมองที่เป็นรูปธรรมจากกระบวนการที่แยกกันสองกระบวนการในเวลาเดียวกัน พวกเขาจะจัดคิวหรือจะเพิ่มข้อผิดพลาดหรือไม่ มีวิธีการตรวจจับหรือไม่เมื่อมุมมองแบบ MATERIALIZED กำลังถูกรีเฟรชและหลีกเลี่ยงการสัมผัส ขณะนี้ฉันได้ทำการเติมข้อมูลในตารางก่อนที่จะรีเฟรช (ตั้งค่าrefreshingเป็นtrue) จากนั้นตั้งค่าเป็นfalseเมื่อกระบวนการเสร็จสิ้น EXECUTE 'INSERT INTO refresh_status (last_update, refreshing) VALUES (clock_timestamp(), true) RETURNING id') INTO refresh_id; EXECUTE 'REFRESH MATERIALIZED VIEW CONCURRENTLY my_mat_view'; EXECUTE 'UPDATE refresh_status SET …

3
ค่าใช้จ่ายในขั้นตอนภาษา PostgreSQL (plpython / plsql / pllua …)
ฉันพยายามค้นหาข้อมูลเกี่ยวกับฟังก์ชั่นที่ผู้ใช้กำหนด PostgreSQL ในภาษาขั้นตอนการปฏิบัติงานตามเวลาจริง พวกเขาเปรียบเทียบกับฟังก์ชั่นในตัวอย่างไร มีความแตกต่างใด ๆ (ในค่าใช้จ่าย) วิธี Postgres เรียก / จัดการ plpython vs plpgsql vs pllua ฟังก์ชั่น (ฉันสนใจในด้านบูรณาการ Postgres / บริบท / การถ่ายโอนข้อมูลไม่ใช่ VM ตัวเอง)? บริบทเป็นค่าใช้จ่ายใหญ่หรือไม่ ฉันสามารถใช้มันสำหรับการจับคู่ข้อมูลแบบเรียลไทม์ (สมมุติว่า 1,000 ข้อความค้นหา) มีประโยชน์ในการเขียนฟังก์ชั่นที่ผู้ใช้กำหนดใน plpgsql แล้ว pg / ภาษาอื่น ๆ ? ในเอกสารพวกเขาระบุข้อได้เปรียบ แต่ฉันคิดว่าพวกเขาใช้กับภาษาขั้นตอน postgresql ทั้งหมด ผลการวิจัยที่เกี่ยวข้อง: ความเร็วของภาษา PL สำหรับการใช้งานที่ผิดปกติ ประสิทธิภาพการทำงานของภาษา PostgreSQL: C …

2
วิธีรับบริบทข้อยกเว้นสำหรับข้อยกเว้นที่ยกขึ้นด้วยตนเองใน PL / pgSQL
ใน Postgres เราได้รับ "การติดตามสแต็ก" ของข้อยกเว้นโดยใช้รหัสนี้: EXCEPTION WHEN others THEN GET STACKED DIAGNOSTICS v_error_stack = PG_EXCEPTION_CONTEXT; มันใช้งานได้ดีสำหรับข้อยกเว้น "ธรรมชาติ" แต่ถ้าเราใช้ข้อยกเว้น RAISE EXCEPTION 'This is an error!'; ... จากนั้นไม่มีการติดตามสแต็ก ตามรายการส่งเมล์นี่อาจเป็นการจงใจแม้ว่าฉันจะทำไม่ได้สำหรับชีวิตของฉันก็หาสาเหตุ มันทำให้ผมอยากจะคิดหาวิธีอื่นที่จะโยนยกเว้นอื่น ๆ RAISEกว่าการใช้ ฉันเพิ่งจะเห็นบางสิ่งบางอย่างที่ชัดเจนหรือไม่? ไม่มีใครมีเคล็ดลับสำหรับเรื่องนี้? มีข้อยกเว้นที่ฉันสามารถให้ Postgres ขว้างได้ซึ่งจะมีสตริงที่ฉันเลือกไว้ดังนั้นฉันจะได้รับไม่เพียง แต่สตริงของฉันในข้อความแสดงข้อผิดพลาด แต่การติดตามสแต็กเต็มเช่นกัน? นี่คือตัวอย่างเต็มรูปแบบ: CREATE OR REPLACE FUNCTION error_test() RETURNS json AS $$ DECLARE v_error_stack text; …

1
ข้อผิดพลาด: ฟังก์ชัน set_valued เรียกในบริบทที่ไม่สามารถยอมรับชุดได้ มันเกี่ยวกับอะไร?
ฉันใช้ Postgresql 9.1 กับ Ubuntu 12.04 ได้รับแรงบันดาลใจจากคำตอบของ Craig ต่อคำถามของฉันการเรียง setof หรือ setof recordฉันคิดว่าฉันจะใช้return queryงานได้setof recordดีและเป็นตัวสร้างซีรีส์ในฟังก์ชั่น plpgsql นี้: create or replace function compute_all_pair_by_craig(id_obj bigint) returns setof record as $$ begin return query select o.id, generate_series(0,o.value) from m_obj as o; end; $$ language plpgsql; ในระหว่างการดำเนินการฉันได้รับข้อผิดพลาด: ERROR: set_valued function called in context that …

2
ส่งคืนระเบียนด้วยฟังก์ชัน PL / pgSQL - เพื่อเพิ่มความเร็วในการสืบค้น
ฉันมีดีมอนที่ไม่ใช่ forking เขียนใน Perlซึ่งใช้การสอบถาม acync เพื่อเขียนสถิติผู้เล่นลงในฐานข้อมูล PostgreSQL 9.3 แต่เมื่อฉันต้องการอ่านบางสิ่งจากฐานข้อมูล (เช่นถ้าผู้เล่นถูกแบนหรือหากผู้เล่นมีสถานะวีไอพี) จากนั้นฉันจะใช้แบบสอบถามแบบซิงโครนัส สิ่งนี้ทำให้เกมหยุดชั่วขณะหนึ่งจนกว่าจะอ่านค่าจากฐานข้อมูล ฉันไม่สามารถเขียน daemon เกมของฉันใหม่เพื่อใช้การสืบค้นแบบ async สำหรับการอ่านค่า (ฉันพยายาม แต่มันต้องมีการเปลี่ยนแปลงมากเกินไป) ดังนั้นคำถามของฉันคือ : มันจะเป็นการรวมเข้ากับแบบสอบถามที่ไม่เกี่ยวข้องหลายรายการหรือไม่ เชื่อมต่อ) ถึง 1 ขั้นตอนและฉันจะคืนค่าหลายค่าในเวลาเดียวกันไปยังโปรแกรม Perl ของฉันได้อย่างไร ข้อความค้นหาปัจจุบันของฉันทั้งหมดใช้รหัสผู้เล่นเป็นพารามิเตอร์และส่งกลับค่า 1: -- Has the player been banned? select true from pref_ban where id=? -- What is the reputation of this player? …

2
แปลงหน่วยของการวัด
กำลังมองหาการคำนวณหน่วยการวัดที่เหมาะสมที่สุดสำหรับรายการของสารที่ให้สารในปริมาณหน่วยที่แตกต่างกัน (แต่เข้ากันได้) ตารางการแปลงหน่วย ตารางแปลงหน่วยจัดเก็บหน่วยต่าง ๆ และความเกี่ยวข้องของหน่วยเหล่านั้น: id unit coefficient parent_id 36 "microlitre" 0.0000000010000000000000000 37 37 "millilitre" 0.0000010000000000000000000 5 5 "centilitre" 0.0000100000000000000000000 18 18 "decilitre" 0.0001000000000000000000000 34 34 "litre" 0.0010000000000000000000000 19 19 "dekalitre" 0.0100000000000000000000000 29 29 "hectolitre" 0.1000000000000000000000000 33 33 "kilolitre" 1.0000000000000000000000000 35 35 "megalitre" 1000.0000000000000000000000 0 การเรียงลำดับตามค่าสัมประสิทธิ์แสดงให้เห็นว่าการparent_idเชื่อมโยงหน่วยรองกับตัวเลขที่เหนือกว่า ตารางนี้สามารถสร้างได้ใน PostgreSQL โดยใช้: …

3
ฉันจะทราบได้อย่างไรว่าตารางมีอยู่ใน search_path ปัจจุบันด้วย PLPGSQL หรือไม่
ฉันกำลังเขียนสคริปต์การตั้งค่าสำหรับแอปพลิเคชันที่เป็น addon สำหรับแอปพลิเคชันอื่นดังนั้นฉันต้องการตรวจสอบว่ามีตารางสำหรับแอปพลิเคชันอื่นอยู่หรือไม่ ถ้าไม่ฉันต้องการให้ข้อผิดพลาดที่เป็นประโยชน์แก่ผู้ใช้ อย่างไรก็ตามฉันไม่ทราบว่าสคีมาใดที่จะถือตาราง DO LANGUAGE plpgsql $$ BEGIN PERFORM 1 FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE n.nspname = current_setting('search_path') AND c.relname = 'foo' AND c.relkind = 'r'; -- not sure if I actually need this or not... IF NOT FOUND THEN RAISE 'This …

2
COMMIT ทำงานภายในฟังก์ชัน plgpsql แบบไม่ระบุชื่อใน PostgreSQL 9.5 หรือไม่
$do$ฉันกำลังนำเข้าเป็นจำนวนมากของไฟล์ขนาดใหญ่เป็นจำนวนของตารางการแบ่งพาร์ติชันโดยใช้ลูปภายในการป้องกันรหัส plpgsql ที่ไม่ระบุชื่อ $do$ BEGIN FOR yyyy in 2012..2016 THEN EXECUTE $$COPY table$$||yyyy||$$ FROM 'E:\data\file$$||yyyy||$$.csv DELIMITER ',' CSV;$$; END LOOP; END; $do$ LANGUAGE plpgsql กระบวนการทั้งหมดนี้ควรใช้เวลาประมาณ 15 ชั่วโมงและฉันหวังว่าการนำเข้าทั้งหมดจะไม่ถูกย้อนกลับหากมีข้อผิดพลาดในการนำเข้าในบางจุด IIRC COMMITไม่ทำงานภายในฟังก์ชั่นที่จัดเก็บ bc ฟังก์ชั่นทั้งหมดจะถือว่าเป็นธุรกรรมเดียว จากเอกสารสำหรับ$do$ บล็อกโค้ดจะได้รับการปฏิบัติเสมือนเป็นส่วนหนึ่งของฟังก์ชันที่ไม่มีพารามิเตอร์ส่งคืนโมฆะ มันถูกแยกวิเคราะห์และดำเนินการในครั้งเดียว ฉันสมมติว่านี่หมายความว่าทั้งหมด$do$เป็นธุรกรรมเดียวดังนั้นการกระทำภายในบล็อกจะไม่ทำงาน ฉันถูกไหม?
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.