Fungsi dan operator yang meniru subset fungsi dan paket dari Oracle RDBMS.
Ada grup Google terkait - https://groups.google.com/forum/?hl=en#!forum/orafce-general
Orafce didukung di AWS Aurora dengan Kompatibilitas PostgreSQL dan juga di Azure Database for PostgreSQL.
Modul ini berisi beberapa fungsi berguna yang dapat membantu porting aplikasi Oracle ke PostgreSQL atau yang berguna secara umum.
Fungsi tanggal Oracle bawaan telah diuji terhadap kesesuaiannya dengan Oracle 10. Tanggal berkisar dari 1960 hingga 2070 berfungsi dengan benar. Tanggal sebelum 1582-10-05 dengan format 'J' dan sebelum 1100-03-01 dengan format lain tidak dapat diverifikasi karena ada bug di Oracle.
Semua fungsi sepenuhnya kompatibel dengan Oracle dan menghormati semua string format yang dikenal. Deskripsi rinci dapat ditemukan di internet. Gunakan kata kunci seperti : Oracle round trunc date iyyy.
Y,YY,YYY,YYYY,SYYY,SYEAR tahun I,IY,IYY,IYYY tahun iso Q, seperempat Minggu WW, hari sebagai hari pertama tahun ini Minggu IW, mulai Senin Minggu W, hari sebagai hari pertama setiap bulan DAY,DY,D hari pertama dalam seminggu, minggu BULAN, SENIN, MM, RM bulan CC, abad SCC HDD,DD,J hari HH,HH12,HH24 jam menit MI
Fungsi dirangkum. Artinya, tanggal 1 Juli akan dibulatkan ke tahun berikutnya. Tanggal 16 Juli akan dibulatkan ke Agustus.
add_months(date, integer) date - Tanggal pengembalian ditambah n bulan
add_months(tanggal '31-05-2005',1) -> 30-06-2005
last_date(date) date - Mengembalikan hari terakhir pada bulan tersebut berdasarkan nilai tanggal
hari_terakhir(tanggal '24-05-2005') -> 31-05-2005
next_day(date, text) date - Mengembalikan hari kerja pertama yang lebih besar dari nilai tanggal
hari_berikutnya(tanggal '24-05-2005', 'senin') -> 30-05-2005
hari_berikutnya(tanggal, bilangan bulat) tanggal - Sama seperti di atas. Argumen kedua harus 1..7 dan ditafsirkan sebagai Minggu..Sabtu.
hari_berikutnya(tanggal '24-05-2005', 1) -> 30-05-2005
bulan_antara(tanggal, tanggal) numerik - Mengembalikan jumlah bulan antara tanggal1 dan tanggal2. Jika pecahan bulan dihitung, fungsimonth_between menghitung pecahan berdasarkan 31 hari dalam sebulan.
bulan_antara(tanggal '02-02-1995', tanggal '01-01-1995') -> 1.0322580645161
trunc(tanggal, teks) tanggal - potong tanggal sesuai dengan format yang ditentukan
trunc(tanggal '12-07-2005', 'iw') -> 11-07-2005
round(date, text) date - akan membulatkan tanggal sesuai dengan format yang ditentukan
bulat(tanggal '12-07-2005', 'tttt') -> 01-01-2006
to_date(text) timestamp - akan mengetik teks masukan ke stempel waktu. GUC orafce.nls_date_format digunakan untuk menentukan format teks masukan untuk fungsi ini. Jika nilainya dibiarkan kosong atau ditetapkan sebagai DEFAULT maka masukkan format teks sesuai dengan pengaturan GUC gaya tanggal PostgreSQL.
nilai orafce.nls_date_format ke DEFAULT
tanggal_tanggal('19-05-2014 17:23:53+5:30') -> 19-05-2014 17:23:53
orafce.nls_date_format='YYYY-MMDD HH24:MI:SS'
tanggal_tanggal('2014-0519 17:23:53+5:30') -> 19-05-2014 17:23:53
to_date(text, text) timestamp - akan mengetik teks masukan dengan format yang ditentukan ke stempel waktu. GUC orafce.orafce_emit_error_on_date_bug
digunakan untuk menentukan apakah kesalahan dilaporkan ketika nilai tanggal mengenai bug Oracle pada tanggal. Bug ini muncul dengan tanggal sebelum 1582-10-05
ketika format 'J'
digunakan ( 'J2299159'
) dan sebelum 1100-03-01
dengan format lain. Kesalahan dilaporkan secara default, untuk menonaktifkan perilaku ini set orafce.orafce_emit_error_on_date_bug to off
.
PILIH Oracle.to_date('112012', 'J'); KESALAHAN: Tanggal sebelum 1582-10-05 ('J2299159') tidak dapat diverifikasi karena ada bug di Oracle. PILIH Oracle.to_date('1003-03-15', 'yyyy-mm-dd'); KESALAHAN: Tanggal sebelum 01-03-1100 tidak dapat diverifikasi karena ada bug di Oracle. SET orafce.Oracle_compatibility_date_limit TO nonaktif; PILIH Oracle.to_date('112012', 'J'); hingga saat ini ------------------------ 4407-07-30 00:00:00 SM (1 baris) PILIH Oracle.to_date('1003/03/15', 'yyyy/mm/dd'); hingga saat ini --------------------- 15-03-1003 00:00:00 (1 baris)
Modul ini berisi implementasi tipe data DATE yang kompatibel dengan Oracle "Oracle.date" dan fungsi yang menggunakan tipe data DATE seperti Oracle.add_months,Oracle.last_day(),Oracle.next_day(),Oracle.months_between() dll.
Contoh:
setel search_path KE Oracle,"$user", public, pg_catalog; buat tabel Oracle_date(tanggal col1); masukkan ke nilai Oracle_date('24-06-2014 12:12:11'::tanggal); pilih * dari Oracle_date; kolom1 --------------------- 24-06-2014 12:12:11 (1 baris)
Oracle.add_months(cap waktu dengan zona waktu, bilangan bulat) - Mengembalikan tanggal dan waktu ditambah n bulan
Oracle.add_months(Oracle.tanggal'31-05-2005 10:12:12',1) -> 30-06-2005 10:12:12
Oracle.last_day(cap waktu dengan zona waktu) - Mengembalikan hari terakhir bulan itu berdasarkan nilai tanggal
oracle.hari_terakhir(oracle.tanggal '24-05-2005 11:12:12') -> 31-05-2005 11:12:12
Oracle.next_day(cap waktu dengan zona waktu, teks) - Mengembalikan hari kerja pertama yang lebih besar dari nilai tanggal
oracle.next_day(oracle.tanggal '24-05-2005 10:12:12', 'senin') -> 30-05-2005 10:12:12
Oracle.next_day(cap waktu dengan zona waktu, bilangan bulat) - Sama seperti di atas. Argumen kedua harus 1..7 dan ditafsirkan sebagai Minggu..Sabtu.
Oracle.next_day(oracle.tanggal '24-05-2005 11:21:12', 1) -> 29-05-2005 11:21:12
Oracle.months_between(stempel waktu dengan zona waktu, stempel waktu dengan zona waktu) - Mengembalikan jumlah bulan antara stempel waktu1 dan stempel waktu2. Jika pecahan bulan dihitung, fungsimonth_between menghitung pecahan berdasarkan 31 hari dalam sebulan.
oracle.months_between(Oracle.date '1995-02-02 10:00:00', Oracle.date '1995-01-01 10:21:11') -> 1.03225806451613
Oracle.to_date(text,text) - Mengembalikan stempel waktu tanpa zona waktu.
Oracle.to_date('16/02/09 04:12:12', 'MM/DD/YY HH24:MI:SS') -> 16-02-2009 04:12:12
Oracle.to_date(teks) - Mengembalikan Oracle.tanggal
Oracle.to_date('16/02/09 04:12:12') -> 16-02-2009 04:12:12
Oracle.sysdate() - Mengembalikan stempel waktu pernyataan pada zona waktu server (orafce.timezone)
Oracle.sysdate() -> 09-12-2015 17:47:56
oracle.dbtimezone - Mengembalikan zona waktu server - ditiru melalui orafce.timezone
Oracle.dbtimezone() -> GMT
Oracle.sessiontimezone() - Mengembalikan zona waktu sesi - zona waktu PostgreSQL saat ini
Oracle.sessiontimezone() -> Eropa/Praha
Oracle.sys_extract_utc(cap waktu dengan zona waktu) - Mengembalikan stempel waktu dalam zona waktu utc
Oracle.sys_extract_utc(cap_waktu_saat ini)
oracle.sys_extract_utc(Oracle.date) - Mengembalikan stempel waktu dalam zona waktu utc, ketika zona waktu tidak ditentukan, zona waktu sesi (PostgreSQL saat ini) digunakan
oracle.sys_extract_utc(oracle.tanggal '24-05-2005 11:21:12', 1) -> 24-05-2005 09:21:12
Oracle.to_char(timestamp) - Mengembalikan stempel waktu dalam format nls_date_.
orafce.nls_date_format='YY-SeninDD HH24:MI:SS' Oracle.to_char(sampai_tanggal('14-Jan08 11:44:49+05:30')) -> 14-Jan08 11:44:49 orafce.nls_date_format='YY-SeninDD HH24:MI:SS' oracle.to_char(Oracle.to_date('21052014 12:13:44+05:30','DDMMYYYY HH24:MI:SS')) -> 14-21 Mei 12:13:44
oracle.+(Oracle.date,smallint) - Mengembalikan Oracle.tanggal
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') + 9::smallint -> 11-07-2014 10:08:55
oracle.+(Oracle.date,integer) - Mengembalikan Oracle.date
oracle.to_date('02-07-2014 10:08:55','YYYY-MM-DD HH:MI:SS') + 9::integer -> 11-07-2014 10:08:55
oracle.+(Oracle.date,bigint) - Mengembalikan Oracle.tanggal
Oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') + 9::bigint -> 11-07-2014 10:08:55
oracle.+(Oracle.date,numeric) - Mengembalikan Oracle.date
oracle.to_date('02-07-2014 10:08:55','YYYY-MM-DD HH:MI:SS') + 9::numerik -> 11-07-2014 10:08:55
oracle.-(Oracle.date,smallint) - Mengembalikan Oracle.tanggal
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') - 9::smallint -> 23-06-2014 10:08:55
oracle.-(Oracle.date,integer) - Mengembalikan Oracle.date
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') - 9::integer -> 23-06-2014 10:08:55
oracle.-(Oracle.date,bigint) - Mengembalikan Oracle.date
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') - 9::bigint -> 23-06-2014 10:08:55
oracle.-(Oracle.date,numeric) - Mengembalikan Oracle.date
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') - 9::numerik -> 23-06-2014 10:08:55
oracle.-(Oracle.date,Oracle.date) - Mengembalikan presisi ganda
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-hh jj24:mi:ss') -> 166.048785
Anda perlu menyetel search_path TO Oracle,"$user", public, pg_catalog karena fungsi seperti Oracle.add_months,Oracle.last_day,Oracle.next_day,Oracle.months_between diinstal berdampingan dengan pg_catalog.add_months,pg_catalog.last_day, pg_catalog.hari_berikutnya,pg_catalog.bulan_antara.
PostgreSQL tidak memerlukan tabel Oracle 'dual', tetapi karena digunakan secara intensif oleh pengguna Oracle, tabel tersebut telah ditambahkan di orafce. Tabel ini ada dalam skema oracle
. Biasanya Anda ingin mengizinkan akses yang tidak memenuhi syarat - jadi Anda harus menambahkan skema ini ke konfigurasi search_path
(seperti search_path = 'oracle, pg_catalog, "$user", public'
di postgresql.conf
).
PostgreSQL mengirimkan informasi ke klien melalui RAISE NOTICE. Oracle menggunakan dbms_output.put_line(). Ini bekerja secara berbeda dari RAISE NOTICE. Oracle memiliki antrian sesi, put_line() menambahkan baris ke antrian dan fungsi get_line() membaca dari antrian. Jika flag 'serveroutput' disetel, maka klien atas semua pernyataan sql membaca antrian. Anda dapat menggunakan:
pilih dbms_output.enable(); pilih dbms_output.put_line('baris_pertama'); pilih dbms_output.put_line('baris_berikutnya'); pilih * dari dbms_output.get_lines(0);
atau
pilih dbms_output.enable(); pilih dbms_output.serveroutput('t'); pilih dbms_output.put_line('baris_pertama');
Paket ini berisi fungsi-fungsi berikut: aktifkan(), nonaktifkan(), serveroutput(), put(), put_line(), new_line(), get_line(), get_lines(). Antrian paket diimplementasikan dalam memori lokal sesi.
Paket ini memungkinkan program PL/pgSQL untuk membaca dan menulis ke file apa pun yang dapat diakses dari server. Setiap sesi dapat membuka maksimal sepuluh file dan ukuran baris maksimal adalah 32K. Paket ini berisi fungsi-fungsi berikut:
utl_file.fclose(file utl_file.file_type) - tutup file
utl_file.fclose_all() - tutup semua file
utl_file.fcopy(src_location, src_filename, dest_location, dest_filename[, start_line][, end_line]) - salin file teks
utl_file.fflush(file utl_file.file_type) - menghapus semua data dari buffer
utl_file.fgetattr(lokasi, nama file) - dapatkan atribut file
utl_file.fopen(teks lokasi, teks nama file, teks mode_file [, maxlinesize int] [, nama penyandian]) utl_file.file_type - buka file
utl_file.fremove(lokasi, nama file) - menghapus file
utl_file.frename(lokasi, nama file, dest_dir, dest_file[, overwrite]) - ganti nama file
utl_file.get_line(file utl_file.file_type) teks - baca satu baris dari file
utl_file.get_nextline(file utl_file.file_type) teks - membaca satu baris dari file atau mengembalikan NULL
utl_file.is_open(file utl_file.file_type) bool - mengembalikan nilai true, jika file dibuka
utl_file.new_line(file utl_file.file_type [,rows int]) - memasukkan beberapa karakter baris baru ke file
utl_file.put(file utl_file.file_type, buffer text) - menempatkan buffer ke file
utl_file.put_line(file utl_file.file_type, buffer text) - menempatkan baris ke file
utl_file.putf(file utl_file.file_type, format buffer [,arg1 text][,arg2 text][..][,arg5 text]) - masukkan teks yang diformat ke dalam file
utl_file.tmpdir() - dapatkan jalur direktori temp
Karena PostgreSQL tidak mendukung panggilan dengan referensi, beberapa fungsi sedikit berbeda: fclose dan get_line.
nyatakan f utl_file.file_type; mulai f := utl_file.fopen('/tmp', 'sample.txt', 'r'); <<baca>> lingkaran mulai ajukan pemberitahuan '%', utl_file.get_line(f); pengecualian ketika no_data_found lalu keluar dari baca; akhir; putaran akhir; f := fclose(f); akhir;
atau detik (dengan fungsi spesifik PostgreSQL get_nextline)
menyatakan f utl_file.file_type; teks baris; mulai f := utl_file.fopen('/tmp', 'sample.txt', 'r'); lingkaran baris := utl_file.get_nextline(f); keluar ketika baris adalah NULL; naikkan pemberitahuan '%', baris; pengecualian ketika yang lain kemudian utl_file.fclose_all(); akhir;
Sebelum menggunakan paket ini Anda harus mengatur tabel utl_file.utl_file_dir. Ini berisi semua direktori yang diizinkan tanpa simbol akhir ('/' atau ''). Pada platform WinNT, jalur harus diakhiri dengan simbol '' setiap saat.
Entri direktori dapat diberi nama (kolom kedua dalam tabel utl_file.utl_file_dir
). Parameter location
dapat berupa nama direktori atau jalur kamus. Lokasi pertama kali ditafsirkan dan diperiksa sebagai nama direktori. Jika tidak ditemukan (pada kolom ke-2), maka lokasi tersebut ditafsirkan dan diperiksa sebagai jalur.
Fungsi dari paket utl_file (skema di Postgres) memerlukan akses ke tabel utl_file.utl_file_dir. Fakta ini dapat digunakan untuk mengontrol apakah pengguna dapat menggunakan fungsi tersebut atau tidak. Pengaturan default adalah BACA untuk UMUM. INSERT, UPDATE hanya dapat dilakukan oleh pengguna yang memiliki hak istimewa (pengguna super). Jadi pengguna yang tidak memiliki hak istimewa dapat menggunakan fungsi dari paket ini, tetapi tidak dapat mengubah daftar direktori aman (isi tabel utl_file.utl_file_dir). Isi tabel ini dapat dilihat oleh PUBLIC (atau harus terlihat oleh pengguna yang menggunakan fungsi dari paket ini).
Ini adalah implementasi API Oracle dari paket DBMS_SQL
Ini tidak menjamin kompatibilitas penuh, tetapi harus mengurangi pekerjaan yang diperlukan agar migrasi berhasil.
Perhatian: Arsitektur PostgreSQL berbeda dengan arsitektur Oracle. PL/pgSQL dijalankan dalam konteks yang sama seperti mesin SQL. Maka tidak ada alasan untuk menggunakan pola Oracle seperti pengumpulan massal dan iterasi pengumpulan di Postgres untuk mendapatkan kinerja yang baik. Kode ini dirancang untuk mengurangi pekerjaan terkait porting beberapa aplikasi dari Oracle ke Postgres, dan dapat berfungsi dengan baik. Namun tidak akan ada keunggulan kinerja apa pun dibandingkan pernyataan PL/pgSQL bawaan. Emulasi API Oracle memiliki overhead memori dan CPU, yang dapat berdampak signifikan pada data yang lebih besar.
Ekstensi ini mengimplementasikan subset antarmuka dbms_sql Oracle. Tujuan dari ekstensi ini bukan untuk kompatibilitas dengan Oracle, melainkan dirancang untuk mengurangi beberapa pekerjaan terkait migrasi aplikasi Oracle ke Postgres. Beberapa fungsi DML massal dasar didukung:
melakukan $$ menyatakan c ke dalam; sebuah int[]; b varchar[]; ca numerik[]; mulai c := dbms_sql.open_cursor(); panggil dbms_sql.parse(c, 'masukkan ke nilai foo(:a, :b, :c)'); a := ARRAY[1, 2, 3, 4, 5]; b := ARRAY['Ahoj', 'Nazdar', 'Bazar']; ca := ARRAY[3.14, 2.22, 3.8, 4]; panggilan dbms_sql.bind_array(c, 'a', a, 2, 3); panggilan dbms_sql.bind_array(c, 'b', b, 3, 4); panggilan dbms_sql.bind_array(c, 'c', ca); ajukan pemberitahuan 'baris yang dimasukkan %d', dbms_sql.execute(c); akhir; $$; melakukan $$ menyatakan c ke dalam; sebuah int[]; b varchar[]; ca numerik[]; mulai c := dbms_sql.open_cursor(); panggil dbms_sql.parse(c, 'pilih i, ''Ahoj'' || i, i + 0,003 dari generate_series(1, 35) g(i)'); panggilan dbms_sql.define_array(c, 1, a, 10, 1); panggilan dbms_sql.define_array(c, 2, b, 10, 1); panggilan dbms_sql.define_array(c, 3, ca, 10, 1); melakukan dbms_sql.execute(c); sementara dbms_sql.fetch_rows(c) > 0 lingkaran panggilan dbms_sql.column_value(c, 1, a); panggilan dbms_sql.column_value(c, 2, b); panggilan dbms_sql.column_value(c, 3, ca); ajukan pemberitahuan 'a = %', a; ajukan pemberitahuan 'b = %', b; ajukan pemberitahuan 'c = %', ca; putaran akhir; panggilan dbms_sql.close_cursor(c); akhir; $$;
Ada fungsi dbms_sql.describe_columns_f
, seperti prosedur dbms_sql.describe_columns
. Perhatian, id tipe terkait dengan sistem tipe PostgreSQL. Nilainya tidak dikonversi ke angka Oracle
melakukan $$ menyatakan c ke dalam; r catatan; d dbms_sql.desc_rec; mulai c := dbms_sql.open_cursor(); panggil dbms_sql.parse(c, 'pilih * dari pg_class'); r := dbms_sql.describe_columns(c); ajukan pemberitahuan '%', r.col_cnt; foreach d dalam array r.desc_t lingkaran ajukan pemberitahuan '% %', d.col_name, d.col_type::regtype; putaran akhir; panggilan dbms_sql.close_cursor(c); akhir; $$; melakukan $$ menyatakan c ke dalam; dan ke dalam; d dbms_sql.desc_rec; da dbms_sql.desc_rec[]; mulai c := dbms_sql.open_cursor(); panggil dbms_sql.parse(c, 'pilih * dari pg_class'); panggilan dbms_sql.describe_columns(c, n, da); ajukan pemberitahuan '%', n; foreach d dalam array da lingkaran ajukan pemberitahuan '% %', d.col_name, d.col_type::regtype; putaran akhir; panggilan dbms_sql.close_cursor(c); akhir; $$;
Paket ini merupakan emulasi paket Oracle dbms_pipe. Ini menyediakan komunikasi antar sesi. Anda dapat mengirim dan membaca pesan apa pun dengan atau tanpa menunggu; daftar pipa aktif; mengatur pipa sebagai milik pribadi atau umum; dan, gunakan pipa eksplisit atau implisit.
Jumlah maksimum pipa adalah 50.
Memori bersama digunakan untuk mengirim pesan.
Contohnya berikut:
- Sesi A pilih dbms_pipe.create_pipe('pipa_saya',10,benar); -- pembuatan pipa eksplisit pilih dbms_pipe.pack_message('neco je jinak'); pilih dbms_pipe.pack_message('apa saja yang lain'); pilih dbms_pipe.send_message('pipa_saya',20,0); -- ubah batas dan kirim tanpa menunggu pilih * dari dbms_pipe.db_pipes; -- daftar pipa saat ini --Sesi B pilih dbms_pipe.receive_message('pipa_saya',1); -- tunggu maksimal 1 detik untuk pesan pilih dbms_pipe.next_item_type(); -- -> 11, teks pilih dbms_pipe.unpack_message_text(); pilih dbms_pipe.next_item_type(); -- -> 11, teks pilih dbms_pipe.unpack_message_text(); pilih dbms_pipe.next_item_type(); -- -> 0, tidak ada item lagi pilih dbms_pipe.remove_pipe('pipa_saya');
Namun ada beberapa perbedaan dibandingkan dengan Oracle:
batas untuk pipa bukan dalam byte tetapi dalam elemen dalam pipa
Anda dapat mengirim pesan tanpa menunggu
Anda dapat mengirim pesan kosong
next_item_type mengetahui tentang TIMESTAMP (tipe 13)
PostgreSQL tidak mengetahui tipe RAW, gunakan bytea saja
Sarana lain komunikasi antar proses.
- Sesi A pilih dbms_alert.register('boo'); pilih * dari dbms_alert.waitany(10); --Sesi B pilih dbms_alert.register('boo'); pilih * dari dbms_alert.waitany(10); --Sesi C pilih dbms_alert.signal('boo','Hari yang menyenangkan');
Modul ini berisi beberapa fungsi untuk bekerja dengan hari kerja dari paket PLVdate. Dokumentasi terperinci dapat ditemukan di perpustakaan PLVision. Paket ini multikultural, tetapi konfigurasi default hanya untuk negara-negara Eropa (lihat kode sumber).
Anda harus menentukan hari non-kerja Anda sendiri (maks 50 hari) dan hari libur Anda sendiri (maks 30 hari). Hari libur adalah hari di luar hari kerja yang selalu sama setiap tahunnya. Misalnya saja hari Natal di negara-negara Barat.
plvdate.add_bizdays(tanggal hari, hari int) tanggal - Dapatkan tanggal yang dibuat dengan menambahkan <n> hari kerja ke suatu tanggal
plvdate.nearest_bizday(tanggal hari) tanggal - Dapatkan tanggal bisnis terdekat dengan tanggal tertentu, ditentukan pengguna
plvdate.next_bizday(tanggal hari) tanggal - Dapatkan tanggal bisnis berikutnya dari tanggal tertentu, ditentukan pengguna
plvdate.bizdays_between(tanggal hari1, tanggal hari2) int - Dapatkan jumlah hari kerja antara dua tanggal
plvdate.prev_bizday(tanggal hari) tanggal - Dapatkan tanggal bisnis sebelumnya dari tanggal tertentu
plvdate_isbizday(date) bool - Panggil fungsi ini untuk menentukan apakah suatu tanggal adalah hari kerja
plvdate.set_nonbizday(dow varchar) - Tetapkan hari dalam seminggu sebagai hari non-bisnis
plvdate.unset_nonbizday(dow varchar) - Hari dalam seminggu tidak ditetapkan sebagai hari non-bisnis
plvdate.set_nonbizday(tanggal hari) - Tetapkan hari sebagai hari non bisnis
plvdate.unset_nonbizday(tanggal hari) - Hari yang tidak ditetapkan sebagai hari bukan hari kerja
plvdate.set_nonbizday(tanggal hari, ulangi bool) - Tetapkan hari sebagai hari bukan bisnis, jika 'pengulangan' benar, maka hari tersebut adalah hari nonbiz setiap tahun
plvdate.unset_nonbizday(tanggal hari, ulangi bool) - Batalkan hari sebagai hari bukan bisnis, jika 'pengulangan' benar, maka hari tersebut adalah hari nonbiz setiap tahun
plvdate.use_easter() - Minggu Paskah dan Senin Paskah akan menjadi hari libur
plvdate.unuse_easter();
plvdate.use_easter(useit boolean);
plvdate.using_easter() bool - Jika kita menggunakan paskah maka hasilnya benar
plvdate.use_great_friday() - Jumat Agung Paskah akan menjadi hari libur
plvdate.unuse_easter();
plvdate.use_easter(useit boolean);
plvdate.using_easter() bool - Jika kita menggunakan Jumat Agung Paskah sebagai hari libur maka hasilnya benar
plvdate.include_start() - Sertakan tanggal mulai dalam penghitungan bizdays_between
plvdate.noinclude_start();
plvdate.include_start(sertakan boolean);
plvdate.termasuk_start() bool;
plvdate.default_holidays(varchar) - memuat konfigurasi default. Anda dapat menggunakan konfigurasi berikut: Ceko, Jerman, Austria, Polandia, Slovakia, Rusia, GB, dan AS saat ini.
konfigurasi hanya berisi hari libur umum untuk semua wilayah. Anda dapat menambahkan hari libur regional Anda sendiri dengan plvdate.set_nonbizday(nonbizday, true)
Contoh:
postgres=# pilih plvdate.default_holidays('czech'); default_liburan ----------------- (1 baris) postgres=# pilih to_char(tanggal_saat ini, 'hari'), plvdate.next_bizday(tanggal_saat ini), to_char(plvdate.next_bizday(tanggal_saat ini),'hari'); ke_char | hari_bisnis berikutnya | ke_char ----------+-------------+----------- Sabtu | 13-03-2006 | Senin (1 baris)
Perubahan untuk lingkungan non-Eropa:
pilih plvdate.unset_nonbizday('sabtu'); pilih plvdate.unset_nonbizday('minggu'); pilih plvdate.set_nonbizday('jumat'); pilih plvdate.set_nonbizday('2006-05-19', benar); pilih plvdate.unuse_easter();
Paket ini berisi beberapa fungsi string dan karakter yang berguna. Setiap fungsi mendukung offset positif dan negatif — yaitu offset dari akhir string. Misalnya:
plvstr.kiri('abcdef',2) -> ab plvstr.kiri('abcdef',-2) -> abcd plvstr.substr('abcdef',1,1) -> a plvstr.substr('abcdef',-1,1) -> f plvstr.substr('abcde',-2,1) -> d
Daftar fungsi:
plvstr.normalize(str text) - Normalisasi string - Ganti karakter putih dengan spasi, ganti spasi dengan spasi
plvstr.is_prefix(str text, prefix text, cs bool) - Mengembalikan nilai true, jika prefix adalah awalan str
plvstr.is_prefix(teks str, teks awalan) - Mengembalikan nilai benar, jika awalan adalah awalan str
plvstr.is_prefix(str int, awalan int) - Mengembalikan nilai benar, jika awalan adalah awalan str
plvstr.is_prefix(str bigint, awalan bigint) - Mengembalikan nilai benar, jika awalan adalah awalan str
plvstr.substr(str text, start int, len int) - Mengembalikan substring yang dimulai pada start_in hingga akhir
plvstr.substr(str text, start int) - Mengembalikan substring yang dimulai pada start_in hingga akhir
plvstr.instr(teks str, teks patt, int awal, int ke-n) - Pola pencarian dalam string
plvstr.instr(str text, patt text, start int) - Pola pencarian dalam string
plvstr.instr(str text, patt text) - Pola pencarian dalam string
plvstr.lpart(str text, div text, start int, nth int, all_if_notfound bool) - Panggil fungsi ini untuk mengembalikan bagian kiri string
plvstr.lpart(str text, div text, start int, nth int) - Panggil fungsi ini untuk mengembalikan bagian kiri string
plvstr.lpart(str text, div text, start int) - Panggil fungsi ini untuk mengembalikan bagian kiri string
plvstr.lpart(str text, div text) - Panggil fungsi ini untuk mengembalikan bagian kiri string
plvstr.rpart(str text, div text, start int, nth int, all_if_notfound bool) - Panggil fungsi ini untuk mengembalikan bagian kanan string
plvstr.rpart(str text, div text, start int, nth int) - Panggil fungsi ini untuk mengembalikan bagian kanan string
plvstr.rpart(str text, div text, start int) - Panggil fungsi ini untuk mengembalikan bagian kanan string
plvstr.rpart(str text, div text) - Panggil fungsi ini untuk mengembalikan bagian kanan string
plvstr.lstrip(str text, substr text, num int) - Panggil fungsi ini untuk menghapus karakter dari awal
plvstr.lstrip(str text, substr text) - Panggil fungsi ini untuk menghapus karakter dari awal
plvstr.rstrip(str text, substr text, num int) - Panggil fungsi ini untuk menghapus karakter dari akhir
plvstr.rstrip(str text, substr text) - Panggil fungsi ini untuk menghapus karakter dari akhir
plvstr.rvrs(str text, start int, _end int) - Membalikkan string atau bagian dari string
plvstr.rvrs(str text, start int) - Membalikkan string atau bagian dari string
plvstr.rvrs(str text) - Membalikkan string atau bagian dari string
plvstr.left(str text, n int) - Mengembalikan num_in karakter pertama. Anda dapat menggunakan num_in negatif
plvstr.right(str text, n int) - Mengembalikan num_in karakter terakhir. Anda dapat menggunakan num_ni negatif
plvstr.swap(str teks, ganti teks, mulai int, panjang int) - Ganti substring dalam string dengan string yang ditentukan
plvstr.swap(str teks, ganti teks) - Ganti substring dalam string dengan string yang ditentukan
plvstr.betwn(str text, start int, _end int, inclusive bool) - Temukan Substring Antara Lokasi Awal dan Akhir
plvstr.betwn(str text, start text, _end text, startnth int, endnth int, inclusive bool, gotoend bool) - Temukan Substring Antara Lokasi Awal dan Akhir
plvstr.betwn(str text, start text, _end text) - Temukan Substring Antara Lokasi Awal dan Akhir
plvstr.betwn(str text, start text, _end text, startnth int, endnth int) - Temukan Substring Antara Lokasi Awal dan Akhir
plvchr.nth(str text, n int) - Panggil fungsi ini untuk mengembalikan karakter ke-N dalam sebuah string
plvchr.first(str text) - Panggil fungsi ini untuk mengembalikan karakter pertama dalam sebuah string
plvchr.last(str text) - Panggil fungsi ini untuk mengembalikan karakter terakhir dalam sebuah string
plvchr.is_blank(c int) - Kosong
plvchr.is_blank(c teks) - Kosong
plvchr.is_digit(c int) - Adalah angka
plvchr.is_digit(c teks) - Adalah digit
plvchr.is_quote(c int) - Adalah kutipan
plvchr.is_quote(c teks) - Adalah kutipan
plvchr.is_other(c int) - Apakah lainnya
plvchr.is_other(c teks) - Apakah lainnya
plvchr.is_letter(c int) - Adalah surat
plvchr.is_letter(c teks) - Adalah surat
plvchr.char_name(c text) - Mengembalikan nama karakter ke kode ascii sebagai VARCHAR.
plvchr.quoted1(str text) - Teks yang dikutip di antara '''
plvchr.quoted2(str text) - Teks yang dikutip di antara '"'
plvchr.stripped(str text, char_in text) - Menghapus string dari semua contoh karakter yang ditentukan
Paket PLVsubst melakukan substitusi string berdasarkan kata kunci substitusi.
plvsubst.string(template_in text, vals_in text[]) - Memindai string untuk semua contoh kata kunci substitusi dan menggantinya dengan nilai berikutnya dalam daftar nilai substitusi
plvsubst.string(template_in teks, vals_in teks[], subst_in teks)
plvsubst.string(template_in teks, vals_in teks, delim_in teks)
plvsubst.string(template_in teks, vals_in teks, delim_in teks, subst_in teks)
plvsubst.setsubst(str text) - Tetapkan kata kunci substitusi ke default '%s'
plvsubst.subst() - Ambil kata kunci substitusi
Contoh:
pilih plvsubst.string('Nama saya %s %s.', ARRAY['Pavel','Stěhule']); rangkaian -------------------------- Nama saya Pavel Stěhule. (1 baris) pilih plvsubst.string('Nama saya %s %s.', 'Pavel,Stěhule'); rangkaian -------------------------- Nama saya Pavel Stěhule. (1 baris) pilih plvsubst.string('Nama saya $$ $$.', 'Pavel|Stěhule','|','$$'); rangkaian -------------------------- Nama saya Pavel Stěhule. (1 baris)
dms_utility.format_call_stack() — mengembalikan string yang diformat dengan konten tumpukan panggilan
postgres=# pilih foo2(); foo2 --------------------------------- ----- Tumpukan Panggilan ----- objek garis nama pernyataan nomor 1 mengembalikan fungsi foo 1 mengembalikan fungsi foo1 1 mengembalikan fungsi foo2 (1 baris)
Paket ini tidak kompatibel dengan PLVlex asli.
postgres=# pilih * dari plvlex.tokens('pilih * dari abc gabung d ON x=y', benar, benar); pos | tanda | kode | kelas | pemisah | mod ----+--------+------+---------+-----------+------ 0 | pilih | 527 | KATA KUNCI | | 7 | * | 42 | LAINNYA | | diri sendiri 9 | dari | 377 | KATA KUNCI | | 25 | abc | | IDENT | | 20 | bergabung | 418 | KATA KUNCI | | 25 | d | | IDENT | | 27 | pada | 473 | KATA KUNCI | | 30 | x | | IDENT | | 31 | = | 61 | LAINNYA | | diri sendiri 32 | kamu | | IDENT | | (10 baris)
Peringatan: Kode kata kunci dapat diubah antar versi PostgreSQL! o plvlex.tokens(str text, skip_spaces bool, Qualified_names bool) - Mengembalikan tabel elemen leksikal di str.
Paket ini melindungi input pengguna terhadap injeksi SQL.
dbms_assert.enquote_literal(varchar) varchar - Tambahkan tanda kutip awal dan akhir, verifikasi bahwa semua tanda kutip tunggal dipasangkan dengan tanda kutip tunggal yang berdekatan.
dbms_assert.enquote_name(varchar [, boolean]) varchar - Lampirkan nama dalam tanda kutip ganda. Parameter opsional kedua memastikan penurunan nama. Perhatian - Di Oracle, parameter kedua dikapitalisasi!
dbms_assert.noop(varchar) varchar - Mengembalikan nilai tanpa pemeriksaan apa pun.
dbms_assert.qualified_sql_name(varchar) varchar - Fungsi ini memverifikasi bahwa string input adalah nama SQL yang memenuhi syarat.
dbms_assert.schema_name(varchar) varchar - Fungsi memverifikasi bahwa string input adalah nama skema yang ada.
dbms_assert.simple_sql_name(varchar) varchar -Fungsi ini memverifikasi bahwa string input adalah nama SQL sederhana.
dbms_assert.object_name(varchar) varchar - Memverifikasi bahwa string input adalah pengidentifikasi SQL yang memenuhi syarat dari objek SQL yang ada.
Unit ini berisi beberapa fungsi penegasan.
plunit.assert_true(bool [, varchar]) - Menegaskan bahwa kondisinya benar.
plunit.assert_false(bool [, varchar]) - Menegaskan bahwa kondisinya salah.
plunit.assert_null(anyelement [, varchar]) - Menegaskan bahwa aktualnya adalah null.
plunit.assert_not_null(anyelement [, varchar]) - Menegaskan bahwa yang sebenarnya bukan nol.
plunit.assert_equals(anyelement, anyelement [, double presisi] [, varchar]) - Menegaskan bahwa yang diharapkan dan aktual adalah sama.
plunit.assert_not_equals(anyelement, anyelement [, double presisi] [, varchar]) - Menegaskan bahwa yang diharapkan dan aktual adalah sama.
plunit.fail([varchar]) - Gagal dapat digunakan untuk menyebabkan prosedur pengujian segera gagal menggunakan pesan yang disediakan.
dbms_random.initialize(int) - Inisialisasi paket dengan nilai seed.
dbms_random.normal() - Mengembalikan angka acak dalam distribusi normal standar.
dbms_random.random() - Mengembalikan nomor acak dari -2^31 .. 2^31.
dbms_random.seed(int)
dbms_random.seed(teks) - Reset nilai benih.
dbms_random.string(opt text(1), len int) - Buat string acak
dbms_random.terminate() - Hentikan paket (tidak melakukan apa pun di Pg)
dbms_random.value() - Mengembalikan nomor acak dari [0.0 - 1.0)
dbms_random.value(presisi ganda rendah, presisi ganda tinggi) - Mengembalikan nomor acak dari [rendah - tinggi)
Modul ini berisi implementasi fungsi: concat, nvl, nvl2, lnnvl, decode, terbesar, terkecil, bitand, nanvl, sinh, cosh, tanh, Oracle.substr dan Oracle.mod.
Oracle.substr(str text, start int, len int) - Substring yang kompatibel dengan Oracle
Oracle.substr(str text, start int) - Substring yang kompatibel dengan Oracle
Oracle.substr(str numerik, mulai numerik) - Substring yang kompatibel dengan Oracle
Oracle.substr(str numerik, mulai numerik, len numerik) - Substring yang kompatibel dengan Oracle
Oracle.substr(str varchar, mulai numerik) - Substring yang kompatibel dengan Oracle
Oracle.substr(str varchar, start numerik,len numerik) - Substring yang kompatibel dengan Oracle
Oracle.lpad(string, panjang [, isi]) - lpad yang kompatibel dengan Oracle
Oracle.rpad(string, panjang [, isi]) - rpad yang kompatibel dengan Oracle
Oracle.ltrim(teks string [, teks karakter]) - ltrim yang kompatibel dengan Oracle
Oracle.rtrim(teks string [, teks karakter]) - rtrim yang kompatibel dengan Oracle
Oracle.btrim(teks string [, teks karakter]) - btrim yang kompatibel dengan Oracle
Oracle.length(string char) - Panjang yang kompatibel dengan Oracle
Oracle.listagg(str text [, separator text]) - nilai agregat ke dalam daftar
Oracle.wm_concat(str text) - nilai agregat ke daftar yang dipisahkan koma
Oracle.median(float4) - menghitung median
Oracle.median(float8) - menghitung median
Oracle.to_number(teks) - mengubah string menjadi angka
Oracle.to_number(numerik) - mengubah string menjadi angka
Oracle.to_number(numeric,numeric) - mengubah string menjadi angka
public.to_multi_byte(text) - Mengonversi semua karakter byte tunggal menjadi karakter multibyte yang sesuai
public.to_single_byte(teks) - Mengonversi semua karakter multi-byte menjadi karakter byte tunggal yang sesuai
oracle.greatest(anyelement, anyelement[]) - Kompatibilitas Oracle paling hebat, kembalikan NULL pada input NULL
oracle.least(anyelement, anyelement[]) - Kompatibilitas Oracle paling sedikit, kembalikan NULL pada input NULL
oracle.mod (int, int) - mod kompatibilitas oracle, jika parameter kedua adalah nol, ia mengembalikan parameter pertama
oracle.remainder (int, int) - Mengembalikan sisa angka dibagi dengan nomor lain
oracle.remainder (numerik, numerik) - mengembalikan sisa angka dibagi dengan nomor lain
oracle.sys_guid () - returns bytea - 16 byte dari ID uniq global
Anda mungkin perlu mengatur Search_Path ke 'Oracle, PG_CATALOG, "$ USER", PUBLIK' karena oracle.substr, oracle.lpad, oracle.rpad, oracle.ltrim, oracle.rtrim, oracle.btrim, oracle.length dipasang sisi sisi terpasang sisi sisi terpasang sisi terpasang sisi terpasang di sisi terpasang di sisi sisi terpasang di sisi terpasang di sisi sisi terpasang di sisi sisi terpasang -bia-sisi dengan pg_catalog.substr, pg_catalog.lpad, pg_catalog.rpad, pg_catalog.ltrim, pg_catalog.rtrim, pg_catalog.btrim, pg_catalog.length.
Fungsi Oracle.Decode, Oracle.Great dan Oracle.least harus selalu diawali dengan nama skema bahkan jika Oracle sebelum PG_CATALOG di Search_Path karena fungsi -fungsi ini diimplementasikan di dalam parser dan penganalisa PostgreSQL. Tanpa nama skema, fungsi internal akan selalu digunakan.
Perhatikan bahwa dalam hal LPAD dan RPAD, string parameter dan pengisian dapat berupa tipe char, varchar, teks, varchar2 atau nvarchar2 (perhatikan bahwa dua yang terakhir adalah tipe yang disediakan orafce). Karakter pengisian default adalah ruang setengah lebar. Demikian pula untuk LTRIM, RTRIM dan BTRIM.
Perhatikan bahwa Oracle.length memiliki batasan yang hanya berfungsi dalam satuan karakter karena jenis char postgreSQL hanya mendukung semantik karakter.
Oracle.substr dengan tiga argumen dapat mengembalikan hasil yang berbeda (null atau string kosong) dalam ketergantungan untuk mengatur variabel orafce.using_substring_zero_width_in_substr (oracle, warning_oracle, orafce, warning_orafce). Hasil yang berbeda ini dikembalikan hanya ketika argumen ketiga (substring_length) adalah nol. Default adalah Warning_oracle, itu berarti meningkatkan peringatan dan kembali nol.
Fungsi ini mengembalikan ID unik global. Ini memanggil fungsi yang ditentukan dari ekstensi "UUID-OSSP", dan kemudian fungsi ini harus diinstal sebelum fungsi sys_guid digunakan. Secara default fungsi ini menggunakan fungsi uuid_generate_v1, tetapi fungsi uuid_generate_v1mc, uuid_generate_v4 dapat digunakan juga (dengan mengatur orafce.sys_guid_source). oracle.sys_guid dapat menggunakan func Builin gen_random_uuid juga. Dalam hal ini ekstensi "UUID-OSSP" tidak diperlukan.
Orafce's VarChar2 mengimplementasikan bagian dari spesifikasi database Oracle tentang varchar2:
Unit tipe modifier = 'bytes' (untuk semantik karakter, lihat nvarchar2)
Tidak seperti postgresql varchar, cast implisit ke varchar2 tidak memotong ruang putih di atas panjang maksimum dinyatakan
Untuk jenis ini dimungkinkan untuk menggunakan null aman || operator, saat Anda mengaktifkan orafce.varchar2_null_safe_concat ke true. Perilaku ini sangat mirip dengan Oracle.
Perhatian: - Ketika hasilnya adalah string kosong, maka hasilnya nol. Perilaku ini dinonaktifkan secara default.
Perhatian: - Ada kemungkinan ketidakcocokan antara 3,7 dan orafce yang lebih tua rilis. Fungsi operator sekarang ditandai sebagai stabil (tidak dapat diubah sebelumnya). Tidak mungkin membuat indeks fungsional dibandingkan ekspresi stabil atau volatil.
- NULL Safe Concat (dinonaktifkan secara default) Pilih NULL || 'halo' :: varchar2 || BATAL; Atur orafce.varchar2_null_safe_concat ke true; Pilih NULL || 'halo' :: varchar2 || BATAL;
Harap dicatat bahwa PostgreSQL tidak mengizinkan untuk secara dinamis menentukan bagaimana kami menafsirkan string Varchar. Itu selalu menafsirkannya sebagai string 'karakter' sebagaimana ditentukan oleh pengkodean database. Jadi, kami tidak dapat mendukung semantik byte dan karakter untuk tipe varchar yang diberikan dalam database yang sama. Kami memilih untuk mengimplementasikan semantik byte karena itu default di Oracle. Untuk semantik karakter, silakan lihat nvarchar2 yang secara default selalu mengimplementasikan semantik karakter.
Harap berhati -hati saat menggunakan tipe di atas untuk menyimpan string yang terdiri dari karakter yang dikodekan multibyte di mana setiap karakter dapat terdiri dari jumlah byte yang sewenang -wenang.
Nvarchar2 mengimplementasikan yang berikut:
Unit tipe modifier = 'karakter' (menggunakan set karakter/pengkodean database)
Gunakan jenis ini jika semantik karakter lebih disukai.
Harap dicatat bahwa tidak seperti Oracle, Orafce's VarChar2 dan Nvarchar2 tidak memaksakan batas 4000 byte pada ukuran 'dinyatakan'. Faktanya sama dengan PostgreSQL Varchar, yaitu sekitar 10MB (meskipun Varchar secara teoritis dapat menyimpan nilai ukuran hingga 1GB)
Beberapa fungsi string berbasis byte untuk digunakan dengan string varchar2
Substrb (varchar2, int [, int]) - Ekstrak substring dengan panjang yang ditentukan (dalam byte) mulai dari posisi byte yang diberikan (menghitung dari satu); Jika argumen ketiga tidak ditentukan maka panjang ke ujung string dipertimbangkan
StrposB (varchar2, varchar2) - Mengembalikan lokasi substring yang ditentukan dalam string yang diberikan (menghitung dari satu)
LengthB (varchar2) - Mengembalikan panjang (dalam byte) dari string yang diberikan
Oracle tidak membuat perbedaan antara nol dan string kosong (ketika nilai digunakan sebagai teks). Untuk postgres null dan string kosong adalah nilai yang berbeda. Untuk kesederhanaan adalah baik untuk memastikan (dalam database Postgres) hanya menggunakan nol (dan jangan gunakan string kosong) atau hanya menggunakan string kosong (dan jangan gunakan nol) untuk kolom tipe teks. Kedua varian memiliki beberapa kelebihan dan kekurangan.
Ini dapat disusun dengan fungsi pemicu:
oracle.replace_empty_strings (['on' | 'true' | 'peringatan' | 'kesalahan']) oracle.replace_null_strings (['on' | 'true' | 'peringatan' | 'kesalahan'])
Argumen string opsional digunakan sebagai indikator sehingga fungsi -fungsi ini harus meningkatkan peringatan (mungkin kesalahan) ketika baris diubah di dalam fungsi -fungsi ini.
Buat tes tabel (ID serial, nama varchar, nama keluarga varchar); Buat pemicu test_trg Sebelum Masukkan atau Perbarui Pada tes Untuk setiap baris Eksekusi Prosedur Oracle.Replace_Empty_strings (); Masukkan ke dalam nilai tes (nama, nama keluarga) ('', 'stehule'); - Nama akan diganti dengan 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
dokumentasi yang lebih baik
seralization yang lebih baik di dbms_pipe (via _send dan _recv fungsi)
ubah struktur memori bersama dengan tabel sementara: Hanya kunci yang ada di SHMEM, (bitmaps), data dalam TMP TBL
Modul ini dirilis di bawah lisensi BSD.
Proyek ini didirikan pada 2008 oleh Pavel Stehule <[email protected]>.
Kontributor lain:
Gabriele Bartolini (Gbartolini)
Jeffrey Cohen (Jcohen)
Giles Darold (Darold)
Pavan Deolasee (PavanVD)
Peter Eisentraut (Petere)
Been 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)