Guest User

Untitled

a guest
Jan 18th, 2018
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.68 KB | None | 0 0
  1. RETURN QUERY EXECUTE 'some dynamic query'
  2.  
  3. RETURN QUERY EXECUTE 'some dynamic query'
  4.  
  5. GET DIAGNOSTICS variable = ROW_COUNT;
  6. IF variable < 10 THEN
  7.  
  8. # I don't know what to do here or how to accomplish this
  9.  
  10. END IF;
  11.  
  12. EXECUTE 'dynamic query';
  13.  
  14. GET DIAGNOSTICS variable = ROW_COUNT;
  15. IF variable >= 10 THEN
  16. RETURN QUERY EXECUTE 'dynamic query';
  17. END IF;
  18.  
  19. test=> CREATE OR REPLACE FUNCTION temptabl(cnt integer)
  20. RETURNS SETOF integer AS
  21. $body$
  22. BEGIN
  23. CREATE TEMPORARY TABLE tmp_container ON COMMIT DROP AS
  24. SELECT a
  25. FROM generate_series(1, cnt) t(a);
  26.  
  27. IF (SELECT count(1) FROM tmp_container) > 5
  28. THEN
  29. RETURN QUERY SELECT a FROM tmp_container;
  30. END IF;
  31. END;
  32. $body$
  33. LANGUAGE plpgsql;
  34.  
  35.  
  36. test=> SELECT * FROM temptabl(4);
  37. temptabl
  38. ----------
  39. (0 rows)
  40.  
  41. test=> SELECT * FROM temptabl(6);
  42. temptabl
  43. ----------
  44. 1
  45. 2
  46. 3
  47. 4
  48. 5
  49. 6
  50. (6 rows)
  51.  
  52. CREATE OR REPLACE FUNCTION f_min_records(min_ct integer = 10) -- default minimum 10
  53. RETURNS SETOF tbl AS
  54. $func$
  55. DECLARE
  56. row_ct int;
  57. BEGIN
  58. RETURN QUERY EXECUTE 'some dynamic query (matching return type)';
  59.  
  60. GET DIAGNOSTICS row_ct = ROW_COUNT;
  61.  
  62. IF row_ct < min_ct THEN
  63. RAISE EXCEPTION 'Only % rows! Requested minimum was %.', row_ct, min_ct;
  64. END IF;
  65. END
  66. $func$ LANGUAGE plpgsql;
  67.  
  68. SELECT * FROM f_min_records_wrapper();
  69.  
  70. CREATE OR REPLACE FUNCTION f_min_records(min_ct integer = 10) -- default minimum 10
  71. RETURNS SETOF t AS
  72. $func$
  73. DECLARE
  74. row_ct int;
  75. BEGIN
  76. RETURN QUERY EXECUTE 'SELECT * from t'; -- some dynamic query (matching return type)
  77.  
  78. GET DIAGNOSTICS row_ct = ROW_COUNT;
  79.  
  80. IF row_ct < min_ct THEN
  81. RAISE SQLSTATE 'BRRRR' -- 5 ASCII chars
  82. USING MESSAGE = format('Only %s rows! Requested minimum was %s.', row_ct, min_ct);
  83. END IF;
  84.  
  85. END
  86. $func$ LANGUAGE plpgsql;
  87.  
  88. CREATE OR REPLACE FUNCTION f_min_records_wrapper(min_ct integer = 10)
  89. RETURNS SETOF t AS
  90. $func$
  91. BEGIN
  92. RETURN QUERY
  93. SELECT * from f_min_records(min_ct);
  94.  
  95. EXCEPTION
  96. WHEN SQLSTATE 'BRRRR' THEN
  97. RAISE NOTICE '%', SQLERRM; -- optionally pass error msg
  98. END
  99. $func$ LANGUAGE plpgsql;
  100.  
  101. SELECT * FROM f_min_records_wrapper(17);
  102.  
  103. CREATE OR REPLACE FUNCTION f_temptbl(min_ct integer = 10)
  104. RETURNS SETOF t AS
  105. $func$
  106. DECLARE
  107. row_ct int;
  108. BEGIN
  109. DROP TABLE IF EXISTS _temptbl; -- for mult. calls in 1 transaction
  110. CREATE TEMP TABLE _temptbl (LIKE t) ON COMMIT DROP; -- match RETURNS type
  111.  
  112. EXECUTE 'INSERT INTO _temptbl SELECT * FROM t'; -- text with dyn SQL
  113.  
  114. GET DIAGNOSTICS row_ct = ROW_COUNT;
  115.  
  116. IF row_ct >= min_ct THEN
  117. RETURN QUERY TABLE _temptbl;
  118. END IF;
  119. END;
  120. $func$ LANGUAGE plpgsql;
  121.  
  122. RETURN CANCEL;
  123.  
  124. RETURN CANCEL 10;
Add Comment
Please, Sign In to add comment