Advertisement
Margoshinka

Saved Procedure

Oct 29th, 2022
1,508
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. --Создание спец. таблицы.
  2. CREATE TABLE spec
  3. (
  4.     id int PRIMARY KEY,
  5.     table_name VARCHAR NOT NULL,
  6.     column_name VARCHAR NOT NULL,
  7.     current_maximum_value int NOT NULL
  8. );
  9. --Добавление в спец. таблицу записи (1, spec, id, 1). // информация о том, что максимальное число в столбце id спец. таблицы равно 1
  10. INSERT INTO spec (id, table_name, column_name, current_maximum_value) VALUES (1, 'spec', 'id', 1);
  11. --Создание хранимой процедуры (ХП).
  12.  
  13.  
  14. CREATE OR REPLACE FUNCTION maxval(_table_name spec.table_name%type, _column_name spec.column_name%type)
  15.   RETURNS int AS
  16. $$
  17. DECLARE
  18.  
  19.   _max_value int;
  20.     BEGIN
  21.         IF EXISTS(SELECT *  FROM spec
  22.                    WHERE table_name = _table_name AND column_name = _column_name)
  23.         THEN
  24.             SELECT  current_maximum_value INTO _max_value FROM spec
  25.             WHERE table_name = _table_name AND column_name = _column_name;
  26.             UPDATE spec SET current_maximum_value = _max_value+1
  27.             WHERE table_name = _table_name AND column_name = _column_name;
  28.             RETURN _max_value+1;
  29.         ELSE
  30.             EXECUTE format('SELECT Max(%I) FROM %I', quote_ident(_column_name), quote_ident(_table_name)) INTO _max_value;
  31.             IF (_max_value IS NULL)
  32.             THEN
  33.                 INSERT INTO spec(id, table_name, column_name, current_maximum_value)
  34.                 VALUES (maxval ('spec','id'), _table_name, _column_name, 1 );
  35.                 RETURN 1;
  36.             ELSE
  37.                 INSERT INTO spec(id, table_name, column_name, current_maximum_value)
  38.                 VALUES (maxval ('spec','id'), _table_name, _column_name, _max_value+1);
  39.                 RETURN _max_value+1;
  40.             end if;
  41.         END IF;
  42.  
  43.     END
  44.     $$ LANGUAGE plpgsql;
  45.  
  46. --Вызов ХП с параметрами 'spec', 'id'
  47.  
  48. SELECT maxval('spec', 'id');
  49.  
  50. -- Распечатка содержимого спец. таблицы
  51.  
  52. SELECT * FROM spec;
  53. --Вызов ХП с параметрами 'spec', 'id'
  54.  
  55. SELECT maxval('spec', 'id');
  56.  
  57. --Распечатка содержимого спец. таблицы
  58.  
  59. SELECT * FROM spec;
  60.  
  61. -- Создание новой таблицы с одним столбцом 'id'
  62.  
  63. CREATE TABLE test
  64. (
  65.     id int NOT NULL
  66. );
  67.  
  68. --Добавление в таблицу test записи (10)
  69.  
  70. INSERT INTO test(id)
  71. VALUES(10);
  72.  
  73. --Вызов ХП с параметрами 'test', 'id'
  74.  
  75. SELECT maxval('test', 'id');
  76.  
  77. --Распечатка содержимого спец. таблицы
  78.  
  79. SELECT * FROM spec;
  80.  
  81. --Вызов ХП с параметрами 'test', 'id'
  82.  
  83. SELECT maxval('test', 'id');
  84.  
  85. --Распечатка содержимого спец. таблицы
  86.  
  87. SELECT * FROM spec;
  88.  
  89. --Создание таблицы 'test2' с столбцами 'numValue1', 'numValue2'
  90.  
  91. CREATE TABLE test2
  92. (
  93.     num_value1 int NOT NULL,
  94.     num_value2 int NOT NULL
  95. );
  96.  
  97. --Вызов ХП с параметрами 'test2', 'numValue1'
  98.  
  99. SELECT maxval('test2', 'num_value1');
  100.  
  101. --  Распечатка содержимого спец. таблицы
  102.  
  103. SELECT * FROM spec;
  104.  
  105. --Вызов ХП с параметрами 'test2', 'numValue1'
  106.  
  107. SELECT maxval('test2', 'num_value1');
  108.  
  109. --Распечатка содержимого спец. таблицы
  110.  
  111. SELECT * FROM spec;
  112.  
  113. --Добавление в таблицу 'test2'(numValue1, numValue2) записи (2, 13)
  114.  
  115. INSERT INTO public.test2(num_value1, num_value2)
  116. VALUES(2, 13);
  117.  
  118. --Вызов ХП с параметрами 'test2', 'numValue2'
  119.  
  120. SELECT maxval('test2', 'num_value2');
  121.  
  122. --Распечатка содержимого спец. таблицы
  123.  
  124. SELECT * FROM spec;
  125.  
  126. --Вызов вашей ХП с параметрами 'test2', 'num_value1' 5 раз.
  127.  
  128. SELECT maxval('test2', 'num_value1');
  129. SELECT maxval('test2', 'num_value1');
  130. SELECT maxval('test2', 'num_value1');
  131. SELECT maxval('test2', 'num_value1');
  132. SELECT maxval('test2', 'num_value1');
  133.  
  134. --Распечатка содержимого спец. таблицы
  135.  
  136. SELECT * FROM spec;
  137.  
  138. --Удаление ХП
  139.  
  140. DROP FUNCTION  maxval(_table_name varchar, _column_name varchar);
  141.  
  142. --Удаление таблиц
  143.  
  144. DROP TABLE spec;
  145. DROP TABLE test;
  146. DROP TABLE test2;
  147.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement