postgresql一般crud存储过程参考[转]
http://blog.csdn.net/cdnight/article/details/18082255
这里是一份经过再三调试测试而成功的postgres数据库单表crud存储过程,请注意,对于多结果的返回方式,请查看 getPageByCondition的书写方式,用的是refcursor,返回一个cursor,同时可以返回其他out,inout参数,但是 refcursor必须在事务中调用,所以java端的调用过程需要注意,好吧,我同时放出一份dal样板,大家可以直接copy来用。
/******************************************************************
* 表名:test3
* Made by 码农下的天桥
******************************************************************/
--use MYDB;--你可以指定自己的数据库
/******************************************************************
****************************各种常用查询***************************
******************************************************************/
------------------------------------
--用途:复杂形式的查询语句,用于查询分页数据。
--这个是泛用型的,假如你要根据用户输入去查询,那么最好不要用这个了,
--以免出现sql注入。
--参数说明:
---_offset int 需要取的记录的开始位置
---_limit int 需要获取记录的总条数,针对分页而言,就是分页的pagesize。
---_columns varchar(800) 需要获取的字段
---_where varchar(800) 需要过滤的条件譬如: where id<10 可以带where,不过建议不要带。
---_orderby varchar(800) 需要进行排序的提交,譬如:order by id
---_totalCount int 返回总共记录条数。
---_totalPages int 返回总共页数。
------------------------------------
create or replace function test3_getListByCondition(
INOUT pageindex INT,
INOUT pagesize INT,
IN _columns VARCHAR(800),
IN _where VARCHAR(800),
IN _orderby VARCHAR(800),
out _totalCount INT,
out _totalPages INT)
returns SETOF record
AS
$$
DECLARE condition_columns VARCHAR(800);
DECLARE condition_where varchar(800);
DECLARE condition_orderby VARCHAR(800);
DECLARE _dymatic_sql VARCHAR(1600);
DECLARE _beginNO INT;
DECLARE _dynamic_getCount varchar(1600);
DECLARE _theOffset INT;
DECLARE _tmpInt1 INT;
BEGIN
condition_where:=ltrim(rtrim(COALESCE(_where,'')));
condition_orderby:=ltrim(rtrim(COALESCE(_orderby,'order by t3id')));
condition_columns:=ltrim(rtrim(COALESCE(_columns,'*')));
--分析传过来的参数,构造动态sql语句。
IF "character_length"(condition_where)>0 THEN
IF strpos(condition_where, 'where ')!=1 THEN
condition_where:='where ' || condition_where;
END IF;
END IF;
--order by 语句构造
IF "character_length"(condition_orderby)>0 THEN
IF strpos(condition_orderby, 'order ')!=1 THEN
condition_orderby:='order by '||condition_orderby;
END IF;
END IF; --判断pageindex是否合法及pagesize是否合法
IF pageindex<1 THEN
pageindex:=1;
END IF;
IF pagesize<1 THEN
pagesize:=20;
END IF; _dynamic_getCount:='select count(*) from test3 '||condition_where|| ' ' ;
EXECUTE _dynamic_getCount INTO _totalCount; IF _totalCount<1 THEN
pageindex:=1;
RETURN;
END IF;
--计算总共页数
_tmpInt1:=_totalCount%pagesize;
IF _tmpInt1=0 THEN
_totalPages:=_totalCount / pagesize;
ELSE
_totalPages:=(_totalCount-_tmpInt1)/pagesize+1;
END IF; IF _totalPages < pageindex then
pageindex:=_totalPages;
END IF; _theOffset:=(pageindex-1) * pagesize+1; _dymatic_sql:='select '||condition_columns||' from test3 '||condition_where||' '||condition_orderby||' limit '||pagesize||' '|| ' offset '||_theOffset||' ';
--raise info '动态构造语句为:%',_dymatic_sql;
return query EXECUTE _dymatic_sql;
END;
$$ language plpgsql VOLATILE; ------------------------------------
--用途:复杂形式的查询语句,用于查询多条记录数据。
--这个是泛用型的,假如你要根据用户输入去查询,那么最好不要用这个了,
--以免出现sql注入。
--参数说明:
---_offset int 需要取的记录的开始位置
---_limit int 需要获取记录的总条数,针对分页而言,就是分页的pagesize。
---_columns varchar(800) 需要获取的字段
---_where varchar(800) 需要过滤的条件譬如: where id<10 可以带where,不过建议不要带。
---_orderby varchar(800) 需要进行排序的提交,譬如:order by id
---_totalCount int 返回总共记录条数。
------------------------------------
create or replace function test3_getPageByCondition(
INOUT pageindex INT,
INOUT pagesize INT,
IN _columns VARCHAR(800),
IN _where VARCHAR(800),
IN _orderby VARCHAR(800),
out _totalCount INT,
out _totalPages INT,
out _refcursor refcursor
)
returns SETOF record
AS
$$
DECLARE condition_columns VARCHAR(800);
DECLARE condition_where varchar(800);
DECLARE condition_orderby VARCHAR(800);
DECLARE _dymatic_sql VARCHAR(1600);
DECLARE _beginNO INT;
DECLARE _dynamic_getCount varchar(1600);
DECLARE _theOffset INT;
DECLARE _tmpInt1 INT;
BEGIN
condition_where:=ltrim(rtrim(COALESCE(_where,'')));
condition_orderby:=ltrim(rtrim(COALESCE(_orderby,'order by t3id')));
condition_columns:=ltrim(rtrim(COALESCE(_columns,'*')));
--分析传过来的参数,构造动态sql语句。
IF "character_length"(condition_where)>0 THEN
IF strpos(condition_where, 'where ')!=1 THEN
condition_where:='where ' || condition_where;
END IF;
END IF;
--order by 语句构造
IF "character_length"(condition_orderby)>0 THEN
IF strpos(condition_orderby, 'order ')!=1 THEN
condition_orderby:='order by '||condition_orderby;
END IF;
END IF; --判断pageindex是否合法及pagesize是否合法
IF pageindex<1 THEN
pageindex:=1;
END IF;
IF pagesize<1 THEN
pagesize:=20;
END IF; _dynamic_getCount:='select count(*) from test3 '||condition_where|| ' ' ;
EXECUTE _dynamic_getCount INTO _totalCount; IF _totalCount<1 THEN
pageindex:=1;
RETURN;
END IF;
--计算总共页数
_tmpInt1:=_totalCount%pagesize;
IF _tmpInt1=0 THEN
_totalPages:=_totalCount / pagesize;
ELSE
_totalPages:=(_totalCount-_tmpInt1)/pagesize+1;
END IF; IF _totalPages < pageindex then
pageindex:=_totalPages;
END IF; _theOffset:=(pageindex-1) * pagesize+1; _dymatic_sql:='select '||condition_columns||' from test3 '||condition_where||' '||condition_orderby||' limit '||pagesize||' '|| ' offset '||_theOffset||' ';
--raise info '动态构造语句为:%',_dymatic_sql;
open _refcursor for EXECUTE _dymatic_sql;
RETURN NEXT;
END;
$$ language plpgsql VOLATILE; ------------------------------------
--用途:获取其中一条记录
------------------------------------
create or replace function test3_getRecord(in _id integer)
returns SETOF test3
AS
$$
BEGIN
return query select * from test3 where t3id=_id LIMIT 1 OFFSET 0;
END;
$$ LANGUAGE plpgsql VOLATILE; ------------------------------------
--用途:复杂形式的查询语句,用于查询前面第几条记录,这个就相当好了
--这个是泛用型的,假如你要根据用户输入去查询,那么最好不要用这个了,
--以免出现sql注入。
--参数说明:
---_topN int 需要取的topN条记录。
---_columns varchar(800) 需要获取的字段
---_where varchar(800) 需要过滤的条件譬如: where id<10 可以带where,不过建议不要带。
---_orderby varchar(800) 需要进行排序的提交,譬如:order by id
------------------------------------
create or replace function test3_getTopNbyCondition(IN _topN int,IN _columns VARCHAR(800),IN _where VARCHAR(800),IN _orderby VARCHAR(800))
returns SETOF test3
AS
$$
DECLARE condition_columns VARCHAR(800);
DECLARE condition_where varchar(800);
DECLARE condition_orderby VARCHAR(800);
DECLARE _dymatic_sql VARCHAR(1600);
BEGIN
condition_where:=ltrim(rtrim(COALESCE(_where,'')));
condition_orderby:=ltrim(rtrim(COALESCE(_orderby,'order by t3id')));
condition_columns:=ltrim(rtrim(COALESCE(_columns,'*'))); --分析传过来的参数,构造动态sql语句。
IF "character_length"(condition_where)>0 THEN
IF strpos(condition_where, 'where ')!=1 THEN
condition_where:='where ' || condition_where;
END IF;
END IF;
--order by 语句构造
IF "character_length"(condition_orderby)>0 THEN
IF strpos(condition_orderby, 'order ')!=1 THEN
condition_orderby:='order by '||condition_orderby;
END IF;
END IF;
_dymatic_sql:='select '||condition_columns||' from test2 '||condition_where||' '||condition_orderby||' limit '||CAST(_topN as VARCHAR)|| ' offset 0 ';
--raise info '动态构造语句为:%',_dymatic_sql;
return query EXECUTE _dymatic_sql;
END;
$$ language plpgsql VOLATILE; /******************************************************************
*****************************记录删除******************************
******************************************************************/
------------------------------------
--用途:删除多条记录
------------------------------------
create or replace function test3_DeleteList(in ids VARCHAR(800),out status boolean,out msg VARCHAR(200))
returns record
AS
$$
DECLARE _arr_ids int[];
DECLARE _str_ids "text";
DECLARE _str_sql VARCHAR(1600);
DECLARE _effects int;
BEGIN IF "character_length"(ids)<1 THEN
status:=false;
msg:='没有指定需要删除的数据!';
return;
end if;
_arr_ids:=tools_str2intarray(ids, ',');
_str_ids:=tools_stringify(_arr_ids,',');
--pkey为主键,自增的整数, <@ 表示判断pkey是不是在数组里面。是不是很方便?
/*动态构造执行*/
--_str_sql:='DELETE FROM test3 where t3id in ('||_str_ids||') ;';
--EXECUTE _str_sql;
/*直接执行*/
delete from test3 where t3id =ANY( _arr_ids);
GET DIAGNOSTICS _effects = ROW_COUNT;
IF _effects>0 THEN
status:=true;
msg:='成功删除'||_effects||'条记录!';
ELSE
status:=false;
msg:='没有删除任何记录!';
end if; END
$$ LANGUAGE plpgsql VOLATILE; /******************************************************************
****************************添加及编辑*****************************
******************************************************************/ ------------------------------------
--用途:增加一条记录
------------------------------------ create or replace function test3_Insert(
in __t3name varchar(400) ,
in __t_birthday date ,
in __myage smallint ,
in __isadmin boolean ,
in __myintro text ,
in __price float ,
out __t3id integer,
out _status boolean,
out _msg varchar(200))
returns record AS $$
BEGIN Insert into test3
(
"t3name","t_birthday","myage","isadmin","myintro","price"
)
values(
__t3name,__t_birthday,__myage,__isadmin,__myintro,__price
);
/*判断添加记录是否成功。*/
if FOUND then
_status:=true;
_msg:='成功添加记录.';
__t3id:=currval(pg_get_serial_sequence('test3', 't3id'));
else
_status:=false;
_msg:='无法添加记录!';
end if;
end;
$$ LANGUAGE plpgsql VOLATILE; ------------------------------------
--用途:修改一条记录
------------------------------------
create or replace function test3_Update(
in __t3name varchar(400) ,
in __t_birthday date ,
in __myage smallint ,
in __isadmin boolean ,
in __myintro text ,
in __price float ,
in __t3id integer,
out _status boolean,
out _msg varchar(200))
returns record AS $$
BEGIN update test3 set
"t3name"=__t3name,"t_birthday"=__t_birthday,"myage"=__myage,"isadmin"=__isadmin,"myintro"=__myintro,"price"=__price where t3id=__t3id;
/*判断保存记录是否成功。*/
if FOUND then
_status:=true;
_msg:='成功保存记录.';
else
_status:=false;
_msg:='无法保存记录!';
end if;
end;
$$ LANGUAGE plpgsql VOLATILE;
PostgreSQL
对应dal调用文件:
package EasisWeb.DAL; import EasisWeb.config.DBPool;
import Easis.Common.StringUtil;
import Easis.util.DataRow;
import Easis.util.DataTable;
import Easis.util.DataTableHelper;
import java.util.Date;
import Easis.DBUtility.PooledConnection;
import java.sql.*;
import java.util.List;
import java.util.ArrayList;
import Easis.util.OperationResult;
import Easis.util.PagerResult;
import EasisWeb.Model.test3Model;
/**
* 这是利用CodeGen工具生成的自动访问数据库的一个模板,作者为“码农下的天桥”
*生成的类名称:
* @author 码农下的天桥
* @version 1.00
*/
public class test3DAL { /*表格各种column*/
public static final String col_t3id="test3";
public static final String col_t3name="test3";
public static final String col_t_birthday="test3";
public static final String col_myage="test3";
public static final String col_isadmin="test3";
public static final String col_myintro="test3";
public static final String col_price="test3";
public static final String PKColumn="t3id"; /**
*存储过程名称:test3_ListByCondition
*存储过程参数:
*@param pageindex
*@param pagesize
*@param columns 需要获取的字段
*@param condition where条件语句
*@param orderColumn order by排序语句
*
*@return 分页对象
*/ public PagerResult getPageListByCondition(int pageindex,int pagesize, String columns, String condition, String orderColumn){
PagerResult pres=new PagerResult();
//output参数定义
int _total = 0 ;
int _pagesize = 0 ;
int _pageindex = 0 ;
int _totalpages = 0 ;
//output参数定义结束
//调用存储过程
DataTable res__datatable=new DataTable();
try{
PooledConnection __myconn=DBPool.getConnection();
__myconn.setAutoCommit(false); // return refcursor must within a transaction
CallableStatement _stmt=__myconn.prepareCall("{ call test3_getPageByCondition( ?, ?, ?, ?, ?, ?, ?, ?)}");
_stmt.setInt(1,pageindex);
_stmt.setInt(2,pagesize);
_stmt.registerOutParameter(1,Types.INTEGER);
_stmt.registerOutParameter(2,Types.INTEGER);
_stmt.setString(3,columns);
_stmt.setString(4,condition);
_stmt.setString(5,orderColumn);
_stmt.registerOutParameter(6, Types.INTEGER);
_stmt.registerOutParameter(7, Types.INTEGER);
_stmt.registerOutParameter(8,Types.OTHER);
_stmt.execute();
ResultSet __rslist=(ResultSet)_stmt.getObject(8);
res__datatable=DataTableHelper.rs2datatable(__rslist);
//取回参数
_total=_stmt.getInt(6);
pres.totalrecords=_total;
_pageindex=_stmt.getInt(1);
pres.totalrecords=_total;
_pagesize=_stmt.getInt(2);
pres.pageindex=_pageindex;
pres.pagesize=_pagesize;
_totalpages=_stmt.getInt(7);
pres.totalpages=_totalpages;
pres.datasource=res__datatable;
//--提交并还原
__myconn.commit();
__myconn.setAutoCommit(true); //返回游标必须在一个事务中,提交完以后将autocommit还原。
//释放资源
__rslist.close();
_stmt.close();
__myconn.close();}
catch (Exception __e){
System.out.println("在运行[test3DAL]的List_Condition时候出现错误。");
__e.printStackTrace();
}
return pres;
} /**
*存储过程名称:test3_Insert
*存储过程参数:
*param t3id 【主键】
t3name
t_birthday
myage
isadmin
myintro
price
*
*@return
*/
public OperationResult Insert(test3Model model){
OperationResult __ores=new OperationResult();
/*output参数定义*/
int t3id = 0 ;
DataRow returnInfo=new DataRow();
boolean status = false ;
String message = "" ;
/*output参数定义结束*/
/*调用存储过程*/ try{
PooledConnection __myconn=DBPool.getConnection();
CallableStatement _stmt=__myconn.prepareCall("{call test3_Insert(?,?,?,?,?,?,?,?,?)}"); _stmt.setObject(1,model.t3name,Types.VARCHAR);
_stmt.setObject(2,new Timestamp(model.t_birthday.getTime()),Types.DATE);
_stmt.setObject(3,model.myage,Types.SMALLINT);
_stmt.setObject(4,model.isadmin,Types.BOOLEAN);
_stmt.setObject(5,model.myintro,Types.VARCHAR);
_stmt.setObject(6,model.price,Types.FLOAT);
_stmt.registerOutParameter(7,Types.INTEGER,-1);
_stmt.registerOutParameter(8, Types.BOOLEAN,1);
_stmt.registerOutParameter(9, Types.VARCHAR,200);
_stmt.execute(); /*取回参数*/
t3id=_stmt.getInt(7);
status=_stmt.getBoolean(8);
message=_stmt.getString(9); __ores.id= t3id;
__ores.status=status;
__ores.message=message;
/*释放资源*/ _stmt.close();
__myconn.close();}
catch (Exception __e){
__e.printStackTrace();
__ores.message=__e.toString();
}
return __ores;
} /**
*存储过程名称:test3_Update
*存储过程参数:
* t3id【主键】
t3name
t_birthday
myage
isadmin
myintro
price
*
*@return
*/
public OperationResult Update(test3Model model){
OperationResult __ores=new OperationResult();
/*output参数定义*/
boolean status = false ;
String message = "" ;
/*output参数定义结束*/
/*调用存储过程*/
DataTable res__datatable=new DataTable();
try{
PooledConnection __myconn=DBPool.getConnection();
CallableStatement _stmt=__myconn.prepareCall("{ call test3_Update( ?,?,?,?,?,?,?,?,?)}"); _stmt.setObject(1,model.t3name,Types.VARCHAR);
_stmt.setObject(2,new Timestamp(model.t_birthday.getTime()),Types.DATE);
_stmt.setObject(3,model.myage,Types.SMALLINT);
_stmt.setObject(4,model.isadmin,Types.BOOLEAN);
_stmt.setObject(5,model.myintro,Types.VARCHAR);
_stmt.setObject(6,model.price,Types.FLOAT);
_stmt.setInt(7,model.t3id);
_stmt.registerOutParameter(8, Types.BOOLEAN,1);
_stmt.registerOutParameter(9, Types.VARCHAR,400);
_stmt.execute();
/*取回参数*/
status=_stmt.getBoolean(8);
message=_stmt.getString(9); __ores.status=status;
__ores.message=message; /*释放资源*/ _stmt.close();
__myconn.close();}
catch (Exception __e){
__e.printStackTrace();
}
return __ores;
} /**
*存储过程名称:test3_DeleteList
*存储过程参数:
*@param ids 【参数名称:ids 参数类型:nvarchar 对应java类型:String 长度:400 】
*
*@return
*/
public OperationResult DeleteList( String ids){
/*output参数定义*/
OperationResult __ores=new OperationResult();
boolean status = false ;
String message = "" ;
/*output参数定义结束*/
/*调用存储过程*/
DataTable res__datatable=new DataTable();
try{
PooledConnection __myconn=DBPool.getConnection();
CallableStatement _stmt=__myconn.prepareCall("{ call test3_DeleteList( ?, ?, ?)}"); _stmt.setString(1,ids); _stmt.registerOutParameter(2, Types.BOOLEAN,1); _stmt.registerOutParameter(3, Types.VARCHAR,400);
_stmt.execute();
/*取回参数*/
status=_stmt.getBoolean(2);
message=_stmt.getString(3); __ores.status=status;
__ores.message=message;
/*释放资源*/ _stmt.close();
__myconn.close();}
catch (Exception __e){
__e.printStackTrace();
}
return __ores;
} /**
*存储过程名称:test3_GetRecord
*存储过程参数:
*@param t3id 【参数名称:id 参数类型:int 对应java类型:int 长度:非字符类型 】
*
*@return DataTable对象。
*/ public test3Model GetRecord( int t3id ){
/*调用存储过程*/
DataTable res__datatable=new DataTable();
test3Model model=new test3Model();
try{
PooledConnection __myconn=DBPool.getConnection();
CallableStatement _stmt=__myconn.prepareCall("{ call test3_GetRecord( ?)}"); _stmt.setInt(1,t3id);
ResultSet __rslist =_stmt.executeQuery();
res__datatable=DataTableHelper.rs2datatable(__rslist);
model=tryParseModel(res__datatable.get(0)); /*释放资源*/
__rslist.close();
_stmt.close();
__myconn.close();}
catch (Exception __e){
__e.printStackTrace();
} return model;
} /**
*存储过程名称:test3_Top_Condition
*存储过程参数:
*@param topN 【参数名称:topN 参数类型:int 对应java类型:int 长度:非字符类型 】
*@param columns 【参数名称:columns 参数类型:nvarchar 对应java类型:String 长度:800 】
*@param condition 【参数名称:condition 参数类型:nvarchar 对应java类型:String 长度:800 】
*@param orderColumn 【参数名称:orderColumn 参数类型:nvarchar 对应java类型:String 长度:800 】
*
*@return DataTable对象。
*/
public DataTable Top_Condition( int topN, String columns, String condition, String orderColumn ){
/*调用存储过程*/
DataTable res__datatable=new DataTable();
try{
PooledConnection __myconn=DBPool.getConnection();
CallableStatement _stmt=__myconn.prepareCall("{ call test3_Top_Condition( ?, ?, ?, ?)}"); _stmt.setInt(1,topN); _stmt.setString(2,columns); _stmt.setString(3,condition); _stmt.setString(4,orderColumn);
ResultSet __rslist =_stmt.executeQuery();
res__datatable=DataTableHelper.rs2datatable(__rslist); /*释放资源*/
__rslist.close();
_stmt.close();
__myconn.close();}
catch (Exception __e){
__e.printStackTrace();
} return res__datatable;
} public test3Model tryParseModel(DataRow drow){
test3Model model=new test3Model();
if(drow==null){
return model;
} /*
return "boolean";
return "Date";
return "double";
return "float";
return "int";
return "long";
return "String";
return "Object";
*/ /*尝试赋值*/
model.t3id = drow.get("t3id").toInt();
model.t3name = drow.get("t3name").toString();
model.t_birthday = drow.get("t_birthday").toDate();
model.myage = drow.get("myage").toInt();
model.isadmin = drow.get("isadmin").toBoolean();
model.myintro = drow.get("myintro").toString();
model.price = drow.get("price").toFloat();
return model;
} public List<test3Model> tryParseList(List<DataRow> dataList){
List<test3Model> modellist=new ArrayList<test3Model>();
if(dataList==null){
return modellist;
} for(DataRow drow :dataList){
modellist.add(tryParseModel(drow));
} return modellist;
}
}
java
http://blog.csdn.net/cdnight/article/details/18078751
http://blog.csdn.net/cdnight/article/details/18001807
http://www.cnblogs.com/stephen-liu74/category/343171.html
postgresql一般crud存储过程参考[转]的更多相关文章
- 如何在SQL Server中生成和使用CRUD存储过程
在本文中,请参阅如何在SQL Server中生成和使用CRUD存储过程. 大多数数据库系统基于缩写CRUD调用的最简单的4种数据操作操作进行操作. 此首字母缩写词代表CREATE,READ,UPDAT ...
- postgresql PL/pgSQL—存储过程结构和变量声明
ref: https://www.postgresql.org/docs/9.6/static/plpgsql-structure.html 一. 函数结构 CREATE FUNCTION somef ...
- postgresql集群方案参考答案
PostgreSQL配置Streaming Replication集群 http://www.cnblogs.com/marsprj/archive/2013/03/04/2943373.html p ...
- MySql存储过程参考
Mysql(9)---纪录一次实际开发过程中用到的复杂存储过程 为了尽可能的还原当时为什么需要用到存储过程,下面我写了个详细的文档,我们可以从需求文档出发来分析. 有关存储过程之前也写了两篇文章来做铺 ...
- PostgreSQL函数(存储过程)----笔记
PostgreSQL 函数也称为 PostgreSQL 存储过程. PostgreSQL 函数或存储过程是存储在数据库服务器上并可以使用SQL界面调用的一组SQL和过程语句(声明,分配,循环,控制流程 ...
- MySql、PostgreSql、SqlServer三种数据库的造数存储过程实例
主要实例:把临时表tmp_table数据插入到目标表target_table 一.MySql造数存储过程实例 mysql造数 -- 第一步,创建临时表 CREATE TEMPORARY TABLE I ...
- Postgresql 迁移随笔一
最近忙于MSSQL 迁移到Postgresql的工程,在这里记录一下迁移遇到的问题以及解法. 程序语言:java 要求,根据不同的driver可以同时支援多种数据库,目前主要为MSSQL 和Postg ...
- MSSQL 视图/事务(TRAN[SACTION])/存储过程(PROC[EDURE])/触发器(TRIGGER )
--视图 视图是一张虚拟表,它表示一张表的部分数据或多张表的综合数据,其结构和数据是建立在对表的查询基础上 视图在操作上和数据表没有什么区别,但两者的差异是其本质是不同: 数据表是实际存储记录的地方, ...
- 通过arcgis在PostgreSQL中创建企业级地理数据库
部署环境: Win7 64位旗舰版 软件版本: PostgreSQL-9.1.3-2-windows-x64 Postgis-pg91x64-setup-2.0.6-1 Arcgis 10.1 SP1 ...
随机推荐
- 传输层TCPUDP 具体解释
1.传输层存在的必要性 因为网络层的分组传输是不可靠的,无法了解数据到达终点的时间,无法了解数据未达终点的状态.因此有必要增强网络层提供服务的服务质量. 2.引入传输层的原因 面向连接的传输服务与面向 ...
- unity基础开发----unity游戏速度更快的简易检查表
让游戏速度更快的简易检查表 保持顶点数在 200K 下面,针对 PC 时每帧应为 3M,主要取决于目标 GPU. 若使用内置着色器,请在移动 (Mobile) 或未点亮 (Unlit) 的类别中选择. ...
- jdbc框架有很多,包括spring jdbc
1.由于jdbc连接的繁琐性,故很多公司封装了jdbc框架,比如spring jdbc 2.比如spring jdbc框架中,用jdbctemplate, 通过jdbcTemplate 提供 int ...
- jdbcTemplate异常:like模糊查询报错(Parameter index out of range (1 > number of parameters)
http://cuisuqiang.iteye.com/blog/1480525 模糊查询like要这样写 注意Object参数和like语法 public static void main( ...
- 11.2 为什么要使用 MVC
以前的大部分应用程序(非Android应用)都是用像ASP.PHP或者CFML这样的过程化(自PHP5.0版本后已全面支持面向对象模型)语言来创建的.它们将像数据库查询语句这样的数据层代码和像HTML ...
- MyEclipse for Linux版下载
最近看到很多网友都在找MyEclipse for Linux版下载,费了很大劲也没有找到.1.建议通过代理到官方网站下载. 2.用迅雷下载.设置迅雷使用代理下载(我用的就是这种方式). MyEclip ...
- Unity3D协程介绍 以及 使用
作者ChevyRay ,2013年9月28日,snaker7译 原文地址:http://unitypatterns.com/introduction-to-coroutines/ 在Unity中,协 ...
- git hub的GUI软件配置与使用
1. 安装两个软件 1. git的命令行程序--git for windows:http://git-scm.com/download/win 2. git的GUI程序--tortoisegit:ht ...
- iOS中 imageNamed方法 非常多图片占用大量内存问题
当我们须要载入非常多图片(相冊)的时候我们通常会用[UIimage imageNamed:imageName]; 实际上[UIimage imageNamed:imageName]这种方法在图片使 ...
- Git 学习(二)版本库创建
Git 版本库创建 什么是版本库(repository)? 可理解为文件仓库.由Git管理每个文件的新增.修改及删除,但这个仓库可以追溯历史.可还原至任意历史节点. 版本库创建 创建一个版本库非常简单 ...