http://www.postgresonline.com/journal/archives/201-Using-RETURNS-TABLE-vs.-OUT-parameters.html

http://www.postgresql.org/docs/9.4/interactive/index.html

  1. --http://www.postgresonline.com/journal/archives/201-Using-RETURNS-TABLE-vs.-OUT-parameters.html
  2. --ver:9.3 Geovin Du 涂聚文
  3. --returning a single record using SQL function
  4. CREATE OR REPLACE FUNCTION fn_sqltestout(param_subject text, pos integer)
  5. RETURNS TABLE(subject_scramble text, subject_char text)
  6. AS
  7. $$
  8. SELECT substring($1, 1,CAST(random()*length($1) As integer)) ,
  9. substring($1, 1,1) As subject_char;
  10. $$
  11. LANGUAGE 'sql' VOLATILE;
  12. -- example use
  13. SELECT (fn_sqltestout('This is a test subject',1)).subject_scramble;
  14. SELECT subject_scramble, subject_char FROM fn_sqltestout('This is a test subject',5);
  15.  
  16. --Same function but written in plpgsql
  17. --PLPGSQL example -- return one record
  18. CREATE OR REPLACE FUNCTION fn_plpgsqltestout(param_subject varchar)
  19. RETURNS TABLE(subject_scramble varchar, subject_char varchar)
  20. AS
  21. $$
  22. BEGIN
  23. subject_scramble := substring($1, 1,CAST(random()*length($1) As varchar));
  24. subject_char := substring($1, 1,1);
  25. RETURN NEXT;
  26. END;
  27. $$
  28. LANGUAGE 'plpgsql' VOLATILE;
  29.  
  30. -- example use
  31. SELECT (fn_plpgsqltestout('This is a test subject')).subject_scramble;
  32. SELECT subject_scramble, subject_char FROM fn_plpgsqltestout('This is a test subject');
  33.  
  34. -- test data to use --
  35. CREATE TABLE testtable(id integer PRIMARY KEY, test text);
  36. INSERT INTO testtable(id,test)
  37. VALUES (1, 'Potato'), (2, 'Potato'), (3, 'Cheese'), (4, 'Cheese Dog');
  38.  
  39. --SQL function returning multiple records
  40. CREATE OR REPLACE FUNCTION fn_sqltestmulti(param_subject varchar)
  41. RETURNS TABLE(test_id integer, test_stuff text)
  42. AS
  43. $$
  44. SELECT id, test
  45. FROM testtable WHERE test LIKE $1;
  46. $$
  47. LANGUAGE 'sql' VOLATILE;
  48.  
  49. -- example use
  50. SELECT (fn_sqltestmulti('Cheese%')).test_stuff;
  51. SELECT test_stuff FROM fn_sqltestmulti('Cheese%');
  52.  
  53. -- plpgsql function returning multiple records
  54. -- note RETURN QUERY was introduced in 8.3
  55. -- variant 1
  56. CREATE OR REPLACE FUNCTION fn_plpgsqltestmulti(param_subject varchar)
  57. RETURNS TABLE(test_id integer, test_stuff text)
  58. AS
  59. $$
  60. BEGIN
  61. RETURN QUERY SELECT id, test
  62. FROM testtable WHERE test LIKE param_subject;
  63. END;
  64. $$
  65. LANGUAGE 'plpgsql' VOLATILE;
  66.  
  67. --测试
  68. select * from fn_plpgsqltestmulti('Cheese%');
  69.  
  70. -- variant 2 use this if you need to do something additional
  71. -- or conditionally return values or more dynamic stuff
  72. -- RETURN QUERY is generally more succinct and faster
  73. CREATE OR REPLACE FUNCTION fn_plpgsqltestmulti(param_subject varchar)
  74. RETURNS TABLE(test_id integer, test_stuff text)
  75. AS
  76. $$
  77. DECLARE
  78. var_r record;
  79. BEGIN
  80. FOR var_r IN(SELECT id, test
  81. FROM testtable WHERE test LIKE param_subject) LOOP
  82. test_id := var_r.id ; test_stuff := var_r.test;
  83. RETURN NEXT;
  84. END LOOP;
  85. END;
  86. $$
  87. LANGUAGE 'plpgsql' VOLATILE;
  88. -- example use
  89. -- This is legal in PostgreSQL 8.4+
  90. -- (prior versions plpgsql could not be called this way)
  91. SELECT (fn_plpgsqltestmulti('Cheese%')).test_stuff;
  92.  
  93. SELECT * FROM fn_plpgsqltestmulti('Cheese%');

  

  1. --函数 涂聚文 Geovin Du
  2. CREATE FUNCTION check_password(uname TEXT, pass TEXT)
  3. RETURNS BOOLEAN AS $$
  4. DECLARE passed BOOLEAN;
  5. BEGIN
  6. SELECT (pwd = $2) INTO passed
  7. FROM pwds
  8. WHERE username = $1;
  9.  
  10. RETURN passed;
  11. END;
  12. $$ LANGUAGE plpgsql
  13. SECURITY DEFINER
  14. -- Set a secure search_path: trusted schema(s), then 'pg_temp'.
  15. SET search_path = admin, pg_temp;
  16.  
  17. ---http://www.postgresql.org/docs/current/static/sql-createfunction.html
  18. CREATE OR REPLACE function f_GetDepartmentName
  19. (
  20. did integer
  21. )
  22. returns varchar as $$
  23. declare str varchar;
  24. begin
  25. select DepartmentName INTO str from DepartmentList where DepartmentID=did;
  26. return str;
  27. end;
  28. $$language plpgsql;
  29.  
  30. --测试
  31. select f_GetDepartmentName(1) as name;
  32.  
  33. --( (select DepartmentName from DepartmentList where DepartmentID = in_id) union (select name from test_result2 where id = in_id) )
  34. CREATE OR REPLACE FUNCTION func_DepartmentMore ( in_id integer)
  35. RETURNS SETOF varchar as
  36. $$
  37. DECLARE
  38. v_name varchar;
  39. BEGIN
  40. for v_name in (select DepartmentName from DepartmentList where DepartmentID = in_id)loop
  41. RETURN NEXT v_name;
  42. end loop;
  43. return;
  44. END;
  45. $$
  46. LANGUAGE PLPGSQL;
  47. ---
  48. select func_DepartmentMore(1);
  49.  
  50. ---
  51.  
  52. CREATE OR REPLACE FUNCTION func_DepartmentName_muti (in_id integer)
  53. RETURNS SETOF RECORD as
  54. $$
  55. DECLARE
  56. v_rec RECORD;
  57. BEGIN
  58.  
  59. for v_rec in (select DepartmentID,DepartmentName from DepartmentList where DepartmentID = in_id)loop
  60. RETURN NEXT v_rec;
  61. end loop;
  62. return;
  63. END;
  64. $$
  65. LANGUAGE PLPGSQL;
  66.  
  67. --测试
  68. select * from func_DepartmentName_muti(1) t(DepartmentID integer,DepartmentName varchar);
  69.  
  70. CREATE OR REPLACE FUNCTION func_DepartmentName_query ( in_id integer)
  71. RETURNS SETOF RECORD as
  72. $$
  73. DECLARE
  74. v_rec RECORD;
  75. BEGIN
  76.  
  77. return query(select DepartmentID,DepartmentName from DepartmentList where DepartmentID = in_id);
  78. return;
  79. END;
  80. $$
  81. LANGUAGE PLPGSQL;
  82.  
  83. --测试
  84. select * from func_DepartmentName_query(1) t(DepartmentID integer,DepartmentName varchar);
  85.  
  86. ---http://www.postgresonline.com/journal/archives/129-Use-of-OUT-and-INOUT-Parameters.html
  87. CREATE OR REPLACE FUNCTION func_DepartmentName_out( in_id integer,out o_id integer,out o_name varchar)
  88. RETURNS SETOF RECORD as
  89. $$
  90. DECLARE
  91. v_rec RECORD;
  92. BEGIN
  93. for v_rec in ( select DepartmentID,DepartmentName from DepartmentList where DepartmentID = in_id)loop
  94. o_id := v_rec.DepartmentID;
  95. o_name := v_rec.DepartmentName;
  96. RETURN NEXT ;
  97. end loop;
  98. return;
  99. END;
  100. $$
  101. LANGUAGE PLPGSQL;
  102.  
  103. --测试
  104.  
  105. select DepartmentID,DepartmentName from DepartmentList
  106.  
  107. select * from func_DepartmentName_out(1);
  108.  
  109. select * from func_DepartmentName_out(2);
  110.  
  111. ---
  112. CREATE OR REPLACE FUNCTION func_table(in_id int) RETURNS TABLE(f1 int, f2 varchar)
  113. AS
  114. $$
  115. begin
  116. SELECT f1=DepartmentID, f2=DepartmentName from DepartmentList where DepartmentID =in_id;
  117. end;
  118. $$
  119. LANGUAGE SQL;
  120.  
  121. SELECT * FROM dup(42);
  122.  
  123. CREATE OR REPLACE FUNCTION fn_plpgsqltestout(param_subject text,
  124. OUT subject_scramble text, OUT subject_char text)
  125. AS
  126. $$
  127. BEGIN
  128. subject_scramble := substring($1, 1,CAST(random()*length($1) As integer));
  129. subject_char := substring($1, 1,1);
  130. END;
  131. $$
  132. LANGUAGE 'plpgsql' VOLATILE;
  133.  
  134. --测试
  135.  
  136. select fn_plpgsqltestout('geovindu');
  137.  
  138. CREATE OR REPLACE FUNCTION fn_sqltestmulti(param_subject varchar,
  139. OUT test_id integer,
  140. OUT test_stuff text)
  141. RETURNS SETOF record
  142. AS
  143. $$
  144. SELECT DepartmentID,DepartmentName
  145. FROM DepartmentList where DepartmentName LIKE $1;
  146. $$
  147. LANGUAGE 'sql' VOLATILE;
  148.  
  149. --测试
  150. SELECT * FROM fn_sqltestmulti('%d%');
  151. --OUT takes precendence which is why we prefix the table columns
  152. CREATE OR REPLACE FUNCTION fn_plpgsqltestmulti(
  153. param_subject varchar,
  154. OUT test_id integer,
  155. OUT test_stuff varchar)
  156. RETURNS SETOF record
  157. AS
  158. $$
  159. BEGIN
  160. RETURN QUERY SELECT t.DepartmentID , t.DepartmentName
  161. FROM DepartmentList As t
  162. WHERE t.DepartmentName LIKE param_subject;
  163. END;
  164. $$
  165. LANGUAGE 'plpgsql' VOLATILE;
  166.  
  167. SELECT * FROM fn_plpgsqltestmulti('%d%',1, 'd');

  

sql:PostgreSQL9.3 Using RETURNS TABLE vs. OUT parameters的更多相关文章

  1. PL/pgSQL RETURNS TABLE 例子

    实验如下: RETURNS TABLE 中的变量名和SQL文中的变量名同名时,执行时会出错: pgsql=# create table sales(itemno integer,quantity in ...

  2. SQL Azure (18) 使用External Table实现垮库查询

    <Windows Azure Platform 系列文章目录> 问题 1.我们在进行SQL Server开发的时候,经常会使用垮库查询.但是在默认情况下,使用Azure SQL Datab ...

  3. 转载:SQL Server 2008-建立分区表(Table Partition) 转载

    数据库结构和索引的是否合理在很大程度上影响了数据库的性能,但是随着数据库信息负载的增大,对数据库的性能也发生了很大的影响.可能我们的数据库在一开始有着很高的性能,但是随着数据存储量的急速增长—例如订单 ...

  4. 传入sql数组字符串,输出table

    CREATE function [dbo].[split](@aString varchar(),@pattern varchar()) returns @temp table([Sid] [, ) ...

  5. linux之SQL语句简明教程---CREATE TABLE

    表格是数据库中储存资料的基本架构.在绝大部份的情况下,数据库厂商不可能知道您需要如何储存您的资料,所以通常您会需要自己在数据库中建立表格.虽然许多数据库工具可以让您在不需用到 SQL 的情况下建立表格 ...

  6. oracle学习之路(四) ---------PL/SQL 表,二维数组(TABLE)

    LOB类型 ORACLE提供了LOB (Large OBject)类型.用于存储大的数据对象的类型.ORACLE眼下主要支持BFILE, BLOB, CLOB 及 NCLOB 类型. NCLOB 存储 ...

  7. sql 将字符串转化为table

    /* *参数说明: 第一个参数为要转化的字符串,第二个参数为字符串中间的分隔符 */ ),)) )) as begin ) set @SourceSql=@SourceSql+@StrSeprate ...

  8. sql sever 授予用户create table权限

    sql server2008的用户权限管理及其细致.此处我也不知道是表扬还是批评.所以经常会遇到各种“对不起您没有**权限”的问题. 本次遇到的问题机器常见.在尝试修改数据库结构时提示"没有 ...

  9. SQL Server 2008 R2——TRUNCATE TABLE 无法截断表 该表正由 FOREIGN KEY 约束引用

    =================================版权声明================================= 版权声明:原创文章 禁止转载  请通过右侧公告中的“联系邮 ...

随机推荐

  1. jmeter - jp@gc - Active Threads Over Time(多台负载用户)

    问题: 线程数设置:30,远程启动2台机子 查看 jp@gc - Active Threads Over Time图,发现只统计了1台机子的线程数,线程数并不是60: 解决办法: 官方文档中提到: 1 ...

  2. 何在不联网的情况下ping通主机与虚拟机

    选择NAT模式,VM对windows选择ping操作时选择VMnet8的IP地址.

  3. mysql 与sqlser group by

    mysql select * ,count(1)  from simccbillm18 group by MonthNum; SqlSer select  col1,col2 from table g ...

  4. 通过MSI解压缩Cab文件

    迁移自我的Github 如果只是想做类似解压缩的操作,那么可以使用如下命令行 C:\Windows\System32\expand.exe <cab file path> -F:* < ...

  5. 【WinSCP】WinSCP 5.x使用密钥连接服务器

    在WinSCP 4.x中,主页面有一个添加密钥文件的选项,如下图所示 但是在WinSCP 5.x中主界面发生了很大的变化 在主页上没有了载入密钥文件的选项,那么我们应该怎么使用密钥验证呢? WinSC ...

  6. 模块和处理程序之通过HttpModule和HttpHandler拦截入站HTTP请求执行指定托管代码模块

    1.简介 大多数情况下,作为一个asp.net web开发对整个web应用程序的控制是十分有限的,我们的控制往往只能做到对应用程序(高层面)的基本控制.但是,很多时候,我们需要能够低级层面进行交互,例 ...

  7. 深度学习(五)正则化之L1和L2

    监督机器学习问题无非就是“minimizeyour error while regularizing your parameters”,也就是在规则化参数的同时最小化误差.最小化误差是为了让我们的模型 ...

  8. maven多模块下新建子模块

    选中parent模块,右键选择new---others 选择Maven---Maven Module,点击下一步 填写Module Name,其他默认,点击下一步 默认,下一步 默认,点击完成

  9. Code First配合Entity Framework Power Tools Beta 4使用

    基于现有数据库生成POCO数据类和数据库上下文需要借助Visual Studio一个扩展插件-- Entity Framework Power Tools(一个Code First反向工程工具).只要 ...

  10. Lineare Algebra

    Grundlegendes Wort: 矩阵列:Das Spalte von der Matrix 行列式:Die Determinante 对角矩阵:Die diagonal Matrix 逆矩阵: ...