Advertisement
Guest User

Untitled

a guest
Jan 14th, 2018
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- PostgreSQL
  2.  
  3. CREATE OR REPLACE FUNCTION f_get_airline_info(my_airline_code CHAR(2))
  4. RETURNS SETOF REFCURSOR
  5. AS $$
  6. DECLARE
  7.     c1 REFCURSOR = 'cursor1';
  8.     c2 REFCURSOR = 'cursor2';
  9.     c3 REFCURSOR = 'cursor3';
  10. BEGIN
  11.   OPEN c1 FOR
  12.     SELECT
  13.       a.name,
  14.      s.*
  15.     FROM
  16.      airlines a
  17.     INNER JOIN
  18.      schedules s ON (a.code = s.airline_code)
  19.     WHERE
  20.      a.code = my_airline_code;
  21.   RETURN NEXT c1;
  22.  
  23.   OPEN c2 FOR
  24.     SELECT
  25.      a.name,
  26.      f.*
  27.     FROM
  28.      airlines a
  29.     INNER JOIN
  30.      flights f ON (a.code = f.airline_code)
  31.     WHERE
  32.      a.code = my_airline_code;
  33.   RETURN NEXT c2;
  34.  
  35.   OPEN c3 FOR
  36.     SELECT
  37.      a.name,
  38.      b.*
  39.     FROM
  40.      airlines a
  41.     INNER JOIN
  42.      bookings b ON (a.code = b.airline_code)
  43.     WHERE
  44.      a.code = my_airline_code;
  45.   RETURN NEXT c3;
  46. END;
  47. $$ LANGUAGE plpgsql@
  48.  
  49. BEGIN;
  50. SELECT f_get_airline_info('AA');
  51. FETCH ALL IN cursor1;
  52. FETCH ALL IN cursor2;
  53. FETCH ALL IN cursor3;
  54. COMMIT;
  55.  
  56.  
  57. CREATE OR REPLACE FUNCTION f_get_schedules_by_date_and_country(my_flight_date DATE, my_dept_country CHAR(3))
  58. RETURNS TABLE(
  59.   airline_name VARCHAR(20),
  60.   flight_number INTEGER,
  61.   flight_date DATE,
  62.   dept_country CHAR(2),
  63.   dept_city VARCHAR(20),
  64.   dept_time TIME,
  65.   arrv_country CHAR(2),
  66.   arrv_city VARCHAR(20),
  67.   arrv_time TIME
  68. )
  69. AS $$
  70. BEGIN
  71.   RETURN QUERY(
  72.     SELECT
  73.       a.name,
  74.       f.flight_number,
  75.       f.flight_date,
  76.       s.dept_country,
  77.       s.dept_city,
  78.       s.dept_time,
  79.       s.arrv_country,
  80.       s.arrv_city,
  81.       s.arrv_time
  82.     FROM
  83.       airlines a
  84.     INNER JOIN
  85.       flights f ON (a.code = f.airline_code)
  86.     INNER JOIN
  87.       schedules s ON (f.flight_number = s.flight_number)
  88.     WHERE
  89.       f.flight_date = my_flight_date AND
  90.       s.dept_country = my_dept_country
  91.   );
  92. END;
  93. $$ LANGUAGE plpgsql;
  94.  
  95. SELECT *
  96. FROM f_get_schedules_by_date_and_country('2012-05-23', 'US');
  97.  
  98. SELECT *
  99. FROM f_get_schedules_by_date_and_country('2018-01-14', 'US');
  100.  
  101.  
  102. CREATE OR REPLACE FUNCTION get_customers_by_flight(my_flight_number INTEGER)
  103. RETURNS TABLE(
  104.   customer_name VARCHAR(100)
  105. )
  106. AS $$
  107.   SELECT
  108.     DISTINCT customer_name
  109.   FROM
  110.     bookings
  111.   WHERE
  112.     flight_number = my_flight_number;
  113. $$ LANGUAGE SQL@
  114.  
  115. SELECT *
  116. FROM get_customers_by_flight(1000)
  117.  
  118. SELECT *
  119. FROM get_customers_by_flight(1030)
  120.  
  121.  
  122. CREATE OR REPLACE FUNCTION f_get_more_info(my_flight_number INTEGER)
  123. RETURNS SETOF REFCURSOR
  124. AS $$
  125. DECLARE
  126.     c1 REFCURSOR = 'cursor1';
  127.     c2 REFCURSOR = 'cursor2';
  128. BEGIN
  129.   OPEN c1 FOR
  130.     SELECT
  131.       customer_name
  132.     FROM
  133.       get_customers_by_flight(my_flight_number);
  134.   RETURN NEXT c1;
  135.  
  136.   OPEN c2 FOR
  137.     SELECT
  138.       c.customer_name,
  139.       a.name,
  140.       COUNT(a.name) AS number_of_reservations
  141.     FROM
  142.       airlines a
  143.     INNER JOIN
  144.       bookings b ON (a.code = b.airline_code)
  145.     INNER JOIN
  146.       (SELECT * FROM get_customers_by_flight(my_flight_number)) AS c ON (c.customer_name = b.customer_name)
  147.     WHERE
  148.       EXTRACT(YEAR FROM b.order_date) = '2012'
  149.     GROUP BY
  150.       c.customer_name, a.name
  151.     HAVING
  152.       COUNT(a.name) >= 2
  153.     ORDER BY
  154.       number_of_reservations;
  155.   RETURN NEXT c2;
  156. END;
  157. $$ LANGUAGE plpgsql@
  158.  
  159. BEGIN;
  160. SELECT f_get_more_info(1030);
  161. FETCH ALL IN cursor1;
  162. FETCH ALL IN cursor2;
  163. COMMIT;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement