sql:PostgreSQL9.3 Using RETURNS TABLE vs. OUT parameters
http://www.postgresonline.com/journal/archives/201-Using-RETURNS-TABLE-vs.-OUT-parameters.html
http://www.postgresql.org/docs/9.4/interactive/index.html
- --http://www.postgresonline.com/journal/archives/201-Using-RETURNS-TABLE-vs.-OUT-parameters.html
- --ver:9.3 Geovin Du 涂聚文
- --returning a single record using SQL function
- CREATE OR REPLACE FUNCTION fn_sqltestout(param_subject text, pos integer)
- RETURNS TABLE(subject_scramble text, subject_char text)
- AS
- $$
- SELECT substring($1, 1,CAST(random()*length($1) As integer)) ,
- substring($1, 1,1) As subject_char;
- $$
- LANGUAGE 'sql' VOLATILE;
- -- example use
- SELECT (fn_sqltestout('This is a test subject',1)).subject_scramble;
- SELECT subject_scramble, subject_char FROM fn_sqltestout('This is a test subject',5);
- --Same function but written in plpgsql
- --PLPGSQL example -- return one record
- CREATE OR REPLACE FUNCTION fn_plpgsqltestout(param_subject varchar)
- RETURNS TABLE(subject_scramble varchar, subject_char varchar)
- AS
- $$
- BEGIN
- subject_scramble := substring($1, 1,CAST(random()*length($1) As varchar));
- subject_char := substring($1, 1,1);
- RETURN NEXT;
- END;
- $$
- LANGUAGE 'plpgsql' VOLATILE;
- -- example use
- SELECT (fn_plpgsqltestout('This is a test subject')).subject_scramble;
- SELECT subject_scramble, subject_char FROM fn_plpgsqltestout('This is a test subject');
- -- test data to use --
- CREATE TABLE testtable(id integer PRIMARY KEY, test text);
- INSERT INTO testtable(id,test)
- VALUES (1, 'Potato'), (2, 'Potato'), (3, 'Cheese'), (4, 'Cheese Dog');
- --SQL function returning multiple records
- CREATE OR REPLACE FUNCTION fn_sqltestmulti(param_subject varchar)
- RETURNS TABLE(test_id integer, test_stuff text)
- AS
- $$
- SELECT id, test
- FROM testtable WHERE test LIKE $1;
- $$
- LANGUAGE 'sql' VOLATILE;
- -- example use
- SELECT (fn_sqltestmulti('Cheese%')).test_stuff;
- SELECT test_stuff FROM fn_sqltestmulti('Cheese%');
- -- plpgsql function returning multiple records
- -- note RETURN QUERY was introduced in 8.3
- -- variant 1
- CREATE OR REPLACE FUNCTION fn_plpgsqltestmulti(param_subject varchar)
- RETURNS TABLE(test_id integer, test_stuff text)
- AS
- $$
- BEGIN
- RETURN QUERY SELECT id, test
- FROM testtable WHERE test LIKE param_subject;
- END;
- $$
- LANGUAGE 'plpgsql' VOLATILE;
- --测试
- select * from fn_plpgsqltestmulti('Cheese%');
- -- variant 2 use this if you need to do something additional
- -- or conditionally return values or more dynamic stuff
- -- RETURN QUERY is generally more succinct and faster
- CREATE OR REPLACE FUNCTION fn_plpgsqltestmulti(param_subject varchar)
- RETURNS TABLE(test_id integer, test_stuff text)
- AS
- $$
- DECLARE
- var_r record;
- BEGIN
- FOR var_r IN(SELECT id, test
- FROM testtable WHERE test LIKE param_subject) LOOP
- test_id := var_r.id ; test_stuff := var_r.test;
- RETURN NEXT;
- END LOOP;
- END;
- $$
- LANGUAGE 'plpgsql' VOLATILE;
- -- example use
- -- This is legal in PostgreSQL 8.4+
- -- (prior versions plpgsql could not be called this way)
- SELECT (fn_plpgsqltestmulti('Cheese%')).test_stuff;
- SELECT * FROM fn_plpgsqltestmulti('Cheese%');
- --函数 涂聚文 Geovin Du
- CREATE FUNCTION check_password(uname TEXT, pass TEXT)
- RETURNS BOOLEAN AS $$
- DECLARE passed BOOLEAN;
- BEGIN
- SELECT (pwd = $2) INTO passed
- FROM pwds
- WHERE username = $1;
- RETURN passed;
- END;
- $$ LANGUAGE plpgsql
- SECURITY DEFINER
- -- Set a secure search_path: trusted schema(s), then 'pg_temp'.
- SET search_path = admin, pg_temp;
- ---http://www.postgresql.org/docs/current/static/sql-createfunction.html
- CREATE OR REPLACE function f_GetDepartmentName
- (
- did integer
- )
- returns varchar as $$
- declare str varchar;
- begin
- select DepartmentName INTO str from DepartmentList where DepartmentID=did;
- return str;
- end;
- $$language plpgsql;
- --测试
- select f_GetDepartmentName(1) as name;
- --( (select DepartmentName from DepartmentList where DepartmentID = in_id) union (select name from test_result2 where id = in_id) )
- CREATE OR REPLACE FUNCTION func_DepartmentMore ( in_id integer)
- RETURNS SETOF varchar as
- $$
- DECLARE
- v_name varchar;
- BEGIN
- for v_name in (select DepartmentName from DepartmentList where DepartmentID = in_id)loop
- RETURN NEXT v_name;
- end loop;
- return;
- END;
- $$
- LANGUAGE PLPGSQL;
- ---
- select func_DepartmentMore(1);
- ---
- CREATE OR REPLACE FUNCTION func_DepartmentName_muti (in_id integer)
- RETURNS SETOF RECORD as
- $$
- DECLARE
- v_rec RECORD;
- BEGIN
- for v_rec in (select DepartmentID,DepartmentName from DepartmentList where DepartmentID = in_id)loop
- RETURN NEXT v_rec;
- end loop;
- return;
- END;
- $$
- LANGUAGE PLPGSQL;
- --测试
- select * from func_DepartmentName_muti(1) t(DepartmentID integer,DepartmentName varchar);
- CREATE OR REPLACE FUNCTION func_DepartmentName_query ( in_id integer)
- RETURNS SETOF RECORD as
- $$
- DECLARE
- v_rec RECORD;
- BEGIN
- return query(select DepartmentID,DepartmentName from DepartmentList where DepartmentID = in_id);
- return;
- END;
- $$
- LANGUAGE PLPGSQL;
- --测试
- select * from func_DepartmentName_query(1) t(DepartmentID integer,DepartmentName varchar);
- ---http://www.postgresonline.com/journal/archives/129-Use-of-OUT-and-INOUT-Parameters.html
- CREATE OR REPLACE FUNCTION func_DepartmentName_out( in_id integer,out o_id integer,out o_name varchar)
- RETURNS SETOF RECORD as
- $$
- DECLARE
- v_rec RECORD;
- BEGIN
- for v_rec in ( select DepartmentID,DepartmentName from DepartmentList where DepartmentID = in_id)loop
- o_id := v_rec.DepartmentID;
- o_name := v_rec.DepartmentName;
- RETURN NEXT ;
- end loop;
- return;
- END;
- $$
- LANGUAGE PLPGSQL;
- --测试
- select DepartmentID,DepartmentName from DepartmentList
- select * from func_DepartmentName_out(1);
- select * from func_DepartmentName_out(2);
- ---
- CREATE OR REPLACE FUNCTION func_table(in_id int) RETURNS TABLE(f1 int, f2 varchar)
- AS
- $$
- begin
- SELECT f1=DepartmentID, f2=DepartmentName from DepartmentList where DepartmentID =in_id;
- end;
- $$
- LANGUAGE SQL;
- SELECT * FROM dup(42);
- CREATE OR REPLACE FUNCTION fn_plpgsqltestout(param_subject text,
- OUT subject_scramble text, OUT subject_char text)
- AS
- $$
- BEGIN
- subject_scramble := substring($1, 1,CAST(random()*length($1) As integer));
- subject_char := substring($1, 1,1);
- END;
- $$
- LANGUAGE 'plpgsql' VOLATILE;
- --测试
- select fn_plpgsqltestout('geovindu');
- CREATE OR REPLACE FUNCTION fn_sqltestmulti(param_subject varchar,
- OUT test_id integer,
- OUT test_stuff text)
- RETURNS SETOF record
- AS
- $$
- SELECT DepartmentID,DepartmentName
- FROM DepartmentList where DepartmentName LIKE $1;
- $$
- LANGUAGE 'sql' VOLATILE;
- --测试
- SELECT * FROM fn_sqltestmulti('%d%');
- --OUT takes precendence which is why we prefix the table columns
- CREATE OR REPLACE FUNCTION fn_plpgsqltestmulti(
- param_subject varchar,
- OUT test_id integer,
- OUT test_stuff varchar)
- RETURNS SETOF record
- AS
- $$
- BEGIN
- RETURN QUERY SELECT t.DepartmentID , t.DepartmentName
- FROM DepartmentList As t
- WHERE t.DepartmentName LIKE param_subject;
- END;
- $$
- LANGUAGE 'plpgsql' VOLATILE;
- SELECT * FROM fn_plpgsqltestmulti('%d%',1, 'd');
sql:PostgreSQL9.3 Using RETURNS TABLE vs. OUT parameters的更多相关文章
- PL/pgSQL RETURNS TABLE 例子
实验如下: RETURNS TABLE 中的变量名和SQL文中的变量名同名时,执行时会出错: pgsql=# create table sales(itemno integer,quantity in ...
- SQL Azure (18) 使用External Table实现垮库查询
<Windows Azure Platform 系列文章目录> 问题 1.我们在进行SQL Server开发的时候,经常会使用垮库查询.但是在默认情况下,使用Azure SQL Datab ...
- 转载:SQL Server 2008-建立分区表(Table Partition) 转载
数据库结构和索引的是否合理在很大程度上影响了数据库的性能,但是随着数据库信息负载的增大,对数据库的性能也发生了很大的影响.可能我们的数据库在一开始有着很高的性能,但是随着数据存储量的急速增长—例如订单 ...
- 传入sql数组字符串,输出table
CREATE function [dbo].[split](@aString varchar(),@pattern varchar()) returns @temp table([Sid] [, ) ...
- linux之SQL语句简明教程---CREATE TABLE
表格是数据库中储存资料的基本架构.在绝大部份的情况下,数据库厂商不可能知道您需要如何储存您的资料,所以通常您会需要自己在数据库中建立表格.虽然许多数据库工具可以让您在不需用到 SQL 的情况下建立表格 ...
- oracle学习之路(四) ---------PL/SQL 表,二维数组(TABLE)
LOB类型 ORACLE提供了LOB (Large OBject)类型.用于存储大的数据对象的类型.ORACLE眼下主要支持BFILE, BLOB, CLOB 及 NCLOB 类型. NCLOB 存储 ...
- sql 将字符串转化为table
/* *参数说明: 第一个参数为要转化的字符串,第二个参数为字符串中间的分隔符 */ ),)) )) as begin ) set @SourceSql=@SourceSql+@StrSeprate ...
- sql sever 授予用户create table权限
sql server2008的用户权限管理及其细致.此处我也不知道是表扬还是批评.所以经常会遇到各种“对不起您没有**权限”的问题. 本次遇到的问题机器常见.在尝试修改数据库结构时提示"没有 ...
- SQL Server 2008 R2——TRUNCATE TABLE 无法截断表 该表正由 FOREIGN KEY 约束引用
=================================版权声明================================= 版权声明:原创文章 禁止转载 请通过右侧公告中的“联系邮 ...
随机推荐
- jmeter - jp@gc - Active Threads Over Time(多台负载用户)
问题: 线程数设置:30,远程启动2台机子 查看 jp@gc - Active Threads Over Time图,发现只统计了1台机子的线程数,线程数并不是60: 解决办法: 官方文档中提到: 1 ...
- 何在不联网的情况下ping通主机与虚拟机
选择NAT模式,VM对windows选择ping操作时选择VMnet8的IP地址.
- mysql 与sqlser group by
mysql select * ,count(1) from simccbillm18 group by MonthNum; SqlSer select col1,col2 from table g ...
- 通过MSI解压缩Cab文件
迁移自我的Github 如果只是想做类似解压缩的操作,那么可以使用如下命令行 C:\Windows\System32\expand.exe <cab file path> -F:* < ...
- 【WinSCP】WinSCP 5.x使用密钥连接服务器
在WinSCP 4.x中,主页面有一个添加密钥文件的选项,如下图所示 但是在WinSCP 5.x中主界面发生了很大的变化 在主页上没有了载入密钥文件的选项,那么我们应该怎么使用密钥验证呢? WinSC ...
- 模块和处理程序之通过HttpModule和HttpHandler拦截入站HTTP请求执行指定托管代码模块
1.简介 大多数情况下,作为一个asp.net web开发对整个web应用程序的控制是十分有限的,我们的控制往往只能做到对应用程序(高层面)的基本控制.但是,很多时候,我们需要能够低级层面进行交互,例 ...
- 深度学习(五)正则化之L1和L2
监督机器学习问题无非就是“minimizeyour error while regularizing your parameters”,也就是在规则化参数的同时最小化误差.最小化误差是为了让我们的模型 ...
- maven多模块下新建子模块
选中parent模块,右键选择new---others 选择Maven---Maven Module,点击下一步 填写Module Name,其他默认,点击下一步 默认,下一步 默认,点击完成
- Code First配合Entity Framework Power Tools Beta 4使用
基于现有数据库生成POCO数据类和数据库上下文需要借助Visual Studio一个扩展插件-- Entity Framework Power Tools(一个Code First反向工程工具).只要 ...
- Lineare Algebra
Grundlegendes Wort: 矩阵列:Das Spalte von der Matrix 行列式:Die Determinante 对角矩阵:Die diagonal Matrix 逆矩阵: ...