`
tdmlxq
  • 浏览: 37754 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

【转】PostgreSQL和Oracle用法上的一些区别

阅读更多
1 ) 注意增加约束时的写法,和ORACLE 略有不同

Oracle

ALTER TABLE SCHEMA.PREFIX_INFO ADD (
CONSTRAINT PK_PREFIX_INFO PRIMARY KEY (INFO_ID));

PostgresQL

alter table schema.prefix_info add constraint prefix_info_pkey primary key(info_id);

2 )系统默认的最大值与ORACLE 不同

Oracle

CREATE SEQUENCE PREFIX_INFO_SEQUENCE
INCREMENT BY 1
START WITH 582
MINVALUE 1
MAXVALUE 9999999999999999999999999999
NOCYCLE
CACHE 20
NOORDER;

PostgresQL

CREATE SEQUENCE schema.prefix_info_sequence
increment 1
minvalue 1
maxvalue 9223372036854775807
start 582
cache 20;

3PostgresQL 中的 || 用 法与其他数据库不同:
select a|| b from table1;
ab 其中一个为null 时, 该查询返回null

4PostgresQL 中没有concat 函数,且由于|| 用法的问题,无法使用|| 替换,解决 方法为在public schema 中创建函数concat

create or replace function concat(text, text)
returns text as
$body$select coalesce($1,'') || coalesce($2,'')$body$
language 'sql' volatile;
alter function concat(text, text) owner to postgres;

-- 无需特殊授权即可在其他schema 中使用

4PostgresQL 中没有dual 虚拟表,为保 证程序兼容性,可创建伪视图(view )替代:

CREATE OR REPLACE VIEW dual AS
SELECT NULL::"unknown"
WHERE 1 = 1;

ALTER TABLE dual OWNER TO postgres;
GRANT ALL ON TABLE dual TO postgres;
GRANT SELECT ON TABLE dual TO public;

必须授权publicselect 权 限

5 )关联查询用法区别

ORACLE:

简单外连接:
SELECT COUNT(DISTINCT(A.COL1)) AS RCOUNT FROM
SCHEMA.PREFIX_TABLE1 A,SCHEMA.PREFIX_TABLE2 B
WHERE 1 = 1
AND A.COL2 = B.COL2(+)
AND A.COL3 > 0
AND A.COL4 = '1'

超级变态外连接:
SELECT COUNT(DISTINCT(A.COL1)) AS RCOUNT FROM
SCHEMA.PREFIX_TABLE1 A,SCHEMA.PREFIX_TABLE2 B,SCHEMA.PREFIX_TABLE3 C,SCHEMA.PREFIX_TABLE4 D
WHERE 1 = 1
AND A.COL2 = B.COL2
AND A.COL3 = C.COL3(+)
AND A.COL4 = D.COL4(+)
AND A.COL5 > 0
AND A.COL6 = '1'


POSTGRESQL:

简单外连接:
select count(distinct(a.col1)) as rcount from
schema.prefix_table1 a left outer join schema.prefix_table2 b on (a.col2 = b.col2)
where 1 = 1
and a.col3 > 0
and a.col4 = '1'

超级变态外连接:
select count(distinct(a.col1)) as rcount from
schema.prefix_table1 a inner join schema.prefix_table2 b on (a.col2 = b.col2)
left outer join schema.prefix_table3 c on (a.col3 = c.col3)
left outer join schema.prefix_table4 d on (a.col4 = d.col4)
where 1 = 1
and a.col5 > 0
and a.col6 = '1'

6PostgresQL 中子查询较为规范,子查询结果集必须拥有alias

ORACLE:
SELECT * FROM (
SELECT * FROM (
SELECT * FROM SCHEMA.PREFIX_TABLE ORDER BY COL1
) WHERE X=1 ORDER BY COL2
) WHERE Y=2 ORDER BY COL3

POSTGRESQL:

SELECT * FROM (
SELECT * FROM (
SELECT * FROM SCHEMA.PREFIX_TABLE ORDER BY COL1 ALIAS1
) WHERE X=1 ORDER BY COL2 ALIAS2
) WHERE Y=2 ORDER BY COL3

7 PostgresQL 中没有rownum ,无法 使用where rownum < = X 的方法进行分页,取而代之的是limit Xoffset Y 方法,ORACLE 中不允许使用LIMIT X 的 方法
ORACLE:

SELECT * FROM ( SELECT * FROM (SELECT * FROM SCHEMA.PREFIX_TABLE1 ORDER BY COL1 DESC,COL2 ASC) where ROWNUM <= 50 ORDER BY COL3 ASC,COL4 DESC)
WHERE ROWNUM <= 20 ORDER BY COL5 DESC,COL6 ASC;

POSTGRES:

select * from ( select * from (SELECT * FROM SCHEMA.PREFIX_TABLE1 ORDER BY COL1 DESC,COL2 ASC) selb order by col3 asc,col4 desc limit 50 ) sela
order by col5 desc,col6 asc limit 20;

-- 注意!!limit 必须用于order by 之后

-- 例:取150 条数据

select * from VOIP_FEE_RATE temp offset 0 limit 50

8 )序列使用的区别

ORACLE:
SELECT SCHEMA.PREFIX_TABLE1_SEQUENCE.NEXTVAL AS nCode FROM DUAL

POSTGRES:
SELECT NEXTVAL('SCHEMA.PREFIX_TABLE1_SEQUENCE') AS nCode FROM DUAL
--
注意,此方法前提是dual 视图已建立,如没有,可省略FROM DUAL

9 )字段取别名必须用as
Oracle -- SELECT A.COL1 A_COL1
A.COL2 A_COL2 FROM A_TABLE A
Postgresql---- SELECT A.COL1 AS A_COL1
A.COL2 AS A_COL2 FROM A_TABLE A

10NVL 用法
Oracle --SELECT NVL(SUM(VALUE11),0) FS_VALUE1, NVL(SUM(VALUE21),0) FS_VALUE2 FROM   FIELD_SUM
Postgresql--SELECT COALESCE(SUM(VALUE11),0) AS FS_VALUE1,COALESCE(SUM(VALUE21),0) AS FS_VALUE2
FROM FIELD_SUM

11TO_NUMBER 用法
Oracle -- SELECT COL1 FROM A_TABLE ORDER BY TO_NUMBER(COL1)
Postgresql- select TO_NUMBER(COL1,'99G999D9S') from A_TABLE [
注:'999999' ---- 6 位数为COL1 字段的长度]

12DECODE 用法
Oracle -- SELECT DECODE(ENDFLAG,'1','A','B') ENDFLAGFROM TEST
Postgresql- SELECT (CASEENDFLAG WHEN '1' THEN 'A'ELSE 'B' END) AS ENDFLAG FROM TEST

13 )统计 相关 用法
Oracle -- SELECT ROUND(AVG(SUM(BASICCNT1))) BASICCNT FROM   ACCESS_INFO_SUM1_V
WHERE YEARCODE BETWEEN '200305' AND '200505' GROUP BY SCCODE

Postgresql-- SELECT ROUND(AVG(AIV.BASICCNT)) AS BASICCNT FROM ( SELECT SUM(BASICCNT1) AS BASICCNT
FROM   ACCESS_INFO_SUM1_V WHERE YEARCODE BETWEEN '200305' AND '200505' GROUP BY sccode ) AIV

14 )时间计算 用法
Oracle -- SELECT CEIL(SYSDATE - TO_DATE('20051027 14:56:10','YYYYMMDD HH24:MI:SS')) AS DAYS
FROM DUAL
Postgresql-- SELECT EXTRACT(DAY FROM (TO_TIMESTAMP(CURRENT_TIMESTAMP,'YYYY-MM-DD-HH24-MI-SS') - TO_TIMESTAMP('2005-10-27 14:56:10','YYYY-MM-DD-HH24-MI-SS') ))+1 AS DAYS FROM DUAL
Oracle -- add_months(date, int)
Postgresql--
创建函数来解决
CREATE FUNCTION add_months(date, int)
RETURNS date AS
'SELECT ($1 + ( $2::text || ''months'')::interval)::date;'
LANGUAGE 'sql'

(15)关于事务

 

PostgreSQL 中,默认情况下,一条SQL 语句是一个独立的事务。在一条SQL 语句开始执行时,PostgreSQL 自动为其创建一个事务。如果语句执行成功,PostgreSQL 自动提交该语句的事务,否则回滚事务。

分享到:
评论

相关推荐

    PostgreSQL v9.3 For Win.zip

    并且,因为许可证的灵活,任何人都可以以任何目的免费使用,修改,和分发 PostgreSQL, 不管是私用,商用,还是学术研究使用。   符合ANSI SQL 92和ANSI SQL 99标准,是目前功能最强、最稳定的开放源代码数据库...

    postgresql-9.3.25-1-windows-x64

    postgresql-9.3.25-1-windows-x64. PostgreSQL 是一个自由的对象-关系数据库服务器(数据库...并且,因为许可证的灵活,任何人都可以以任何目的免费使用、修改、和分发 PostgreSQL,不管是私用、 商用、还是学术研究使用。

    postgresql-9.4.21-1-windows-x64

    PostgreSQL 是一个自由的对象-关系数据库服务器(数据库管理系统),它在灵活的 BSD-风格许可...并且,因为许可证的灵活,任何人都可以以任何目的免费使用、修改、和分发 PostgreSQL,不管是私用、 商用、还是学术研究使用。

    Oracle升级迁移实战文章和方案文档汇总-共168篇.xlsx

    Oracle 迁移至 PostgreSQL 在华为 ARM 上的解决方案 rman异机迁移 迁移 ORACLE数据库和应用异构迁移最佳实践_樊文凯 数据库信息收集表-Oracle数据库迁移升级场景-云和恩墨 零停机时间完成Oracle 上云迁移 OGG能够...

    [手工整理]208个Oracle安装文档,包含各个平台各个版本的单实例RAC以及DataGuard(1).xlsx

    97 Oracle 迁移至 PostgreSQL 在华为 ARM 上的解决方案 98 Oracle 数据库隐含参数设置 99 Oracle 隐含参数 100 Oracle 诊断事件及深入解析10053事件 101 OS deploying-odg-with-oda-1615029 102 OS IBM AIX ...

    postgresql-8.3.3-1

    PostgreSQL 是一个自由的对象-关系数据库服务器(数据库管理系统),它在灵活的 BSD-风格许可...并且,因为许可证的灵活,任何人都可以以任何目的免费使用、修改、和分发 PostgreSQL,不管是私用、商用、还是学术研究使用。

    a5m2数据库客户端(Postgresql,MySQL,Oracle等等主流数据库)

    A5M2,支持表数据直接复制黏贴到excel,也支持从excel直接黏贴回表。支持第一次执行状态数据和第二次执行数据差分。 同时可连接多个数据库和schema。

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    oracle建议用户自己设计数据库管理和安全的权限规划,而不要简单的使用这些预定角色。将来的版本中这些角色可能不会作为预定义角色。  DELETE_CATALOG_ROLE, EXECUTE_CATALOG_ROLE,SELECT_CATALOG_ROLE这些角色...

    ora_migrator:从Oracle到PostgreSQL迁移的工具

    ora_migrator为插件使用迁移Oracle数据库到PostgreSQL。 请阅读db_migrator文档以获取用法说明。 本自述文件仅涵盖插件的安装和设置以及常规文档中未涉及的其他功能。 除此之外, ora_migrator还提供了从Oracle到...

    PostgreSQL rownum实现方法(兼容oracle)

    要在pg中实现rownum我们得先弄清楚oracle中的rownum有什么作用,是如何使用的。 对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于...

    2021 云和恩墨大讲堂PPT汇总(50份).zip

    MySQL备份恢复工具应用场景和使用方法 MySQL的性能 MySQL中的索引探究 Oracle 12cR2 ADG LGWR Library Cache案例分享 Oracle 10046 Trace 的取得和解析方法 Oracle 基于AWR ASH的性能分析 Oracle DataGuard备份恢复...

    connect-session-knex:用于快速会话的knex.js会话存储,支持PostgreSQL,MySQL,MariaDB,Oracle和SQLite

    connect-session-knex是通过库由PostgreSQL,MySQL,MariaDB,MSSQL,Oracle或SQLite3支持的存储。 安装 $ npm install connect-session-knex 历史 参见 用法 选件\ntablename='sessions'要使用的表名。 默认为...

    Nacos2.2版本数据库适配插件.zip

    # Nacos2.2版本数据库适配插件 ## 一、插件概述 ### 1.1、简介 从2022年12月14日发布的Nacos2.2正式...最近有时间,将进行Nacos主分支源码上关于Nacos的Oracle的兼容性适配,目前可以用Nacos2.1的改造代码进行处理。

    PostgreSQL新手入门教程

    本文介绍PostgreSQL的安装和基本用法,供初次使用者上手。以下内容基于Debian操作系统,其他操作系统实在没有精力兼顾,但是大部分内容应该普遍适用。 安装 1、首先,安装PostgreSQL客户端。  sudo apt-get ...

    react-native-sync:两种方式,在React Native realmjs数据库与MySQL,Oracle,MS SQL Server和PostgreSQL之间进行增量同步

    React本地同步两种方式,在React Native realmjs数据库与MySQL,Oracle,MS SQL Server和PostgreSQL数据库之间进行增量同步。特征设备和服务器端MySQL,Oracle,MS SQL Server和PostgreSQL数据库之间的直接DB同步每...

    sr_plan:在PostgreSQL中保存和恢复查询计划

    在PostgreSQL中保存和还原查询计划 基本原理 sr_plan看起来像Oracle Outline系统。 它可以用来锁定执行计划。 如果您不信任计划者或不能制定更好的计划,则很有必要。 编译安装 make USE_PGXS=1 make USE_PGXS=1 ...

    Full Convert数据库转换器

    它支持所有流行数据库引擎之间的非常快速的数据转换(导入和导出)操作,包括:Microsoft Access,Microsoft Excel,dBase,FoxPro,InterBase,Firebird,Lotus 1-2-3,MariaDB,MySQL,NexusDB,Oracle,Paradox,...

    CloneOracleData:克隆Oracle数据

    有两套主要信息: A)克隆结果此文件夹包含通过手动分析以及通过使用各种现有克隆检测工具(包括Simian,Nicad,MeCC和CCCD)被视为克隆的方法。 数据以多种格式提供,包括html,xls和csv。 B)源代码这是从Apache...

    【最新版】navicatess150_premium_en.dmg【亲测可用】最好的数据库开发工具

    支持不同的数据库服务器身份验证方法,例如MySQL和MariaDB的PAM身份验证,MongoDB的Kerberos和X.509身份验证以及PostgreSQL的GSSAPI身份验证。Navicat提供了更多的身份验证机制和高性能环境,因此您不必担心通过不...

Global site tag (gtag.js) - Google Analytics