funcs.source
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:5k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. ---------------------------------------------------------------------------
  2. --
  3. -- funcs.sql-
  4. --   Tutorial on using functions in POSTGRES.
  5. --
  6. --
  7. -- Copyright (c) 1994-5, Regents of the University of California
  8. --
  9. -- $Id: funcs.source,v 1.3 1999/03/14 15:22:15 momjian Exp $
  10. --
  11. ---------------------------------------------------------------------------
  12. -----------------------------
  13. -- Creating SQL Functions on Base Types
  14. -- a CREATE FUNCTION statement lets you create a new function that
  15. -- can be used in expressions (in SELECT, INSERT, etc.). We will start
  16. -- with functions that return values of base types.
  17. -----------------------------
  18. --
  19. -- let's create a simple SQL function that takes no arguments and 
  20. -- returns 1
  21. CREATE FUNCTION one() RETURNS int4
  22.    AS 'SELECT 1 as ONE' LANGUAGE 'sql';
  23. --
  24. -- functions can be used in any expressions (eg. in the target list or 
  25. -- qualifications)
  26. SELECT one() AS answer;
  27. --
  28. -- here's how you create a function that takes arguments. The following
  29. -- function returns the sum of its two arguments:
  30. CREATE FUNCTION add_em(int4, int4) RETURNS int4
  31.    AS 'SELECT $1 + $2' LANGUAGE 'sql';
  32. SELECT add_em(1, 2) AS answer;
  33. -----------------------------
  34. -- Creating SQL Functions on Composite Types
  35. -- it is also possible to create functions that return values of
  36. -- composite types.
  37. -----------------------------
  38. -- before we create more sophisticated functions, let's populate an EMP
  39. -- table
  40. CREATE TABLE EMP (
  41. name text,
  42. salary int4,
  43. age int4,
  44. cubicle point
  45. );
  46. INSERT INTO EMP VALUES ('Sam', 1200, 16, '(1,1)');
  47. INSERT INTO EMP VALUES ('Claire', 5000, 32, '(1,2)');
  48. INSERT INTO EMP VALUES ('Andy', -1000, 2, '(1,3)');
  49. INSERT INTO EMP VALUES ('Bill', 4200, 36, '(2,1)');
  50. INSERT INTO EMP VALUES ('Ginger', 4800, 30, '(2,4)');
  51. -- the argument of a function can also be a tuple. For instance, 
  52. -- double_salary takes a tuple of the EMP table
  53. CREATE FUNCTION double_salary(EMP) RETURNS int4
  54.    AS 'SELECT $1.salary * 2 AS salary' LANGUAGE 'sql';
  55. SELECT name, double_salary(EMP) AS dream
  56. FROM EMP
  57. WHERE EMP.cubicle ~= '(2,1)'::point;
  58. -- the return value of a function can also be a tuple. However, make sure 
  59. -- that the expressions in the target list is in the same order as the 
  60. -- columns of EMP.
  61. CREATE FUNCTION new_emp() RETURNS EMP
  62.    AS 'SELECT 'None'::text AS name,
  63.   1000 AS salary,
  64.   25 AS age,
  65.   '(2,2)'::point AS cubicle'
  66.    LANGUAGE 'sql';
  67. -- you can then project a column out of resulting the tuple by using the
  68. -- "function notation" for projection columns. (ie. bar(foo) is equivalent
  69. -- to foo.bar) Note that we don't support new_emp().name at this moment.
  70. SELECT name(new_emp()) AS nobody;
  71. -- let's try one more function that returns tuples
  72. CREATE FUNCTION high_pay() RETURNS setof EMP
  73.    AS 'SELECT * FROM EMP where salary > 1500'
  74.    LANGUAGE 'sql';
  75. SELECT name(high_pay()) AS overpaid;
  76. -----------------------------
  77. -- Creating SQL Functions with multiple SQL statements
  78. -- you can also create functions that do more than just a SELECT.
  79. --
  80. -- 14MAR99 Clark Evans: Does not quite work, commented out for now.
  81. --
  82. -----------------------------
  83. -- you may have noticed that Andy has a negative salary. We'll create a
  84. -- function that removes employees with negative salaries.
  85. --
  86. -- SELECT * FROM EMP;
  87. --
  88. -- CREATE FUNCTION clean_EMP () RETURNS int4
  89. --   AS 'DELETE FROM EMP WHERE EMP.salary <= 0;
  90. --   SELECT 1 AS ignore_this'
  91. --   LANGUAGE 'sql';
  92. --
  93. -- SELECT clean_EMP();
  94. --
  95. -- SELECT * FROM EMP;
  96. -----------------------------
  97. -- Creating C Functions
  98. -- in addition to SQL functions, you can also create C functions. 
  99. -- See funcs.c for the definition of the C functions.
  100. -----------------------------
  101. CREATE FUNCTION add_one(int4) RETURNS int4
  102.    AS '_OBJWD_/funcs.so' LANGUAGE 'c';
  103. CREATE FUNCTION makepoint(point, point) RETURNS point
  104.    AS '_OBJWD_/funcs.so' LANGUAGE 'c';
  105. CREATE FUNCTION copytext(text) RETURNS text
  106.    AS '_OBJWD_/funcs.so' LANGUAGE 'c';
  107. CREATE FUNCTION c_overpaid(EMP, int4) RETURNS bool
  108.    AS '_OBJWD_/funcs.so' LANGUAGE 'c';
  109. SELECT add_one(3) AS four;
  110. SELECT makepoint('(1,2)'::point, '(3,4)'::point ) AS newpoint;
  111. SELECT copytext('hello world!');
  112. SELECT name, c_overpaid(EMP, 1500) AS overpaid
  113. FROM EMP 
  114. WHERE name = 'Bill' or name = 'Sam';
  115. -- remove functions that were created in this file
  116. DROP FUNCTION c_overpaid(EMP, int4);
  117. DROP FUNCTION copytext(text);
  118. DROP FUNCTION makepoint(point,point);
  119. DROP FUNCTION add_one(int4);
  120. DROP FUNCTION clean_EMP();
  121. DROP FUNCTION high_pay();
  122. DROP FUNCTION new_emp();
  123. DROP FUNCTION add_em(int4, int4);
  124. DROP FUNCTION one();
  125. DROP TABLE EMP;