bazy_danych:postgresql

PostgreSQL

CREATE OR REPLACE VIEW lista_v AS
  SELECT imie || ' ' || nazwisko || ' (' || kraj || ')'
  FROM zawodnicy;
CREATE RULE lista_v_insert AS
ON INSERT TO lista_v DO INSTEAD (
 
INSERT INTO zawodnicy (imie, nazwisko, kraj) VALUES (
	substr(NEW.zawodnik,1,strpos(NEW.zawodnik,' ')-1),
	substr(NEW.zawodnik,strpos(NEW.zawodnik,' ')+1,
		strpos(NEW.zawodnik,'(')-2 - 
		strpos(NEW.zawodnik,' ')),
	substr(NEW.zawodnik, strpos(NEW.zawodnik,'(')+1,3)
);
 
);
 
CREATE RULE lista_v_delete AS
ON DELETE TO lista_v DO INSTEAD (
 
DELETE FROM zawodnicy WHERE
  imie = substr(OLD.zawodnik,1,strpos(OLD.zawodnik,' ')-1) AND
  nazwisko = substr(OLD.zawodnik,strpos(OLD.zawodnik,' ')+1,
  	strpos(OLD.zawodnik,'(')-2 - 
	strpos(OLD.zawodnik,' ')) AND
  kraj = substr(OLD.zawodnik, strpos(OLD.zawodnik,'(')+1,3);
 
);
 
CREATE OR REPLACE RULE lista_v_insert AS
ON INSERT TO lista_v DO INSTEAD (
 
INSERT INTO zawodnicy (imie, nazwisko, kraj) (
   SELECT
	substr(NEW.zawodnik,1,strpos(NEW.zawodnik,' ')-1),
	substr(NEW.zawodnik,strpos(NEW.zawodnik,' ')+1,
		strpos(NEW.zawodnik,'(')-2 - 
		strpos(NEW.zawodnik,' ')),
	substr(NEW.zawodnik, strpos(NEW.zawodnik,'(')+1,3)
    WHERE (SELECT NEW.zawodnik FROM lista_v 
		WHERE zawodnik = NEW.zawodnik) IS NULL
	)
);
 
CREATE OR REPLACE
FUNCTION lista_v_nazwisko (z text) RETURNS text AS '
begin
  return 
    substr(z,strpos(z,\' \')+1,
      strpos(z,\'(\')-2 - strpos(z,\' \'));
  end;
' LANGUAGE plpgsql
;
CREATE OR REPLACE
FUNCTION lista_v_kraj (z text) RETURNS text AS '
begin
  return 
    substr(z, strpos(z,\'(\')+1,3);
  end;
' LANGUAGE plpgsql
;
CREATE OR REPLACE
FUNCTION lista_v_imie (z text) RETURNS text AS '
begin
  return 
    substr(z,1,strpos(z,\' \')-1);
  end;
' LANGUAGE plpgsql
;
 
CREATE OR REPLACE RULE lista_v_insert AS
ON INSERT TO lista_v DO INSTEAD (
 
INSERT INTO zawodnicy (imie, nazwisko, kraj) (
   SELECT
	lista_v_imie(NEW.zawodnik),
	lista_v_nazwisko(NEW.zawodnik),
	lista_v_kraj(NEW.zawodnik)
    WHERE (SELECT NEW.zawodnik FROM lista_v 
		WHERE zawodnik = NEW.zawodnik) IS NULL
	)
);