ฟังก์ชันและตัวดำเนินการที่จำลองชุดย่อยของฟังก์ชันและแพ็กเกจจาก Oracle RDBMS
มีกลุ่ม Google ที่เกี่ยวข้อง - https://groups.google.com/forum/?hl=th#!forum/orafce-general
Orafce ได้รับการรองรับใน AWS Aurora ที่มีความเข้ากันได้กับ PostgreSQL และใน Azure Database สำหรับ PostgreSQL
โมดูลนี้มีฟังก์ชันที่เป็นประโยชน์บางอย่างที่สามารถช่วยในการย้ายแอปพลิเคชัน Oracle ไปยัง PostgreSQL หรือที่เป็นประโยชน์โดยทั่วไป
ฟังก์ชันวันที่ของ Oracle ในตัวได้รับการทดสอบกับ Oracle 10 เพื่อความสอดคล้อง ช่วงวันที่ตั้งแต่ 1960 ถึง 2070 ทำงานได้อย่างถูกต้อง วันที่ก่อน 1582-10-05 ด้วยรูปแบบ 'J' และก่อน 1100-03-01 ด้วยรูปแบบอื่นไม่สามารถตรวจสอบได้เนื่องจากข้อบกพร่องใน Oracle
ฟังก์ชั่นทั้งหมดเข้ากันได้กับ Oracle โดยสมบูรณ์ และเคารพสตริงรูปแบบที่รู้จักทั้งหมด คำอธิบายโดยละเอียดสามารถพบได้บนอินเทอร์เน็ต ใช้คำหลักเช่น: oracle round trunc date iyyy
เย้ YY YYY YYYY SYYY SYEAR ปี I,IY,IYY,IYYY ปี ISO ถามไตรมาส สัปดาห์ WW วันเป็นวันแรกของปี สัปดาห์ IW เริ่มวันจันทร์ W สัปดาห์ ให้วันเป็นวันแรกของเดือน DAY,DY,D วันแรกของสัปดาห์ วันอาทิตย์ เดือน, จันทร์, ดด, RM เดือน ซีซี, ศตวรรษ SCC ดีดีดีดีดีเจเดย์ ฮฮ,HH12,HH24 ชั่วโมง มิชิแกน นาที
ฟังก์ชั่นปัดเศษขึ้น คือวันที่ 1 กรกฎาคม จะปัดให้เป็นปีถัดไป วันที่ 16 กรกฎาคม จะถูกปัดเศษเป็นเดือนสิงหาคม
add_months(date, integer) date - ส่งกลับวันที่บวก n เดือน
add_months(วันที่ '2548-05-31',1) -> 30-06-2548
Last_date(date) date - ส่งกลับวันสุดท้ายของเดือนตามค่าวันที่
Last_day(วันที่ '24-05-2548') -> 31-05-2548
next_day(date, text) date - ส่งกลับวันในสัปดาห์แรกที่มากกว่าค่าวันที่
next_day(วันที่ '24-05-2548', 'วันจันทร์') -> 30-05-2548
next_day(date, integer) date - เหมือนข้างบน อาร์กิวเมนต์ที่สองควรเป็น 1..7 และตีความว่าเป็น Sunday..Satday
next_day(วันที่ '24-05-2548', 1) -> 30-05-2548
months_between(date, date) numeric - ส่งกลับจำนวนเดือนระหว่างวันที่ 1 ถึง date2 หากมีการคำนวณเดือนที่เป็นเศษส่วน ฟังก์ชัน months_between จะคำนวณเศษส่วนตามเดือนที่มี 31 วัน
months_between(วันที่ '1995-02-02', วันที่ '1995-01-01') -> 1.0322580645161
ตัดวันที่ (วันที่, ข้อความ) - ตัดวันที่ตามรูปแบบที่ระบุ
ตัด (วันที่ '2548-07-12', 'iw') -> 2548-07-11
รอบ(วันที่, ข้อความ) วันที่ - จะปัดเศษวันที่ตามรูปแบบที่ระบุ
รอบ(วันที่ '2548-07-12', 'yyyy') -> 2549-01-01
to_date(text) timestamp - จะพิมพ์ข้อความที่ป้อนลงประทับเวลา GUC orafce.nls_date_format ใช้เพื่อระบุรูปแบบข้อความอินพุตสำหรับฟังก์ชันนี้ หากค่าเว้นว่างไว้หรือตั้งเป็น DEFAULT ให้ป้อนรูปแบบข้อความตามการตั้งค่า datestyle GUC ของ PostgreSQL
orafce.nls_date_format ค่าเป็น DEFAULT
to_date('2014-05-19 17:23:53+5:30') -> 2014-05-19 17:23:53
orafce.nls_date_format='ปปปป-MMDD HH24:MI:SS'
to_date('2014-0519 17:23:53+5:30') -> 2014-05-19 17:23:53
to_date(text, text) timestamp - จะพิมพ์ข้อความอินพุตตามรูปแบบที่ระบุเพื่อประทับเวลา GUC orafce.orafce_emit_error_on_date_bug
ใช้เพื่อระบุว่ามีการรายงานข้อผิดพลาดเมื่อค่าวันที่ตรงกับจุดบกพร่องของ Oracle ในวันที่ ข้อบกพร่องนี้ปรากฏขึ้นพร้อมกับวันที่ก่อน 1582-10-05
เมื่อใช้รูปแบบ 'J'
( 'J2299159'
) และก่อน 1100-03-01
เมื่อใช้รูปแบบอื่น มีการรายงานข้อผิดพลาดตามค่าเริ่มต้น หากต้องการปิดใช้งานพฤติกรรมนี้ set orafce.orafce_emit_error_on_date_bug to off
SELECT oracle.to_date('112012', 'J'); ข้อผิดพลาด: ไม่สามารถตรวจสอบวันที่ก่อน 1582-10-05 ('J2299159') ได้เนื่องจากข้อบกพร่องใน Oracle SELECT oracle.to_date('1003-03-15', 'yyyy-mm-dd'); ข้อผิดพลาด: ไม่สามารถตรวจสอบวันที่ก่อน 1100-03-01 ได้เนื่องจากข้อบกพร่องใน Oracle SET orafce.oracle_compatibility_date_limit เป็นปิด; SELECT oracle.to_date('112012', 'J'); ถึง_เดท - 4407-07-30 00:00:00 ก่อนคริสต์ศักราช (1 แถว) SELECT oracle.to_date('1003/03/15', 'yyyy/mm/dd'); ถึง_เดท - 1003-03-15 00:00:00 (1 แถว)
โมดูลนี้ประกอบด้วยการใช้งานประเภทข้อมูล DATE ที่เข้ากันได้กับ Oracle "oracle.date" และฟังก์ชันที่ใช้ประเภทข้อมูล DATE เช่น oracle.add_months,oracle.last_day(),oracle.next_day(),oracle.months_between() ฯลฯ
ตัวอย่าง:
ตั้งค่า search_path เป็น oracle, "$ user", สาธารณะ, pg_catalog; สร้างตาราง oracle_date (วันที่ col1); แทรกลงในค่า oracle_date('2014-06-24 12:12:11'::date); เลือก * จาก oracle_date; คอล1 - 2014-06-24 12:12:11 (1 แถว)
oracle.add_months(ประทับเวลาพร้อมโซนเวลา, จำนวนเต็ม) - ส่งกลับวันที่และเวลาบวก n เดือน
oracle.add_months(oracle.date'2005-05-31 10:12:12',1) -> 2005-06-30 10:12:12
oracle.last_day(การประทับเวลาพร้อมเขตเวลา) - ส่งคืนวันสุดท้ายของเดือนตามค่าวันที่
oracle.last_day(oracle.date '2005-05-24 11:12:12') -> 31-05-2548 11:12:12
oracle.next_day(การประทับเวลาพร้อมเขตเวลา ข้อความ) - ส่งกลับวันทำงานวันแรกที่มากกว่าค่าวันที่
oracle.next_day(oracle.date '2005-05-24 10:12:12', 'วันจันทร์') -> 30-05-2548 10:12:12
oracle.next_day(ประทับเวลาพร้อมเขตเวลา, จำนวนเต็ม) - เหมือนข้างบน อาร์กิวเมนต์ที่สองควรเป็น 1..7 และตีความว่าเป็น Sunday..Saturday
oracle.next_day(oracle.date '2005-05-24 11:21:12', 1) -> 2005-05-29 11:21:12
oracle.months_between(การประทับเวลาพร้อมโซนเวลา, การประทับเวลาพร้อมโซนเวลา) - ส่งกลับจำนวนเดือนระหว่าง timestamp1 และ timestamp2 หากมีการคำนวณเดือนที่เป็นเศษส่วน ฟังก์ชัน months_between จะคำนวณเศษส่วนตามเดือนที่มี 31 วัน
oracle.months_between(oracle.date '1995-02-02 10:00:00', oracle.date '1995-01-01 10:21:11') -> 1.03225806451613
oracle.to_date(ข้อความ,ข้อความ) - ส่งคืนการประทับเวลาโดยไม่มีเขตเวลา
oracle.to_date('02/16/09 04:12:12', 'MM/DD/YY HH24:MI:SS') -> 16-02-2552 04:12:12
oracle.to_date(ข้อความ) - ส่งคืน oracle.date
oracle.to_date('02/16/09 04:12:12') -> 2009-02-16 04:12:12
oracle.sysdate() - ส่งคืนการประทับเวลาคำสั่งที่เขตเวลาของเซิร์ฟเวอร์ (orafce.timezone)
oracle.sysdate() -> 2015-12-09 17:47:56
oracle.dbtimezone - ส่งคืนเขตเวลาของเซิร์ฟเวอร์ - จำลองผ่าน orafce.timezone
oracle.dbtimezone() -> GMT
oracle.sessiontimezone() - ส่งคืนเขตเวลาของเซสชัน - เขตเวลา PostgreSQL ปัจจุบัน
oracle.sessiontimezone() -> ยุโรป/ปราก
oracle.sys_extract_utc (การประทับเวลาพร้อมเขตเวลา) - ส่งคืนการประทับเวลาในเขตเวลา utc
oracle.sys_extract_utc (ปัจจุบัน_เวลาประทับ)
oracle.sys_extract_utc(oracle.date) - ส่งคืนการประทับเวลาในเขตเวลา utc เมื่อไม่ได้ระบุเขตเวลา จะใช้เขตเวลาเซสชัน (PostgreSQL ปัจจุบัน)
oracle.sys_extract_utc(oracle.date '2005-05-24 11:21:12', 1) -> 2005-05-24 09:21:12
oracle.to_char(timestamp) - ส่งคืนการประทับเวลาใน nls_date_format
orafce.nls_date_format='YY-MonDD HH24:MI:SS' oracle.to_char(to_date('14-Jan08 11:44:49+05:30')) -> 14-Jan08 11:44:49 orafce.nls_date_format='YY-MonDD HH24:MI:SS' oracle.to_char(oracle.to_date('21052014 12:13:44+05:30','DDMMYYYY HH24:MI:SS')) -> 14-พฤษภาคม 21 12:13:44
oracle.+(oracle.date,smallint) - ส่งคืน oracle.date
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') + 9::smallint -> 2014-07-11 10:08:55
oracle.+(oracle.date,integer) - ส่งคืน oracle.date
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') + 9::integer -> 2014-07-11 10:08:55
oracle.+(oracle.date,bigint) - ส่งคืน oracle.date
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') + 9::bigint -> 2014-07-11 10:08:55
oracle.+(oracle.date,ตัวเลข) - ส่งคืน oracle.date
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') + 9::numeric -> 2014-07-11 10:08:55
oracle.-(oracle.date,smallint) - ส่งคืน oracle.date
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') - 9::smallint -> 2014-06-23 10:08:55
oracle.-(oracle.date,integer) - ส่งคืน oracle.date
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') - 9::integer -> 2014-06-23 10:08:55
oracle.-(oracle.date,bigint) - ส่งคืน oracle.date
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') - 9::bigint -> 2014-06-23 10:08:55
oracle.-(oracle.date,ตัวเลข) - ส่งคืน oracle.date
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') - 9::numeric -> 2014-06-23 10:08:55
oracle.-(oracle.date,oracle.date) - ส่งกลับค่าความแม่นยำสองเท่า
oracle.to_date('2014-07-17 11:10:15', 'yyyy-mm-dd hh24:mi:ss') - oracle.to_date('2014-02-01 10:00:00', 'yyyy' -mm-dd hh24:mi:ss') -> 166.048785
คุณต้องตั้งค่า search_path เป็น oracle,"$user", public, pg_catalog เนื่องจากฟังก์ชันต่างๆ เช่น oracle.add_months,oracle.last_day,oracle.next_day,oracle.months_between ได้รับการติดตั้งเคียงข้างกันกับ pg_catalog.add_months,pg_catalog.last_day, pg_catalog.next_day,pg_catalog.months_between
PostgreSQL ไม่ต้องการตาราง 'dual' ของ Oracle แต่เนื่องจากผู้ใช้ Oracle มีการใช้งานอย่างหนาแน่น ตารางดังกล่าวจึงถูกเพิ่มเข้าไปใน orafce ตารางนี้อยู่ใน schema oracle
โดยปกติแล้วคุณต้องการอนุญาตการเข้าถึงอย่างไม่มีเงื่อนไข ดังนั้นคุณควรเพิ่มสคีมานี้ในการกำหนดค่า search_path
(เช่น search_path = 'oracle, pg_catalog, "$user", public'
ใน postgresql.conf
)
PostgreSQL ส่งข้อมูลไปยังไคลเอนต์ผ่าน RAISE NOTICE ออราเคิลใช้ dbms_output.put_line() สิ่งนี้ทำงานแตกต่างจาก RAISE NOTICE Oracle มีคิวเซสชัน put_line() เพิ่มบรรทัดในคิวและฟังก์ชัน get_line() อ่านจากคิว หากตั้งค่าแฟล็ก 'serveroutput' ไคลเอนต์จะอ่านคำสั่ง sql ทั้งหมด คุณสามารถใช้:
เลือก dbms_output.enable(); เลือก dbms_output.put_line('first_line'); เลือก dbms_output.put_line('next_line'); เลือก * จาก dbms_output.get_lines(0);
หรือ
เลือก dbms_output.enable(); เลือก dbms_output.serveroutput('t'); เลือก dbms_output.put_line('first_line');
แพ็คเกจนี้ประกอบด้วยฟังก์ชันต่อไปนี้: Enable(), Disable(), serveroutput(), put(), put_line(), new_line(), get_line(), get_lines() คิวแพ็กเกจถูกนำไปใช้ในหน่วยความจำภายในของเซสชัน
แพ็คเกจนี้อนุญาตให้โปรแกรม PL/pgSQL อ่านและเขียนไปยังไฟล์ใดๆ ที่สามารถเข้าถึงได้จากเซิร์ฟเวอร์ ทุกเซสชันสามารถเปิดไฟล์ได้สูงสุด 10 ไฟล์และขนาดบรรทัดสูงสุดคือ 32K แพ็คเกจนี้ประกอบด้วยฟังก์ชั่นดังต่อไปนี้:
utl_file.fclose(ไฟล์ utl_file.file_type) - ปิดไฟล์
utl_file.fclose_all() - ปิดไฟล์ทั้งหมด
utl_file.fcopy(src_location, src_filename, dest_location, dest_filename[, start_line][, end_line]) - คัดลอกไฟล์ข้อความ
utl_file.fflush(file utl_file.file_type) - ล้างข้อมูลทั้งหมดจากบัฟเฟอร์
utl_file.fgetattr(ตำแหน่ง, ชื่อไฟล์) - รับคุณสมบัติของไฟล์
utl_file.fopen (ข้อความตำแหน่ง, ข้อความชื่อไฟล์, ข้อความ file_mode [, maxlinesize int] [, ชื่อการเข้ารหัส]) utl_file.file_type - เปิดไฟล์
utl_file.fremove(ตำแหน่ง, ชื่อไฟล์) - ลบไฟล์
utl_file.frename(ตำแหน่ง, ชื่อไฟล์, dest_dir, dest_file[, เขียนทับ]) - เปลี่ยนชื่อไฟล์
utl_file.get_line(file utl_file.file_type) ข้อความ - อ่านหนึ่งบรรทัดจากไฟล์
utl_file.get_nextline(file utl_file.file_type) ข้อความ - อ่านหนึ่งบรรทัดจากไฟล์หรือส่งคืน NULL
utl_file.is_open(file utl_file.file_type) bool - คืนค่าเป็นจริงหากเปิดไฟล์
utl_file.new_line(file utl_file.file_type [,rows int]) - ใส่ตัวอักษรบรรทัดใหม่ลงในไฟล์
utl_file.put (ไฟล์ utl_file.file_type, ข้อความบัฟเฟอร์) - ใส่บัฟเฟอร์ให้กับไฟล์
utl_file.put_line (ไฟล์ utl_file.file_type, ข้อความบัฟเฟอร์) - ใส่บรรทัดลงในไฟล์
utl_file.putf(ไฟล์ utl_file.file_type, รูปแบบบัฟเฟอร์ [,arg1 text][,arg2 text][..][,arg5 text]) - ใส่ข้อความที่จัดรูปแบบลงในไฟล์
utl_file.tmpdir() - รับเส้นทางของไดเร็กทอรีชั่วคราว
เนื่องจาก PostgreSQL ไม่รองรับการโทรโดยการอ้างอิง บางฟังก์ชันจึงแตกต่างออกไปเล็กน้อย: fclose และ get_line
ประกาศ f utl_file.file_type; เริ่ม f := utl_file.fopen('/tmp', 'sample.txt', 'r'); <<อ่าน>> วนซ้ำ เริ่ม เพิ่มการแจ้งเตือน '%', utl_file.get_line(f); ข้อยกเว้น เมื่อ no_data_found แล้ว ออกจากการอ่าน; จบ; วงท้าย; ฉ := fclose(f); จบ;
หรือวินาที (พร้อมฟังก์ชันเฉพาะของ PostgreSQL get_nextline)
ประกาศ ฉ utl_file.file_type; ข้อความบรรทัด; เริ่ม f := utl_file.fopen('/tmp', 'sample.txt', 'r'); วนซ้ำ บรรทัด := utl_file.get_nextline(f); ออกเมื่อบรรทัดเป็น NULL; แจ้ง '%', บรรทัด; ข้อยกเว้น เมื่อคนอื่นแล้ว utl_file.fclose_all(); จบ;
ก่อนที่จะใช้แพ็คเกจคุณต้องตั้งค่าตาราง utl_file.utl_file_dir ประกอบด้วยไดเรกทอรีที่ได้รับอนุญาตทั้งหมดโดยไม่มีสัญลักษณ์ลงท้าย ('/' หรือ '') บนแพลตฟอร์ม WinNT เส้นทางจะต้องลงท้ายด้วยสัญลักษณ์ '' ทุกครั้ง
สามารถตั้งชื่อรายการไดเรกทอรีได้ (คอลัมน์ที่สองในตาราง utl_file.utl_file_dir
) พารามิเตอร์ location
อาจเป็นชื่อไดเร็กทอรีหรือเส้นทางพจนานุกรมก็ได้ ตำแหน่งจะถูกตีความและตรวจสอบเป็นชื่อไดเร็กทอรีก่อน หากไม่พบ (ในคอลัมน์ที่ 2) ตำแหน่งนั้นจะถูกตีความและทำเครื่องหมายว่าเป็นเส้นทาง
ฟังก์ชั่นจากแพ็คเกจ utl_file (สคีมาบน Postgres) จำเป็นต้องเข้าถึงตาราง utl_file.utl_file_dir ข้อเท็จจริงนี้สามารถใช้เพื่อควบคุมว่าผู้ใช้สามารถใช้ฟังก์ชันเหล่านี้ได้หรือไม่ การตั้งค่าเริ่มต้นคืออ่านสำหรับสาธารณะ INSERT, UPDATE สามารถทำได้เฉพาะผู้ใช้ที่มีสิทธิ์ (ผู้ใช้ขั้นสูง) ผู้ใช้ที่ไม่มีสิทธิ์จึงสามารถใช้ฟังก์ชันจากแพ็คเกจนี้ได้ แต่ไม่สามารถเปลี่ยนรายการไดเรกทอรีที่ปลอดภัยได้ (เนื้อหาของตาราง utl_file.utl_file_dir) เนื้อหาของตารางนี้สามารถมองเห็นได้สำหรับสาธารณะ (หรือควรมองเห็นได้สำหรับผู้ใช้ที่ใช้ฟังก์ชันจากแพ็คเกจนี้)
นี่คือการใช้งาน API ของ Oracle ของแพ็คเกจ DBMS_SQL
ไม่ได้รับประกันความเข้ากันได้อย่างสมบูรณ์ แต่ควรลดงานที่จำเป็นสำหรับการโยกย้ายที่ประสบความสำเร็จ
ข้อควรสนใจ: สถาปัตยกรรม PostgreSQL แตกต่างจากสถาปัตยกรรมของ Oracle PL/pgSQL ดำเนินการในบริบทเดียวกันกับกลไก SQL จึงไม่ใช่เหตุผลใดๆ ที่จะใช้รูปแบบของ Oracle เช่น การรวบรวมจำนวนมากและการวนซ้ำการรวบรวมใน Postgres เพื่อให้ได้ประสิทธิภาพที่ดี โค้ดนี้ได้รับการออกแบบมาเพื่อลดงานที่เกี่ยวข้องกับการย้ายแอปพลิเคชันบางตัวจาก Oracle ไปยัง Postgres และสามารถทำงานได้ดี แต่จะไม่มีข้อได้เปรียบด้านประสิทธิภาพใดๆ เมื่อเทียบกับการสร้างคำสั่ง PL/pgSQL การจำลอง API ของ Oracle มีหน่วยความจำและโอเวอร์เฮดของ CPU ซึ่งอาจมีความสำคัญกับข้อมูลที่ใหญ่กว่า
ส่วนขยายนี้ใช้ชุดย่อยของอินเทอร์เฟซ dbms_sql ของ Oracle เป้าหมายของส่วนขยายนี้ไม่ใช่ความเข้ากันได้กับ Oracle แต่ได้รับการออกแบบมาเพื่อลดการโยกย้ายแอปพลิเคชันของ Oracle ไปยัง Postgres ที่เกี่ยวข้องกับงานบางส่วน รองรับฟังก์ชัน DML แบบกลุ่มพื้นฐานบางอย่าง:
ทำ $$ ประกาศ ค. อินท์; อินท์[]; ข วาร์ชาร์[]; ตัวเลข CA[]; เริ่ม c := dbms_sql.open_cursor(); โทร dbms_sql.parse(c, 'ใส่ค่า foo(:a, :b, :c)'); ก := ARRAY[1, 2, 3, 4, 5]; b := ARRAY['อะฮอจ', 'นาซดาร์', 'บาซาร์']; แคลิฟอร์เนีย := ARRAY[3.14, 2.22, 3.8, 4]; โทร dbms_sql.bind_array(c, 'a', a, 2, 3); โทร dbms_sql.bind_array(c, 'b', b, 3, 4); โทร dbms_sql.bind_array(c, 'c', ca); แจ้ง 'แทรกแถว %d', dbms_sql.execute(c); จบ; - ทำ $$ ประกาศ ค. อินท์; อินท์[]; ข วาร์ชาร์[]; ตัวเลข CA[]; เริ่ม c := dbms_sql.open_cursor(); โทร dbms_sql.parse(c, 'เลือก i, ''Ahoj'' || i, i + 0.003 จาก Generate_series(1, 35) g(i)'); โทร dbms_sql.define_array(c, 1, a, 10, 1); โทร dbms_sql.define_array(c, 2, b, 10, 1); โทร dbms_sql.define_array(c, 3, ca, 10, 1); ดำเนินการ dbms_sql.execute (c); ในขณะที่ dbms_sql.fetch_rows(c) > 0 วนซ้ำ โทร dbms_sql.column_value (c, 1, a); โทร dbms_sql.column_value (c, 2, b); โทร dbms_sql.column_value(c, 3, ca); เพิ่มการแจ้งเตือน 'a = %', a; แจ้ง 'b = %', b; แจ้ง 'c = %', ca; วงท้าย; โทร dbms_sql.close_cursor(c); จบ; -
มีฟังก์ชัน dbms_sql.describe_columns_f
ซึ่งเหมือนกับโพรซีเดอร์ dbms_sql.describe_columns
โปรดทราบ รหัสประเภทเกี่ยวข้องกับระบบประเภท PostgreSQL ค่าจะไม่ถูกแปลงเป็นตัวเลขของ Oracle
ทำ $$ ประกาศ ค. อินท์; บันทึก; d dbms_sql.desc_rec; เริ่ม c := dbms_sql.open_cursor(); โทร dbms_sql.parse (c, 'เลือก * จาก pg_class'); r := dbms_sql.describe_columns(c); แจ้ง '%', r.col_cnt; foreach d ในอาร์เรย์ r.desc_t วนซ้ำ เพิ่มการแจ้งเตือน '% %', d.col_name, d.col_type::regtype; วงท้าย; โทร dbms_sql.close_cursor(c); จบ; - ทำ $$ ประกาศ ค. อินท์; n อินท์; d dbms_sql.desc_rec; ดา dbms_sql.desc_rec[]; เริ่ม c := dbms_sql.open_cursor(); โทร dbms_sql.parse (c, 'เลือก * จาก pg_class'); โทร dbms_sql.describe_columns(c, n, da); แจ้ง '%', n; foreach d ในอาร์เรย์ da วนซ้ำ เพิ่มการแจ้งเตือน '% %', d.col_name, d.col_type::regtype; วงท้าย; โทร dbms_sql.close_cursor(c); จบ; -
แพ็คเกจนี้เป็นการจำลองแพ็คเกจ dbms_pipe Oracle มันมีการสื่อสารระหว่างเซสชัน คุณสามารถส่งและอ่านข้อความใดก็ได้โดยมีหรือไม่ต้องรอ แสดงรายการไปป์ที่ใช้งานอยู่ ตั้งค่าไปป์เป็นแบบส่วนตัวหรือสาธารณะ และใช้ไปป์ที่ชัดเจนหรือโดยปริยาย
จำนวนท่อสูงสุดคือ 50
หน่วยความจำที่ใช้ร่วมกันใช้ในการส่งข้อความ
ตัวอย่างดังต่อไปนี้:
-- เซสชัน ก เลือก dbms_pipe.create_pipe('my_pipe',10,true); -- การสร้างไปป์ที่ชัดเจน เลือก dbms_pipe.pack_message('neco je jinak'); เลือก dbms_pipe.pack_message('อย่างอื่นเป็นอย่างอื่น'); เลือก dbms_pipe.send_message('my_pipe',20,0); -- เปลี่ยนขีดจำกัดแล้วส่งโดยไม่ต้องรอ เลือก * จาก dbms_pipe.db_pipes; - รายการท่อปัจจุบัน -- เซสชั่น B เลือก dbms_pipe.receive_message('my_pipe',1); -- รอสูงสุด 1 วินาทีสำหรับข้อความ เลือก dbms_pipe.next_item_type(); -- -> 11 ข้อความ เลือก dbms_pipe.unpack_message_text(); เลือก dbms_pipe.next_item_type(); -- -> 11 ข้อความ เลือก dbms_pipe.unpack_message_text(); เลือก dbms_pipe.next_item_type(); -- -> 0 ไม่มีรายการอีกต่อไป เลือก dbms_pipe.remove_pipe('my_pipe');
มีความแตกต่างบางประการเมื่อเทียบกับ Oracle อย่างไรก็ตาม:
ขีดจำกัดของไพพ์ไม่ใช่หน่วยไบต์ แต่เป็นองค์ประกอบในไพพ์
คุณสามารถส่งข้อความได้โดยไม่ต้องรอ
คุณสามารถส่งข้อความเปล่าได้
next_item_type รู้เกี่ยวกับ TIMESTAMP (ประเภท 13)
PostgreSQL ไม่ทราบเกี่ยวกับประเภท RAW ให้ใช้ bytea แทน
อีกวิธีหนึ่งในการสื่อสารระหว่างกระบวนการ
-- เซสชัน ก เลือก dbms_alert.register('boo'); เลือก * จาก dbms_alert.waitany(10); -- เซสชั่น B เลือก dbms_alert.register('boo'); เลือก * จาก dbms_alert.waitany(10); -- เซสชัน C เลือก dbms_alert.signal('boo','Nice day');
โมดูลนี้มีฟังก์ชันบางอย่างสำหรับการทำงานกับวันทำการจากแพ็คเกจ PLVdate เอกสารรายละเอียดสามารถพบได้ในไลบรารี PLVision แพ็คเกจนี้เป็นความหลากหลายทางวัฒนธรรม แต่การกำหนดค่าเริ่มต้นมีไว้สำหรับประเทศในยุโรปเท่านั้น (ดูซอร์สโค้ด)
คุณควรกำหนดวันที่ไม่ใช่วันทำการของคุณเอง (สูงสุด 50 วัน) และวันหยุดของตนเอง (สูงสุด 30 วัน) วันหยุดคือวันที่ไม่ใช่วันทำการซึ่งจะเหมือนกันทุกปี เช่น วันคริสต์มาสในประเทศตะวันตก
plvdate.add_bizdays(day date, days int) date - รับวันที่ที่สร้างโดยการเพิ่ม <n> วันทำการให้กับวันที่
plvdate.nearest_bizday(day date) date - รับวันที่ทำธุรกิจที่ใกล้ที่สุดจนถึงวันที่ที่กำหนด โดยผู้ใช้กำหนด
plvdate.next_bizday(day date) date - รับวันที่ทำการถัดไปจากวันที่ที่กำหนด โดยผู้ใช้กำหนด
plvdate.bizdays_between(day1 date, day2 date) int - รับจำนวนวันทำการระหว่างวันที่สองวัน
plvdate.prev_bizday(day date) date - รับวันที่ทำการก่อนหน้าจากวันที่ที่กำหนด
plvdate_isbizday(date) bool - เรียกใช้ฟังก์ชันนี้เพื่อตรวจสอบว่าวันที่เป็นวันทำการหรือไม่
plvdate.set_nonbizday(dow varchar) - ตั้งค่าวันในสัปดาห์เป็นวันที่ไม่ใช่วันทำการ
plvdate.unset_nonbizday(dow varchar) - ยกเลิกการตั้งค่าวันในสัปดาห์เป็นวันที่ไม่ใช่วันทำการ
plvdate.set_nonbizday(day date) - กำหนดให้วันเป็นวันที่ไม่ใช่วันทำการ
plvdate.unset_nonbizday(day date) - ไม่ได้กำหนดวันที่เป็นวันที่ไม่ใช่วันทำการ
plvdate.set_nonbizday(วันที่ของวัน, บูลซ้ำ) - กำหนดให้วันเป็นวันที่ไม่ใช่ธุรกิจ ถ้า 'ทำซ้ำ' เป็นจริง วันนั้นจะไม่ใช่วันธุรกิจทุกปี
plvdate.unset_nonbizday(วันที่ของวัน, บูลซ้ำ) - วันที่ไม่ได้กำหนดเป็นวันที่ไม่ใช่วันทำการ หาก 'ซ้ำ' เป็นจริง วันดังกล่าวก็จะไม่ใช่วันที่ไม่ใช่ธุรกิจทุกปี
plvdate.use_easter() - วันอาทิตย์อีสเตอร์ และวันจันทร์อีสเตอร์ จะเป็นวันหยุด
plvdate.unuse_easter();
plvdate.use_easter (ใช้บูลีน);
plvdate.using_easter() bool - ถ้าเราใช้ easter ก็จะคืนค่าเป็นจริง
plvdate.use_great_friday() - Easter Great Friday จะเป็นวันหยุด
plvdate.unuse_easter();
plvdate.use_easter (ใช้บูลีน);
plvdate.using_easter() bool - ถ้าเราใช้ easter Great Friday เป็นวันหยุด ก็จะคืนค่าเป็นจริง
plvdate.include_start() - รวมวันที่เริ่มต้นในการคำนวณ bizdays_between
plvdate.noinclude_start();
plvdate.include_start (รวมบูลีน);
plvdate.include_start() บูล;
plvdate.default_holidays(varchar) - โหลดการกำหนดค่าเริ่มต้น คุณสามารถใช้การกำหนดค่าต่อไปนี้: เช็ก เยอรมัน ออสเตรีย โปแลนด์ สโลวาเกีย รัสเซีย GB และสหรัฐอเมริกาในขณะนี้
การกำหนดค่าประกอบด้วยวันหยุดทั่วไปเท่านั้นสำหรับทุกภูมิภาค คุณสามารถเพิ่มวันหยุดประจำภูมิภาคของคุณเองได้ด้วย plvdate.set_nonbizday(nonbizday, true)
ตัวอย่าง:
postgres=# เลือก plvdate.default_holidays('เช็ก'); default_holidays - (1 แถว) postgres=# เลือก to_char (current_date, 'วัน') plvdate.next_bizday(current_date) to_char(plvdate.next_bizday(current_date),'วัน'); to_char | next_bizday | to_char - วันเสาร์ | 13-03-2549 | วันจันทร์ (1 แถว)
การเปลี่ยนแปลงสำหรับสภาพแวดล้อมที่ไม่ใช่ยุโรป:
เลือก plvdate.unset_nonbizday('saturday'); เลือก plvdate.unset_nonbizday('sunday'); เลือก plvdate.set_nonbizday('วันศุกร์'); เลือก plvdate.set_nonbizday('2006-05-19', จริง); เลือก plvdate.unuse_easter();
แพคเกจนี้ประกอบด้วยฟังก์ชันสตริงและอักขระที่มีประโยชน์ แต่ละฟังก์ชันรองรับออฟเซ็ตที่เป็นบวกและลบ เช่น ออฟเซ็ตจากส่วนท้ายของสตริง ตัวอย่างเช่น:
plvstr.left('abcdef',2) -> ab plvstr.left('abcdef',-2) -> abcd plvstr.substr('abcdef',1,1) -> plvstr.substr('abcdef',-1,1) -> f plvstr.substr('abcde',-2,1) ->ง
รายการฟังก์ชั่น:
plvstr.normalize(str text) - ทำให้สตริงเป็นมาตรฐาน - แทนที่ตัวอักษรสีขาวด้วยช่องว่าง แทนที่ช่องว่างด้วยช่องว่าง
plvstr.is_prefix(ข้อความ str, ข้อความนำหน้า, cs bool) - ส่งคืนค่าเป็นจริง หากคำนำหน้าเป็นคำนำหน้าของ str
plvstr.is_prefix(ข้อความ str, ข้อความนำหน้า) - ส่งคืนค่าเป็นจริง หากคำนำหน้าเป็นคำนำหน้าของ str
plvstr.is_prefix(str int, prefix int) - ส่งคืนค่าเป็นจริง หากคำนำหน้าเป็นคำนำหน้าของ str
plvstr.is_prefix(str bigint, prefix bigint) - ส่งคืนค่าเป็นจริง หากคำนำหน้าเป็นคำนำหน้าของ str
plvstr.substr(ข้อความ str, start int, len int) - ส่งคืนสตริงย่อยที่เริ่มต้นเมื่อ start_in ถึงจุดสิ้นสุด
plvstr.substr(str text, start int) - ส่งคืนสตริงย่อยที่เริ่มต้นเมื่อ start_in ถึงจุดสิ้นสุด
plvstr.instr(str text, patt text, start int, nth int) - รูปแบบการค้นหาในสตริง
plvstr.instr(ข้อความ str, ข้อความ patt, start int) - รูปแบบการค้นหาในสตริง
plvstr.instr(str text, patt text) - ค้นหารูปแบบในสตริง
plvstr.lpart(str text, div text, start int, nth int, all_if_notfound bool) - เรียกใช้ฟังก์ชันนี้เพื่อส่งคืนส่วนด้านซ้ายของสตริง
plvstr.lpart(str text, div text, start int, nth int) - เรียกใช้ฟังก์ชันนี้เพื่อส่งคืนส่วนด้านซ้ายของสตริง
plvstr.lpart(str text, div text, start int) - เรียกใช้ฟังก์ชันนี้เพื่อส่งคืนส่วนด้านซ้ายของสตริง
plvstr.lpart(str text, div text) - เรียกใช้ฟังก์ชันนี้เพื่อส่งคืนส่วนด้านซ้ายของสตริง
plvstr.rpart(str text, div text, start int, nth int, all_if_notfound bool) - เรียกใช้ฟังก์ชันนี้เพื่อส่งคืนส่วนขวาของสตริง
plvstr.rpart(str text, div text, start int, nth int) - เรียกใช้ฟังก์ชันนี้เพื่อส่งคืนส่วนขวาของสตริง
plvstr.rpart(str text, div text, start int) - เรียกใช้ฟังก์ชันนี้เพื่อส่งคืนส่วนขวาของสตริง
plvstr.rpart(str text, div text) - เรียกใช้ฟังก์ชันนี้เพื่อส่งคืนส่วนขวาของสตริง
plvstr.lstrip(str text, substr text, num int) - เรียกใช้ฟังก์ชันนี้เพื่อลบอักขระออกจากจุดเริ่มต้น
plvstr.lstrip(str text, substr text) - เรียกใช้ฟังก์ชันนี้เพื่อลบอักขระออกจากจุดเริ่มต้น
plvstr.rstrip(str text, substr text, num int) - เรียกใช้ฟังก์ชันนี้เพื่อลบอักขระออกจากส่วนท้าย
plvstr.rstrip(str text, substr text) - เรียกใช้ฟังก์ชันนี้เพื่อลบอักขระออกจากส่วนท้าย
plvstr.rvrs(ข้อความ str, start int, _end int) - สตริงย้อนกลับหรือส่วนหนึ่งของสตริง
plvstr.rvrs(str text, start int) - ย้อนกลับสตริงหรือส่วนหนึ่งของสตริง
plvstr.rvrs(ข้อความ str) - สตริงย้อนกลับหรือส่วนหนึ่งของสตริง
plvstr.left(str text, n int) - ส่งกลับอักขระ num_in ตัวแรก คุณสามารถใช้ค่าลบ num_in ได้
plvstr.right(str text, n int) - ส่งกลับอักขระ num_in สุดท้าย คุณสามารถใช้ค่าลบ num_ni ได้
plvstr.swap(ข้อความ str, แทนที่ข้อความ, start int, length int) - แทนที่สตริงย่อยในสตริงด้วยสตริงที่ระบุ
plvstr.swap(ข้อความ str, แทนที่ข้อความ) - แทนที่สตริงย่อยในสตริงด้วยสตริงที่ระบุ
plvstr.betwn(ข้อความ str, start int, _end int, รวมบูล) - ค้นหาสตริงย่อยระหว่างตำแหน่งเริ่มต้นและจุดสิ้นสุด
plvstr.betwn(ข้อความ str, ข้อความเริ่มต้น, ข้อความ _end, startnth int, endnth int, รวมบูล, gotoend bool) - ค้นหาสตริงย่อยระหว่างตำแหน่งเริ่มต้นและจุดสิ้นสุด
plvstr.betwn(ข้อความ str, ข้อความเริ่มต้น, ข้อความ _end) - ค้นหาสตริงย่อยระหว่างตำแหน่งเริ่มต้นและสิ้นสุด
plvstr.betwn(ข้อความ str, ข้อความเริ่มต้น, ข้อความ _end, startnth int, endnth int) - ค้นหาสตริงย่อยระหว่างตำแหน่งเริ่มต้นและจุดสิ้นสุด
plvchr.nth(str text, n int) - เรียกใช้ฟังก์ชันนี้เพื่อส่งคืนอักขระที่ N ในสตริง
plvchr.first(str text) - เรียกใช้ฟังก์ชันนี้เพื่อส่งคืนอักขระตัวแรกในสตริง
plvchr.last(str text) - เรียกใช้ฟังก์ชันนี้เพื่อส่งคืนอักขระตัวสุดท้ายในสตริง
plvchr.is_blank(c int) - ว่างเปล่า
plvchr.is_blank(ข้อความ c) - ว่างเปล่า
plvchr.is_digit(c int) - เป็นตัวเลข
plvchr.is_digit(c text) - เป็นตัวเลข
plvchr.is_quote(c int) - เป็นเครื่องหมายคำพูด
plvchr.is_quote(c text) - เป็นเครื่องหมายคำพูด
plvchr.is_other(c int) - เป็นอย่างอื่น
plvchr.is_other(ข้อความ c) - เป็นอย่างอื่น
plvchr.is_letter(c int) - เป็นตัวอักษร
plvchr.is_letter(c text) - เป็นตัวอักษร
plvchr.char_name(c text) - ส่งกลับชื่อของอักขระเป็นโค้ด ASCII ในรูปแบบ VARCHAR
plvchr.quoted1(str text) - ข้อความที่ยกมาระหว่าง '''
plvchr.quoted2(str text) - ข้อความที่ยกมาระหว่าง '"'
plvchr.stripped(ข้อความ str, ข้อความ char_in) - ตัดสตริงของอินสแตนซ์ทั้งหมดของอักขระที่ระบุ
แพ็คเกจ PLVsubst ทำการแทนที่สตริงโดยยึดตามคีย์เวิร์ดการแทนที่
plvsubst.string(template_in text, vals_in text[]) - สแกนสตริงสำหรับอินสแตนซ์ทั้งหมดของคีย์เวิร์ดทดแทนและแทนที่ด้วยค่าถัดไปในรายการค่าการทดแทน
plvsubst.string (ข้อความ template_in, ข้อความ vals_in [], ข้อความ subst_in)
plvsubst.string (ข้อความ template_in, ข้อความ vals_in, ข้อความ delim_in)
plvsubst.string (ข้อความ template_in, ข้อความ vals_in, ข้อความ delim_in, ข้อความ subst_in)
plvsubst.setsubst(str text) - ตั้งค่าคำสำคัญทดแทนเป็นค่าเริ่มต้น '%s'
plvsubst.subst() - ดึงคำสำคัญทดแทน
ตัวอย่าง:
เลือก plvsubst.string('ฉันชื่อ %s %s.', ARRAY['Pavel','Stěhule']); เชือก - ฉันชื่อพาเวล สตีฮูเล (1 แถว) เลือก plvsubst.string('ฉันชื่อ %s %s.', 'Pavel,Stěhule'); เชือก - ฉันชื่อพาเวล สตีฮูเล (1 แถว) เลือก plvsubst.string('ฉันชื่อ $$ $$.', 'Pavel|Stěhule','|','$$'); เชือก - ฉันชื่อพาเวล สตีฮูเล (1 แถว)
dms_utility.format_call_stack() - ส่งคืนสตริงที่จัดรูปแบบแล้วพร้อมเนื้อหาของ call stack
postgres=# เลือก foo2(); ฟู2 - ----- โทรสแต็ค ----- วัตถุเส้น ชื่อคำสั่งหมายเลข 1 ฟังก์ชันส่งคืน foo 1 ฟังก์ชันส่งคืน foo1 1 ฟังก์ชันส่งคืน foo2 (1 แถว)
แพ็คเกจนี้เข้ากันไม่ได้กับ PLVlex ดั้งเดิม
postgres=# เลือก * จาก plvlex.tokens('เลือก * จาก abc เข้าร่วม d ON x=y', จริง, จริง); ตำแหน่ง | โทเค็น | รหัส | คลาส | ตัวคั่น | ม็อด - 0 | เลือก | 527 | คำสำคัญ | - 7 | - 42 | อื่นๆ | - ตัวเอง 9 | จาก | 377 | คำสำคัญ | - 25 | เอบีซี | - รหัสประจำตัว | - 20 | เข้าร่วม | 418 | คำสำคัญ | - 25 | ง | - รหัสประจำตัว | - 27 | บน | 473 | คำสำคัญ | - 30 | x | - รหัสประจำตัว | - 31 | - 61 | อื่นๆ | - ตัวเอง 32 | ใช่ | - รหัสประจำตัว | - (10 แถว)
คำเตือน: รหัสของคำหลักสามารถเปลี่ยนแปลงได้ระหว่างเวอร์ชัน PostgreSQL! o plvlex.tokens(ข้อความ str,skip_spaces bool,qualified_names bool) - ส่งคืนตารางองค์ประกอบคำศัพท์ใน str
แพ็คเกจนี้ปกป้องอินพุตของผู้ใช้จากการฉีด SQL
dbms_assert.enquote_literal(varchar) varchar - เพิ่มเครื่องหมายคำพูดนำหน้าและต่อท้าย ตรวจสอบว่าเครื่องหมายคำพูดเดี่ยวทั้งหมดจับคู่กับเครื่องหมายคำพูดเดี่ยวที่อยู่ติดกัน
dbms_assert.enquote_name(varchar [, boolean]) varchar - ใส่ชื่อด้วยเครื่องหมายคำพูดคู่ พารามิเตอร์ตัวเลือกที่สองช่วยให้แน่ใจว่าชื่อถูกลดขนาดลง ข้อควรสนใจ - บน Oracle นั้นเป็นตัวพิมพ์ใหญ่พารามิเตอร์ตัวที่สอง!
dbms_assert.noop(varchar) varchar - ส่งกลับค่าโดยไม่มีการตรวจสอบใดๆ
dbms_assert.qualified_sql_name(varchar) varchar - ฟังก์ชันนี้จะตรวจสอบว่าสตริงอินพุตเป็นชื่อ SQL ที่ผ่านการรับรอง
dbms_assert.schema_name(varchar) varchar - ฟังก์ชันตรวจสอบว่าสตริงอินพุตเป็นชื่อสคีมาที่มีอยู่
dbms_assert.simple_sql_name(varchar) varchar -ฟังก์ชันนี้จะตรวจสอบว่าสตริงอินพุตเป็นชื่อ SQL แบบง่าย
dbms_assert.object_name(varchar) varchar - ตรวจสอบว่าสตริงอินพุตเป็นตัวระบุ SQL ที่มีคุณสมบัติเหมาะสมของอ็อบเจ็กต์ SQL ที่มีอยู่
หน่วยนี้มีฟังก์ชันการยืนยันบางอย่าง
plunit.assert_true(bool [, varchar]) - ยืนยันว่าเงื่อนไขเป็นจริง
plunit.assert_false(bool [, varchar]) - ยืนยันว่าเงื่อนไขเป็นเท็จ
plunit.assert_null(anyelement [, varchar]) - ยืนยันว่าข้อมูลจริงเป็นโมฆะ
plunit.assert_not_null(anyelement [, varchar]) - ยืนยันว่าข้อมูลจริงไม่เป็นโมฆะ
plunit.assert_equals(anyelement, anyelement [, double precision] [, varchar]) - ยืนยันว่าคาดหวังและเกิดขึ้นจริงเท่ากัน
plunit.assert_not_equals(anyelement, anyelement [, double precision] [, varchar]) - ยืนยันว่าคาดหวังและเกิดขึ้นจริงเท่ากัน
plunit.fail([varchar]) - ความล้มเหลวสามารถใช้เพื่อทำให้ขั้นตอนการทดสอบล้มเหลวทันทีโดยใช้ข้อความที่ให้มา
dbms_random.initialize(int) - เริ่มต้นแพ็คเกจด้วยค่าเริ่มต้น
dbms_random.normal() - ส่งกลับตัวเลขสุ่มในการแจกแจงแบบปกติมาตรฐาน
dbms_random.random() - ส่งกลับตัวเลขสุ่มจาก -2^31 .. 2^31
dbms_random.seed(int)
dbms_random.seed(ข้อความ) - รีเซ็ตค่าเมล็ด
dbms_random.string(เลือกข้อความ (1), len int) - สร้างสตริงสุ่ม
dbms_random.terminate() - ยุติแพ็คเกจ (ไม่ทำอะไรเลยใน Pg)
dbms_random.value() - ส่งกลับตัวเลขสุ่มตั้งแต่ [0.0 - 1.0)
dbms_random.value(ความแม่นยำสองเท่าต่ำ, ความแม่นยำสองเท่าสูง) - ส่งกลับตัวเลขสุ่มจาก [ต่ำ - สูง)
โมดูลนี้ประกอบด้วยการใช้งานฟังก์ชันต่างๆ: concat, nvl, nvl2, lnnvl, decode, ยิ่งใหญ่ที่สุด, น้อยที่สุด, bitand, nanvl, sinh, cosh, tanh, oracle.substr และ oracle.mod
oracle.substr(ข้อความ str, start int, len int) - สตริงย่อยที่เข้ากันได้กับ Oracle
oracle.substr(str text, start int) - สตริงย่อยที่เข้ากันได้กับ Oracle
oracle.substr(ตัวเลข str, ตัวเลขเริ่มต้น) - สตริงย่อยที่เข้ากันได้กับ Oracle
oracle.substr(ตัวเลข str, ตัวเลขเริ่มต้น, ตัวเลข len) - สตริงย่อยที่เข้ากันได้กับ Oracle
oracle.substr(str varchar, start numeric) - สตริงย่อยที่เข้ากันได้กับ Oracle
oracle.substr(str varchar, start numeric,len numeric) - สตริงย่อยที่เข้ากันได้กับ Oracle
oracle.lpad(string, length [, fill]) - lpad ที่เข้ากันได้กับ Oracle
oracle.rpad(string, length [, fill]) - rpad ที่เข้ากันได้กับ Oracle
oracle.ltrim(ข้อความสตริง [, ข้อความอักขระ]) - ltrim ที่เข้ากันได้กับ Oracle
oracle.rtrim(ข้อความสตริง [, ข้อความอักขระ]) - rtrim ที่เข้ากันได้กับ Oracle
oracle.btrim(ข้อความสตริง [, ข้อความอักขระ]) - btrim ที่เข้ากันได้กับ Oracle
oracle.length(string char) - ความยาวที่เข้ากันได้กับ Oracle
oracle.listagg(str text [, separator text]) - รวมค่าลงในรายการ
oracle.wm_concat(str text) - ค่ารวมเป็นรายการที่คั่นด้วยเครื่องหมายจุลภาค
oracle.median(float4) - คำนวณค่ามัธยฐาน
oracle.median(float8) - คำนวณค่ามัธยฐาน
oracle.to_number(text) - แปลงสตริงเป็นตัวเลข
oracle.to_number(numeric) - แปลงสตริงเป็นตัวเลข
oracle.to_number(ตัวเลข,ตัวเลข) - แปลงสตริงเป็นตัวเลข
public.to_multi_byte(text) - แปลงอักขระไบต์เดียวทั้งหมดให้เป็นอักขระหลายไบต์ที่สอดคล้องกัน
public.to_single_byte(text) - แปลงอักขระแบบหลายไบต์ทั้งหมดให้เป็นอักขระไบต์เดี่ยวที่สอดคล้องกัน
oracle.greatest (anyelement, anyelement []) - ความเข้ากันได้ของ Oracle ยิ่งใหญ่ที่สุด, ส่งคืน NULL ในอินพุต NULL
oracle.least (anyelement, anyelement []) - ความเข้ากันได้ของ Oracle น้อยที่สุด, ส่งคืน NULL ในอินพุต NULL
oracle.mod(int, int) - mod ที่เข้ากันได้กับ Oracle หากพารามิเตอร์ที่สองเป็นศูนย์ ก็จะส่งคืนพารามิเตอร์แรก
oracle.remainder(int, int) - คืนค่าเศษของตัวเลขหารด้วยตัวเลขอื่น
Oracle.Remainder (ตัวเลขตัวเลข) - ส่วนที่เหลือของหมายเลขที่หารด้วยตัวเลขอื่น
oracle.sys_guid () - ส่งคืน Bytea - 16 ไบต์ของ Global Uniq ID
คุณอาจต้องตั้งค่า search_path เป็น 'oracle, pg_catalog, "$ user", สาธารณะ' เพราะ oracle.substr, oracle.lpad, oracle.rpad, oracle.ltrim, oracle.rtrim, oracle.btrim, oracle.length -โดยด้านกับ pg_catalog.substr, pg_catalog.lpad, pg_catalog.rpad, pg_catalog.ltrim, PG_CATALOG.RTRIM, PG_CATALOG.BTRIM, PG_CATALOG.Length ตามลำดับ
ฟังก์ชั่น oracle.decode, oracle.greatest และ oracle.least จะต้องได้รับคำนำหน้าโดยชื่อสคีมาเสมอแม้ว่า Oracle จะเป็นก่อนหน้า pg_catalog ใน search_path เพราะฟังก์ชั่นเหล่านี้ถูกนำไปใช้ภายใน postgresql parser และ Analyzer หากไม่มีชื่อสคีมาฟังก์ชั่นภายในจะถูกใช้เสมอ
โปรดทราบว่าในกรณีของ LPAD และ RPAD พารามิเตอร์สตริงและการเติมอาจเป็นประเภทถ่าน, VARCHAR, TEXT, VARCHAR2 หรือ NVARCHAR2 (โปรดทราบว่าสองชนิดสุดท้ายเป็นประเภทที่จัดเตรียมไว้ด้วย ORAFCE) อักขระการเติมเริ่มต้นคือพื้นที่ครึ่งความกว้าง ในทำนองเดียวกันสำหรับ LTRIM, RTRIM และ BTRIM
โปรดทราบว่า Oracle.length มีข้อ จำกัด ว่าใช้งานได้เฉพาะในหน่วยของอักขระเท่านั้น
oracle.substr ที่มีสามอาร์กิวเมนต์สามารถส่งคืนผลลัพธ์ที่แตกต่างกัน (null หรือสตริงว่าง) ในการพึ่งพาการตั้งค่า orafce.using_substring_zero_width_in_substr ตัวแปร (oracle, warning_oracle, orafce, warning_orafce) ผลลัพธ์ที่แตกต่างกันนี้จะถูกส่งกลับเฉพาะเมื่ออาร์กิวเมนต์ที่สาม (substring_length) เป็นศูนย์ ค่าเริ่มต้นคือ warning_oracle นั่นหมายถึงการเพิ่มคำเตือนและส่งคืนค่าว่าง
ฟังก์ชั่นนี้ส่งคืน ID ที่ไม่ซ้ำกันทั่วโลก มันเรียกฟังก์ชั่นที่ระบุจากส่วนขยาย "UUID-OSSP" จากนั้นฟังก์ชั่นนี้ควรติดตั้งก่อนที่จะใช้ฟังก์ชั่น SYS_GUID โดยค่าเริ่มต้นฟังก์ชั่นนี้ใช้ฟังก์ชั่น uuid_generate_v1 แต่ฟังก์ชั่น uuid_generate_v1mc, uuid_generate_v4 สามารถใช้ได้เช่นกัน (โดยการตั้งค่า orafce.sys_guid_source) Oracle.sys_Guid สามารถใช้ builin gen_random_uuid func ได้เช่นกัน ในกรณีนี้ไม่จำเป็นต้องใช้ส่วนขยาย "UUID-OSSP"
VARCHAR2 ของ Orafce ใช้ส่วนหนึ่งของข้อกำหนดฐานข้อมูล Oracle เกี่ยวกับ VARCHAR2:
หน่วยของ Type Modifier = 'Bytes' (สำหรับความหมายของอักขระดู nvarchar2)
ซึ่งแตกต่างจาก postgreSql varchar, cast โดยนัยถึง varchar2 ไม่ตัดช่องว่างสีขาวเกินความยาวสูงสุดที่ประกาศไว้
สำหรับประเภทเหล่านี้เป็นไปได้ที่จะใช้ null safe || ผู้ประกอบการเมื่อคุณเปิดใช้งาน orafce.varchar2_null_safe_concat เป็น TRUE พฤติกรรมคล้ายกับ Oracle มาก
ความสนใจ: - เมื่อผลลัพธ์เป็นสตริงที่ว่างเปล่าผลลัพธ์จะเป็นโมฆะ พฤติกรรมนี้คือ ปิดใช้งานโดยค่าเริ่มต้น
ความสนใจ: - มีความเข้ากันไม่ได้ระหว่าง 3.7 และ ORAFCE ที่เก่ากว่า เผยแพร่ ขณะนี้ฟังก์ชั่นผู้ประกอบการถูกทำเครื่องหมายว่ามีเสถียรภาพ (ไม่เปลี่ยนรูปก่อน) มันเป็นไปไม่ได้ที่จะสร้างดัชนีการทำงานมากกว่านิพจน์ที่เสถียรหรือผันผวน
- Null Safe Concat (ปิดใช้งานโดยค่าเริ่มต้น) เลือก null || 'สวัสดี' :: varchar2 || โมฆะ; set orafce.varchar2_null_safe_concat เป็น true; เลือก null || 'สวัสดี' :: varchar2 || โมฆะ;
โปรดทราบว่า PostgreSQL ไม่อนุญาตให้ระบุแบบไดนามิกของเราว่าเราตีความสตริง Varchar ได้อย่างไร มันตีความพวกเขาเป็นสตริง 'อักขระ' ตามที่กำหนดโดยการเข้ารหัสฐานข้อมูล ดังนั้นเราไม่สามารถรองรับทั้งความหมายไบต์และอักขระสำหรับประเภท Varchar ที่กำหนดในฐานข้อมูลเดียวกัน เราเลือกที่จะใช้ความหมายของไบต์ซึ่งเป็นค่าเริ่มต้นใน Oracle สำหรับความหมายของอักขระโปรดดู nvarchar2 ซึ่งโดยค่าเริ่มต้นจะใช้ความหมายของอักขระเสมอ
โปรดระวังเมื่อใช้ประเภทด้านบนเพื่อจัดเก็บสตริงซึ่งประกอบด้วยอักขระที่เข้ารหัสแบบ multibyte ซึ่งตัวละครแต่ละตัวอาจประกอบด้วยจำนวนไบต์โดยพลการ
Nvarchar2 ใช้สิ่งต่อไปนี้:
หน่วยของประเภท modifier = 'อักขระ' (ใช้ชุดอักขระ/การเข้ารหัสของฐานข้อมูล)
ใช้ประเภทนี้หากต้องการความหมายของอักขระ
โปรดทราบว่าไม่เหมือน Oracle, Varchar2 และ Nvarchar2 ของ Orafce ไม่ได้กำหนดขีด จำกัด 4000 ไบต์เกี่ยวกับขนาด 'ประกาศ' ในความเป็นจริงมันเหมือนกับของ PostgreSQL VARCHAR ซึ่งอยู่ที่ประมาณ 10MB (แม้ว่า VARCHAR สามารถเก็บค่าขนาดได้สูงถึง 1GB) ในทางทฤษฎี)
ฟังก์ชั่นสตริงที่ใช้ไบต์บางตัวที่จะใช้กับสตริง Varchar2
substrb (varchar2, int [, int]) - แยกสายย่อยของความยาวที่ระบุ (ในไบต์) เริ่มต้นที่ตำแหน่งไบต์ที่กำหนด (นับจากหนึ่ง); หากอาร์กิวเมนต์ที่สามไม่ได้ระบุไว้ความยาวถึงส่วนท้ายของสตริงจะถูกพิจารณา
strposb (varchar2, varchar2) - ส่งคืนตำแหน่งของสตริงย่อยที่ระบุในสตริงที่กำหนด (นับจากหนึ่ง)
ความยาว (varchar2) - ส่งคืนความยาว (เป็นไบต์) ของสตริงที่กำหนด
Oracle ไม่ได้สร้างความแตกต่างระหว่าง NULL และ String ที่ว่างเปล่า (เมื่อใช้ค่าเป็นข้อความ) สำหรับ postgres null และสตริงที่ว่างเปล่าเป็นค่าที่แตกต่างกัน เพื่อความเรียบง่ายเป็นสิ่งที่ดีที่จะให้แน่ใจว่า (ในฐานข้อมูล Postgres) ใช้เฉพาะ nulls (และอย่าใช้สตริงว่าง) หรือใช้เฉพาะสตริงว่างเปล่า (และอย่าใช้ nulls) สำหรับคอลัมน์ประเภทข้อความ ทั้งสองสายพันธุ์มีข้อดีและข้อเสีย
สิ่งนี้สามารถนำไปใช้กับฟังก์ชั่นทริกเกอร์:
oracle.replace_empty_strings (['on' | 'true' | 'คำเตือน' | 'ข้อผิดพลาด'])) oracle.replace_null_strings (['on' | 'true' | 'คำเตือน' | 'ข้อผิดพลาด']))
อาร์กิวเมนต์สตริงเสริมใช้เป็นตัวบ่งชี้ดังนั้นฟังก์ชั่นเหล่านี้ควรเพิ่มคำเตือน (อาจเกิดข้อผิดพลาด) เมื่อแถวถูกเปลี่ยนภายในฟังก์ชั่นเหล่านี้
สร้างการทดสอบตาราง (ID Serial, ชื่อ varchar, นามสกุล Varchar); สร้างทริกเกอร์ test_trg ก่อนแทรกหรืออัปเดต ในการทดสอบ สำหรับแต่ละแถว ดำเนินการขั้นตอน oracle.replace_empty_strings (); แทรกลงในการทดสอบ (ชื่อนามสกุล) ค่า ('', 'stehule'); - ชื่อจะถูกแทนที่ด้วย null
oracle.user_tab_columns
oracle.user_tables
oracle.user_cons_columns
oracle.user_constraints
oracle.product_componenent_version
oracle.user_objects
oracle.dba_segments
เอกสารที่ดีกว่า
seralization ที่ดีกว่าใน dbms_pipe (ผ่านฟังก์ชัน _send และ _recv)
เปลี่ยนโครงสร้างหน่วยความจำที่ใช้ร่วมกันโดยตารางชั่วคราว: ล็อคเท่านั้นใน SHMEM, (บิตแมป), ข้อมูลใน TMP TBL
โมดูลนี้ถูกปล่อยภายใต้ใบอนุญาต BSD
โครงการก่อตั้งขึ้นในปี 2551 โดย Pavel Stehule <[email protected]>
ผู้มีส่วนร่วมอื่น ๆ :
Gabriele Bartolini (Gbartolini)
Jeffrey Cohen (Jcohen)
Giles Darold (Darold)
Pavan Deolasee (Pavanvd)
Peter Eisentraut (Petere)
Beena Emerson (B-Emerson)
Takahiro Itagaki (Itagaki)
Zdenek Kotala (Hlipa)
Amit Langote (Amitlan)
Heikki Linnakangas (Hlinnaka)
Fujii Masao
Marco Nenciarini (Mnencia)
Vinayak Pokale
Gavin Sherry (SWM)
Pavel Stehule (Okbob)
Rahila Syed (Rahila)