Advertisement
SX514LEFV

triggers and such sql

May 2nd, 2025
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. CREATE OR REPLACE FUNCTION getInitials(name VARCHAR) RETURNS VARCHAR
  2. AS $$
  3.  DECLARE
  4.   initials VARCHAR = '';
  5.  BEGIN
  6.   initials = SUBSTR(name, 1, 1);
  7.  
  8.   WHILE (STRPOS(name, ' ') > 0)
  9.   LOOP
  10.    name = SUBSTR(name, STRPOS(name, ' ') + 1);
  11.    initials = initials || SUBSTR(name, 1, 1);
  12.   END LOOP;
  13.  
  14.   RETURN initials;
  15.  END
  16. $$ LANGUAGE plpgsql;
  17.  
  18. SELECT * INTO people_copy FROM people ORDER BY id LIMIT 20;
  19.  
  20. ALTER TABLE people_copy
  21.  ADD COLUMN initials VARCHAR(255);
  22. UPDATE people_copy SET initials = getInitials(name);
  23.  
  24. CREATE OR REPLACE FUNCTION updateInitials()
  25.     RETURNS TRIGGER
  26.     AS $$
  27.     BEGIN
  28.         NEW.initials = getInitials(NEW.name);
  29.         RETURN NEW;
  30.     END
  31. $$ LANGUAGE plpgsql;
  32.  
  33. CREATE TRIGGER updateInitialsTrigger
  34.     BEFORE INSERT OR UPDATE
  35.     ON people_copy
  36.     FOR EACH ROW
  37.     EXECUTE FUNCTION updateInitials();
  38.  
  39. CREATE OR REPLACE FUNCTION stopDeleteOnName()
  40.     RETURNS TRIGGER
  41.     AS $$
  42.     BEGIN
  43.     IF OLD.name LIKE 'B%' THEN
  44.         RETURN NEW;
  45.     END IF;
  46.     RETURN OLD;
  47.     END
  48. $$ LANGUAGE plpgsql;
  49.  
  50. CREATE TRIGGER stopDeleteOnNameTrigger
  51.     BEFORE DELETE
  52.     ON people_copy
  53.     FOR EACH ROW
  54.     EXECUTE FUNCTION stopDeleteOnName();
  55.    
  56. CREATE PROCEDURE getPersonAge(person_id BIGINT, INOUT age INTEGER)
  57. AS $$
  58.     DECLARE
  59.         dday DATE;
  60.         bday DATE;
  61.     BEGIN
  62.     SELECT birthday, deathday INTO bday, dday FROM people WHERE id = person_id;
  63.     IF bday IS NULL THEN
  64.         age = 0;
  65.     ELSEIF dday IS NULL THEN
  66.         age = (CURRENT_DATE - bday)/365;
  67.     ELSE
  68.         age = (dday - bday)/365;
  69.     END IF;
  70.     END
  71. $$ LANGUAGE plpgsql;
  72.  
  73. DO $$
  74.  DECLARE
  75.   theAge INTEGER;
  76.  BEGIN
  77.   CALL getPersonAge(240, theAge);
  78.   RAISE INFO 'The age is %', theAge;
  79.  END
  80. $$;
  81.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement