扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
连接不上数据库的原因,无非是psql的安装和设置出现问题。
成都创新互联公司主要从事成都网站制作、做网站、网页设计、企业做网站、公司建网站等业务。立足成都服务于洪,10年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18982081108
查找相关答案的时候要注意,debian和ubuntu下面的安装和设置几乎是一样的。
请参考下面两个材料:
1、ubuntu下的Postgresql安装设置。
2、详解Ubuntu下搭建JSP平台过程,虽然这个文章是mysql,做为数据库的设置,还是大同小异的。
数据。下面Navicat官网将详解Navicat for PostgreSQL表索引。
方法/步骤
在 Navicat for PostgreSQL“索引”选项卡,只需点击索引栏位即可编辑。使用索引工具栏,便可以创建新的、编辑或删除选定的索引栏位。
● 添加索引:添加一个索引到表。
● 删除索引:删除已选择的索引。
2
名编辑框:设置索引名。没有模式名可以包含在这里,索引总是创建与它的上级表相同的模式。要在索引包含栏位,只需简单地双击栏位或点击“栏位”按钮就能在打开的编辑器中编辑。注意:一些栏位类型不容许由多个栏位索引。
索引方法:下拉列表定义表索引的类型。
3
唯一键:使得索引独一无二,当创建索引以及每次添加数据时,系统检查表中的重复值(如果数据已经存在)。
簇:CLUSTER 指示 PostgreSQL 簇,指定表名和索引名,索引必须已经被定义到表名。当一个表被簇,PostgreSQL 记得它被簇到哪个索引。 CLUSTER 形式表名重新簇表在它之前簇的相同索引。
表空间:创建索引的表空间。
4
限制:如果想创建部分索引,在编辑框输入限制条件。部分索引是一个索引包含项目给一个表的一部分,通常一部分在索引方面较表其余部分更为有用。
注释:定义索引的注释。
栏位编辑器:从名列表选择栏位,也可以使用箭头按钮来改变索引栏位的顺序。
5
排序规则:选择索引的排序规则。支持 PostgreSQL 9.1 或以上版本。
排序顺序:指定排序顺序:ASC 或 DESC。
Nulls 排序:指定 nulls 排序在 non-nulls 前(NULLS FIRST)或后(NULLS LAST)
如果返回一个 数字或者字符 比较简单,那么多行多列怎么办呢,分为以下几种情况【东西很多,这里只做简单列举】
返回多行单列
又分为几种方式
1. return next,用在 for 循环中
CREATEORREPLACEFUNCTIONfuncname ( in_idinteger)RETURNSSETOFvarcharas $$DECLARE v_name varchar;BEGINforv_namein( (selectnamefromtest_result1whereid=in_id)union(selectnamefromtest_result2whereid= in_id) ) loop
RETURNNEXT v_name;
end loop;
return;END;
$$
LANGUAGE PLPGSQL;
注意
1. 循环外还有个 return
2. 需要实现声明 v_name
2. return query,无需 for 循环
CREATEORREPLACEFUNCTIONfuncname ( in_idinteger)RETURNSSETOFvarcharas $$DECLARE v_rec RECORD;BEGINreturnquery ( (selectnamefromtest_result1whereid=in_id)union(selectnamefromtest_result2whereid= in_id) );
return;END;$$LANGUAGE PLPGSQL;
注意:如果 返回类型为 setof,最好用如下方法
RETURNQUERYEXECUTESQL
不要这么用
executesqlinto out;returnout;
返回多行多列
也有多种方式
1. 使用 return next 和 setof record ,需要 for 循环
CREATEORREPLACEFUNCTIONfuncname ( in_idinteger)RETURNSSETOF RECORDas $$DECLARE v_rec RECORD; BEGINforv_recin( (selectid , namefromtest_result1whereid=in_id)union(selectid , namefromtest_result2whereid= in_id) )loop
RETURNNEXT v_rec;
end loop;
return;END;
$$
LANGUAGE PLPGSQL;
注意
1. 读取表的整行数据时才能用 record
2. 如果读取的数据不是整行,需要自定义 复合数据类型,否则会报如下错误
ERROR: acolumndefinition listisrequiredforfunctions returning "record"
定义复合类型 ,示例如下
createtype myout2as (
road_num int,
freq bigint);createorreplacefunctiontest(cartext, time1text, time2text)returnssetof myout2as $$declare
array1 text[];
array2 text[];
len1 integer;
len2 integer;
x integer;
y integer;
road_str text;
car_str text;
sql text;
i myout2;
begin-- vin 号拼接selectregexp_split_to_array(car,',')into array2;
selectarray_length(array2,1)into len2;
car_str :='';
y :=1;
whiley= len2 loop
car_str :=car_str||quote_literal(array2[y])||',';
y :=y+1;
end loop;
-- sql 拼接sql :='select road_number, sum(frequency) from heat_map where date_key = '''|| time1
||'-01'' and date_key ='''|| time2
||'-20'' and vin in ('||rtrim(car_str,',')
||')group by road_number;';
--execute sql into out;foriinexecute sql loop
returnnext i;
end loop;
return;end$$ language plpgsql;
在执行时可能会报如下错误
ERROR:set-valuedfunctioncalledincontext that cannot accept aset
解决方法
select funcname(arg);--改为select*fromfuncname(arg);
2. return query,无需 for 循环
CREATEORREPLACEFUNCTIONfuncname ( in_idinteger)RETURNSSETOF RECORDas $$DECLARE v_rec RECORD;BEGINreturnquery ( (selectid , namefromtest_result1whereid=in_id)union(selectid , namefromtest_result2whereid= in_id) );
return;END;
$$
LANGUAGE PLPGSQL;
3. 使用 out 输出参数
CREATEORREPLACEFUNCTIONfuncname ( in_idinteger,out o_idinteger,out o_namevarchar)
RETURNSSETOF RECORDas $$DECLARE v_rec RECORD;BEGINforv_recin( (selectid , namefromtest_result1whereid=in_id)union(selectid , namefromtest_result2whereid= in_id) )loop
o_id := v_rec.id;
o_name := v_rec.name;
RETURNNEXT ;
end loop;
return;END;
$$
LANGUAGE PLPGSQL;
总结 - return next return query
我们可以看到上面无论是单列多行还是多列多行,都用到了 return next 和 return query 方法
在 plpgsql 中,如果存储过程返回 setof sometype,则返回值必须在 return next 或者 return query 中声明,然后有一个不带参数的 retrun 命令,告诉函数执行完毕;【setof 就意味着 多行】
用法如下
RETURNNEXT expression;RETURN QUERY query;RETURNQUERYEXECUTEcommand-string[ USING expression [, ... ]];
return next 可以用于标量和复合类型数据;
return query 命令将查询到的一条结果追加到函数的结果集中;
二者在单一集合返回函数中自由混合,在这种情况下,结果将被级联。【有待研究】
return query execute 是 return query 的变形,它指定 sql 将被动态执行;
returnqueryselectroad_number,sum(frequency)fromheat_mapgroupbyroad_number;--这样可以sql :='select road_number, sum(frequency) from heat_map group by road_number';returnquery sql;--这样不行
参考资料:
自定义类型并返回数组
return next return query
function返回多列多行
返回结果集多列和单列的例子
PostgreSQL存储过程(1)-基于SQL的存储过程
动态SQL
postgresql, pgadmin error RETURN cannot have a parameter in function returning set
存储过程输出参数
PostgreSQL存储过程(3)-流程控制语句
启动pg服务
设置pg服务为开机启动
-bash: netstat: 未找到命令
再次执行
使用navicat连接是无法连接的。
【遇到的问题】若没有可以跳过
【解决办法】
修改/usr/bin/firewall-cmd 下文件在首行 python改为python2(因为之前安装过python3环境)
listen_addresses='*'
或者加 ip网段
配置完成后即可使用客户端进行连接
大功告成~~
————————————————
参考 链接:
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流