array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 PostgreSQL数据库PL/PGSQL学习使用 - 爱码网

基本结构

create or replace function somefunc() 
returns varchar as 
$$
declare
   name varchar := 'wangzhen';
begin
   return name;
end   
$$ language plpgsql ;

$$作用

  • 函数代码在function中实际上为一个字符串,代码1和代码2等价,但代码中字符串的单引号需要写两个进行转义。
-- 代码1
create or replace function somefunc() 
returns varchar as 
$$
declare
   name varchar := 'wangzhen';
begin
   return name;
end   
$$ language plpgsql ;

--代码2
create or replace function somefunc() 
returns varchar as 
'
declare
   name varchar := ''wangzhen'';
begin
   return name;
end   
' language plpgsql ;
  • "美元符引用”书写字符串常量,使单引号、反斜线、$符等按照字面值进行解释,不需要写两个或在4个或着更多进行转义,代码3和代码4等价。
--代码3
create or replace function somefunc() 
returns varchar as 
$$
declare
   name varchar := 'wangzhen''blog';
begin
   return name;
end   
$$ language plpgsql ;
--代码4
create or replace function somefunc() 
returns varchar as 
$$
declare
   name varchar := $tag$wangzhen'blog$tag$;
begin
   return name;
end   
$$ language plpgsql ;
  • $中间可以包含可选的标签,但是标签要成对出现,且大小写敏感。代码5和代码6和代码7等价。
--代码5
create or replace function somefunc() 
returns varchar as 
$body$
declare
   name varchar := $tag$wangzhen'blog$tag$;
begin
   return name;
end   
$body$ language plpgsql ;
--代码6
create or replace function somefunc() 
returns varchar as 
$func$
declare
   name varchar := $$wangzhen'blog$$;
begin
   return name;
end   
$func$ language plpgsql ;
--代码7
create or replace function somefunc() 
returns varchar as 
$$
declare
   name varchar := 'wangzhen''blog';
begin
   return name;
end   
$$ language plpgsql ;

代码块

  • 块名可选,代码8和9等价
--代码8
create or replace function somefunc() 
returns varchar as
$$
<<outblock>>
declare 
   name varchar := 'wangzhen';
begin
   return outblock.name;
end;        
$$ language plpgsql; 
--代码9
create or replace function somefunc() 
returns varchar as
$$
declare 
   name varchar := 'wangzhen';
begin
   return name;
end;        
$$ language plpgsql; 
  • 块可嵌套,内层同名变量覆盖外层同名变量,可通过指定块名引用。
--代码10
create or replace function somefunc() 
returns varchar as
$$
<<outblock>>
declare 
   name varchar := 'wangzhen';
begin
   <<innerblock>>
   declare 
      name varchar := 'xiaozhang';
   begin
      outblock.name = innerblock.name;
   end;   
   return outblock.name;
end;        
$$ language plpgsql; 
abase=# select somefunc();
 somefunc  
-----------
 xiaozhang

  • 函数体是一个隐藏的块,块名是函数名。
--代码11
create or replace function somefunc(name varchar) 
returns varchar as
$$
<<outblock>>
declare 
   name varchar := somefunc.name;
begin
   return outblock.name;
end;        
$$ language plpgsql; 
abase=# select somefunc('xiaoli');
 somefunc 
----------
 xiaoli
(1 row)

命名参数

  • 在函数声明时直接命名参数
--代码12
create or replace function somefunc(newname varchar) 
returns varchar as
$$
declare 
   name varchar := newname;
begin
   return name;
end;        
$$ language plpgsql; 
  • 使用别名和美元符号
--代码13
create or replace function somefunc(varchar,varchar) 
returns varchar as
$$
declare 
   newname alias for $1;
   name varchar := newname;
   name2 varchar := $2;
begin
   return name;
end;        
$$ language plpgsql; 

执行SQL

  • 没有返回结果的SQL可以直接执行
--代码14
create or replace function somefunc2() 
returns void as
$$
begin
   create table test1 (n_id integer,c_mc varchar(300));
   insert into test1 (n_id,c_mc) values (1,'wangzhen');
end;        
$$ language plpgsql; 
  • 不需要返回结果的select可以通过perform执行。perform替换select
--代码15
create or replace function somefunc3() 
returns void as
$$
begin
   perform * from test1;
end;        
$$ language plpgsql; 
--代码16
create or replace function somefunc3() 
returns void as
$$
begin
   perform somefunc();
   --perform 怎么处理with和其他复杂查询?
end;        
$$ language plpgsql; 
  • 执行动态拼接SQL
--代码17
create or replace function somefunc3() 
returns void as
$$
declare
var_sql varchar := 'insert into test1 values (0,'||quote_literal('admin')||')';
begin
   execute var_sql;
   execute format('insert into %I values (%L,%L)','test1',2,'xiaoniu');
end;        
$$ language plpgsql; 

返回结果

返回结果分为返回标量(单行)和返回结果集合(多行)两种情况。

  • 返回标量
-- 代码18
-- 返回单行int
create or replace function somefunc4()
returns int as
$$
begin
   return 100;
end   
$$ language plpgsql;
-- 代码19
-- 通过out参数返回
create or replace function somefunc4(out v1 integer) 
as
$$
begin
   v1 := 100;
end  
$$ language plpgsql;
-- 代码20
-- 返回单行record 复合类型
create or replace function somefunc4(id integer,mc varchar) 
returns record as
$$
declare 
   r record;
begin
   r := row(id,mc);
   return r;
end  
$$ language plpgsql;
  • SETOF 作用

返回结果集合(多行)时,需要使用SETOF指定

--代码21
--返回单列多行
create or replace function somefunc5()
returns setof int as
$$
declare
id int;
begin
   for id in select n_id from test1 
   loop
      return next id;
   end loop;
   return;  
end   
$$ language plpgsql;

结果:

abase=# select somefunc5();
 somefunc5 
-----------
         1
         1
         0
         0
         2
(5 rows)

  • 返回结果集
-- 代码22
-- 通过out参数返回
-- returns setof record  可以省略
create or replace function somefunc6(out id integer,out name varchar)
returns setof record as 
$$
declare 
   r record;
begin
   for r in select n_id,c_mc from test1 
   loop
      id := r.n_id;
      name := r.c_mc;
      return next;
   end loop; 
end
$$ language plpgsql;

结果:

abase=# select * from somefunc6() ;
 id |   name    
----+-----------
  1 | wangzhen
  1 | xiaozhang
  0 | admin
  0 | admin
  2 | xiaoniu
(5 rows)

-- 代码23
-- 通过return next 返回自定义类型
create type test_rs as (id int,mc varchar);
create or replace function somefunc7()
returns setof test_rs as 
$$
declare
   r test_rs%rowtype;
begin
   for r in select n_id,c_mc from test1
   loop
      return next r;
   end loop;
   return;
end
$$ language plpgsql;
-- 代码24
-- 通过return query 返回自定义类型
create or replace function somefunc7()
returns setof test_rs as 
$$
declare
   r test_rs%rowtype;
begin
   return query select n_id,c_mc from test1;
   return;
end
$$ language plpgsql;
-- 代码25
-- 通过return next返回表类型
create or replace function somefunc7()
returns setof test1 as 
$$
declare
   r test1%rowtype;
begin
   for r in select n_id,c_mc from test1
   loop
      return next r;
   end loop;
   return;
end
$$ language plpgsql;
-- 代码26
-- 通过拼接sql  return next 返回自定义类型
create or replace function somefunc7()
returns setof test_rs as 
$$
declare
   r test_rs%rowtype;
begin
   for r in execute 'select n_id,c_mc from test1'
   loop
      return next r;
   end loop;
   return;
end
$$ language plpgsql;
-- 代码26
-- 通过拼接sql  return query 返回自定义类型
create or replace function somefunc7()
returns setof test_rs as 
$$
declare
   r test_rs%rowtype;
begin
   return query execute 'select n_id,c_mc from test1';
   return;
end
$$ language plpgsql;
  • 返回结果集时PostgreSQL 9.5.4,需要使用自定义类型或表类型制定返回类型,不能用record匿名类型。

循环判断

  • LOOP循环
create or replace function testloop1() 
returns void as
$$
declare
    count int :=0;
begin
    loop
       exit when count >=100;
       count := count + 1;
       raise notice 'count is %',count;
    end loop;
end
$$ language plpgsql ;
  • WHILE循环
create or replace function testloop2() 
returns void as
$$
declare
    count int :=0;
begin
    while count <100 loop
       count := count + 1;
       raise notice 'count is %',count;
    end loop;
end
$$ language plpgsql ;
  • FOR循环
create or replace function testloop3() 
returns void as
$$
begin
  for i in 1..100 loop
     raise notice 'count is %',i;
  end loop;
end
$$ language plpgsql;
create or replace function testloop4() 
returns void as
$$
begin
  for i in reverse 100..1 by 2 loop 
     raise notice 'count is %',i;
  end loop;
end
$$ language plpgsql;
  • FOREACH循环
create or replace function testloop5()
returns void as
$$
declare
  v_arr int[]:= array[1,2,3,4,5];
  i int;
begin
  foreach i in array v_arr loop
      raise notice 'count is %',i;
  end loop;
end
$$ language plpgsql;

相关文章: