7 Nov 2011

Stored Function Di PostgreSQL: ID Unik Per Row

pgAdmin III_2011-11-07_20-14-36Kadang-kadang, kita perlu mengumpulkan data dari beberapa user yang tidak terhubung dengan jaringan komputer (LAN/Internet). Sedangkan data dari user tersebut menggunakan field id (BIGSERIAL) sebagai ID uniknya. Namun masalah timbul jika ada beberapa data yang ID-nya sama dari user yang berbeda. Bila di-merge, data-data akan saling timpa atau menimbulkan error “Duplicate Key Violation”.

Untuk mengatasi ini, saya perlu trik lain selain AutoIncrement field (BIGSERIAL di PostgreSQL) dan membuat sebuah stored function baru, gen_pid().

Isi deklarasi stored function ini seperti berikut.

-- Function: gen_pid()
-- DROP FUNCTION gen_pid();
CREATE OR REPLACE FUNCTION gen_pid()
  RETURNS character varying AS
$BODY$
DECLARE	thn varchar;
DECLARE	bln varchar;
DECLARE	tgl varchar;	
DECLARE	jam varchar;
DECLARE	min varchar;
DECLARE	mis varchar;
begin
	thn := extract(year from current_timestamp)::varchar;
	bln := extract(month from current_timestamp)::varchar;
	tgl := extract(day from current_timestamp)::varchar;
	jam := extract(hour from current_timestamp)::varchar;
	min := extract(minute from current_timestamp)::varchar;
	mis := extract(microseconds from current_timestamp)::varchar;
	if length(bln)<2 then bln:='0'||bln; end if;
	if length(tgl)<2 then tgl:='0'||tgl; end if;
	if length(jam)<2 then jam:='0'||jam; end if;
	if length(min)<2 then min:='0'||min; end if;
	while length(mis)<9
	loop 
		mis:='0'||mis ;
	end loop;
	return (thn||bln||tgl||jam||min||mis)::varchar;
end;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;
ALTER FUNCTION gen_pid() OWNER TO postgres;

Bila sudah jadi, saya dapat memanggilnya dengan

select 'Nomor Unik: ' || gen_pid();


Dan mendapatkan hasil:
Query - MiT-Dev on postgres@192.168.2


fungsi ini dapat juga digunakan sebagai nilai default field pengganti nilai default untuk field ID:

CREATE TABLE transaksi_details
(
  nama character varying(50) NOT NULL,
  id character varying(21) NOT NULL DEFAULT gen_pid(),
  CONSTRAINT pk_trans_details PRIMARY KEY (id)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE transaksi_details OWNER TO postgres;


Berikut contoh inputan data yang dibuat dengan Data Definition Language (DDL) di atas:


Edit Data - Superuser (192.168.2


Semoga bermanfaat. Smile

Tidak ada komentar:

Posting Komentar