Advertisement
Guest User

Untitled

a guest
Feb 29th, 2020
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.74 KB | None | 0 0
  1. CREATE TABLE spec --1
  2. (
  3. id int NOT NULL PRIMARY KEY,
  4. table_name varchar NOT NULL,
  5. column_name varchar NOT NULL,
  6. max_value int NOT NULL
  7. );
  8.  
  9. INSERT INTO spec (id,table_name,column_name,max_value) --2
  10. VALUES (1,'spec','id',1);
  11.  
  12. CREATE OR REPLACE FUNCTION get_next_value_in_column(_table_name varchar, _column_name varchar) --3
  13. RETURNS int AS
  14. $$
  15. DECLARE
  16. _max_value int;
  17. BEGIN
  18. SELECT max_value INTO _max_value
  19. FROM spec
  20. WHERE table_name = _table_name AND column_name = _column_name;
  21.  
  22. IF _max_value IS NOT NULL THEN
  23. UPDATE spec
  24. SET max_value = _max_value+1
  25. WHERE table_name = _table_name AND column_name = _column_name;
  26. RETURN _max_value+1;
  27. ELSE
  28. -- find _max_value in table_name on column_name
  29. EXECUTE format('SELECT MAX(%s) FROM %s',quote_ident(_column_name),quote_ident(_table_name)) INTO _max_value;
  30. IF _max_value IS NULL THEN
  31. _max_value = 0;
  32. END IF;
  33.  
  34. INSERT INTO spec(id, table_name, column_name, max_value)
  35. VALUES (get_next_value_in_column('spec','id'),_table_name,_column_name,_max_value+1);
  36. RETURN _max_value+1;
  37. END IF;
  38.  
  39. END;
  40. $$ LANGUAGE plpgsql;
  41.  
  42. SELECT get_next_value_in_column('spec','id'); --4
  43.  
  44. SELECT id, table_name, column_name, max_value
  45. FROM spec; --5
  46.  
  47. SELECT get_next_value_in_column('spec','id'); -- 6
  48.  
  49. SELECT id, table_name, column_name, max_value
  50. FROM spec; --7
  51.  
  52. CREATE TABLE test --8
  53. (
  54. id int NOT NULL PRIMARY KEY
  55. );
  56.  
  57. INSERT INTO test(id) --9
  58. VALUES (10);
  59.  
  60. SELECT get_next_value_in_column('test','id'); -- 10
  61.  
  62. SELECT id, table_name, column_name, max_value
  63. FROM spec; --11
  64.  
  65. SELECT get_next_value_in_column('test','id'); --12
  66.  
  67. SELECT id, table_name, column_name, max_value
  68. FROM spec; --13
  69.  
  70. CREATE TABLE test2 --14
  71. (
  72. num_value1 int NOT NULL,
  73. num_value2 int NOT NULL
  74. );
  75.  
  76. SELECT get_next_value_in_column('test2','num_value1'); --15
  77.  
  78. SELECT id, table_name, column_name, max_value --16
  79. FROM spec;
  80.  
  81. SELECT get_next_value_in_column('test2','num_value1'); --17
  82.  
  83. SELECT id, table_name, column_name, max_value
  84. FROM spec; --18
  85.  
  86. SELECT get_next_value_in_column('test2','num_value2'); --20
  87.  
  88. SELECT id, table_name, column_name, max_value
  89. FROM spec;--21
  90.  
  91. SELECT get_next_value_in_column('test2','num_value1');
  92. SELECT get_next_value_in_column('test2','num_value1');
  93. SELECT get_next_value_in_column('test2','num_value1');
  94. SELECT get_next_value_in_column('test2','num_value1');
  95. SELECT get_next_value_in_column('test2','num_value1'); --22
  96.  
  97. SELECT id, table_name, column_name, max_value
  98. FROM spec; --23
  99.  
  100. DROP FUNCTION get_next_value_in_column(_table_name varchar, _column_name varchar); --24
  101.  
  102. DROP TABLE spec; --25
  103. DROP TABLE test;
  104. DROP TABLE test2;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement