
查询结果
postgre中可以用string_agg函数实现相同的功能,具体用法如下:
SELECT
tr_gw_no,
string_agg ( tr_status :: TEXT, ',' ) status
FROM
trade
WHERE
tr_gw_no = 12198006
OR tr_gw_no = 12167001
GROUP BY
tr_gw_no;
20、start with connect by函数的问题:
oracle的这个函数是用来查树形结构的,即同一张的表的记录有父子级关系的那种。oracle中用法如下:
select module_id
from sys_modules
start with module_id = ?
connect by prior module_id = module_fid;
这就表示查询module_id为?的所有子module,即父模块idmodule_fid为?的所有的记录。postgre可以用WITH RECURSIVE实现相同的效果,如下:
WITH RECURSIVE subtabela AS (
SELECT
module_id
FROM
sys_modules
WHERE
module_id = ? UNION ALL
SELECT
tt.module_id
FROM
sys_modules tt
INNER JOIN subtabela st ON tt.module_fid = st.module_id
) SELECT
*
FROM
subtabela;
21、存储过程调用的问题:
postgre11开始,支持存储过程procedure,之前的版本只支持function。通过代码去调用存储过程时,要注意以下三点:
- 调用存储过程的sql语句不需要加大括号,加了大括号的调用的是function而不是procedure;
- 如果存储过程中用了事务,那个在代码中调用时就不要使用spring的事务了,否则会冲突;
- 如果存储过程有
inout参数,表示这个即是输入又是输出参数,都要进行设置,oracle可以只当作输入或者输出来用。
比如现在有一个名为test_procedure(IN "id" int4, INOUT "result" int4)的存储过程,java中调用方式如下:
Session session = sessionFactory.getCurrentSession();
Connection conn = session.connection();
CallableStatement cs = null;
Integer returnInfo = -1;
cs = conn.prepareCall("call p_paynum_processing_create(?,?)");
// oracle中调用要加大括号
// cs = conn.prepareCall("{call p_paynum_processing_create(?,?)}");
// 输入的参数
cs.setInt(1, id.intValue());
// 输出的参数
cs.setInt(2, -1); // oracle中这一行可以不用
cs.registerOutParameter(2, Types.INTEGER);
// 执行存储过程
cs.execute();
// 获取返回值,-1为操作异常
returnInfo = cs.getInt(2);
22、连接查询的问题:
oracle中外连接可以这样写:
select * from tableA a, tableB b where a.id = b.id(+);
有(+)的一方是副表,另一方是主表,即上面那种写法表示左外连接。postgre不支持这种写法,可以用left join代替。
23、instr函数的问题:
instr函数表示包含,postgre中可以用strpos函数替代。

评论列表