PG和Oracle的差异

本文对比了PSQL与SQLPlus的客户端功能,包括自动补全、执行时间记录等功能的区别,并介绍了两者在数据字典方面的不同表现。此外,还讨论了Oracle与PostgreSQL在表名大小写存储习惯上的差异。
客户端功能对比之一:


psql中的自动补全功能:\dt e然后再按两次tab键,列出以e开头的所有表
sqlplus中,只能去查select * from dba_tables where table_name like 'E%';


之二:
PG的\timing
sqlplus中的set timing on
看一个sql语句从开始执行到执行结束的消耗时间.




数据字典对比:
Oracle中和PG中,均执行如下语句:
create table tab_highgo (int c1);


Oracle数据库的数据字典(dba_tables)中,存储的表名叫做TAB_HIGHGO,即:Oracle数据字典中默认是存储的大写的.


PG数据库的数据字典()中,存储的表名叫做tab_highgo ,即:PG数据字典中默认是存储的小写的.


参考文章:http://blog.youkuaiyun.com/msdnchina/article/details/45289071

字符集:
Oracle推荐使用al32utf8
<think>好的,我现在要回答用户关于OraclePostgreSQL(PG)基础语法差异的问题。首先,我需要确保自己正确理解这两个数据库系统的语法特点,然后找出它们之间的主要区别,并组织成清晰的结构。 首先,回忆一下OraclePG的基本情况。Oracle是商业数据库,语法上可能更倾向于企业级特性,比如PL/SQL。而PG是开源数据库,使用PL/pgSQL,语法可能更接近标准SQL,但也有一些自己的扩展。 接下来,考虑用户可能需要哪些方面的比较。常见的差异可能包括数据类型、字符串连接、日期处理、分页查询、自增列处理、事务控制、DML语句差异、函数存储过程等。每个方面都需要详细对比,给出例子,这样用户更容易理解。 比如,数据类型方面,Oracle有VARCHAR2,而PG用VARCHAR或者TEXT。日期处理上,Oracle用SYSDATE,PG用NOW()或者CURRENT_TIMESTAMP。分页查询的话,Oracle用ROWNUM或12c之后的OFFSET-FETCH,而PG用LIMITOFFSET。这些都需要具体例子说明。 然后,字符串连接符,Oracle是||,但PG也可以用||,不过要注意Oracle中可能用CONCAT函数,但PG同样支持。不过这里可能需要确认是否正确,可能用户这里记错了,比如CONCAT在Oracle中的使用情况? 自增列的处理,Oracle用序列触发器,或者12c后的自增列,而PG用SERIAL类型或者IDENTITY列。这里需要明确两者的不同实现方式,并给出例子。 事务控制方面,Oracle默认不自动提交,而PG可能根据配置不同,但通常也是默认需要显式提交。不过需要确认,可能PG在某些客户端中的自动提交设置可能不同,但语法上两者都是用COMMITROLLBACK。 函数存储过程的区别Oracle中函数存储过程都使用CREATE OR REPLACE,而PG中函数使用CREATE FUNCTION,存储过程在较新版本中可能有CREATE PROCEDURE,但传统上可能还是用函数。此外,语言方面,Oracle是PL/SQL,PG是PL/pgSQL,需要注意语法差异,比如变量声明、循环结构等。 还有隐式游标的处理,比如Oracle的FOR循环可以自动处理游标,而PG可能需要显式使用游标或者使用RETURN QUERY。 此外,系统函数操作符的差异,比如类型转换,Oracle用TO_DATE,PG用TO_TIMESTAMP,或者CAST。还有正则表达式的语法差异,比如PG支持更丰富的正则表达式操作符。 还需要考虑其他方面,比如分页查询中的ROWNUMLIMIT,隐式转换是否存在,以及DDL语句的差异,比如修改列名或类型的语法是否相同。 在组织内容时,需要分点列出,每个差异点给出OraclePG的示例,并说明注意事项。结构要清晰,便于用户比较。 需要确保所有示例中的LaTeX格式正确,行内公式用$...$,独立公式用$$...$$,但可能在这个问题中公式较少,主要是代码示例,但用户可能有其他数学表达式,所以要注意检查。 最后,总结差异,提醒用户在实际迁移或切换时需要注意的地方,比如语法调整、函数替换、自增列处理等,可能还需要测试调整。 现在需要验证一些不确定的点,比如PG是否支持存储过程,自PG 11之后是支持CREATE PROCEDURE的,但之前是通过函数实现的。所以在比较时要注明版本差异。此外,Oracle的隐式游标PG的显式处理,可能需要更准确的例子。 另外,关于字符串连接,OraclePG都支持||,所以这里可能需要确认是否有其他差异,比如处理NULL时的行为,或者CONCAT函数的不同。例如,Oracle的CONCAT只支持两个参数,而PG的CONCAT可以多个,或者使用||更方便。 在日期加减方面,Oracle使用INTERVAL的方式,而PG可能也支持类似的方式,但函数名可能不同,比如DATEADD在其它数据库,但PG可能使用date + interval。 需要确保每个差异点的例子正确,并且语法正确。例如,Oracle的分页在12c之前使用子查询ROWNUM,而之后可以使用OFFSET-FETCH。PG则一直使用LIMITOFFSET。 另外,关于事务控制,Oracle中执行DML后需要显式COMMIT,而PG中默认是自动提交吗?实际上,这取决于客户端设置,比如psql默认是自动提交,但在事务块中(BEGIN之后)需要显式提交。因此,在语法上两者都使用COMMIT,但默认行为可能不同,需要说明。 最后,检查是否有遗漏的重要差异点,比如索引的创建语法、约束的处理、触发器的定义等,但用户问题可能更关注基础语法,所以可能不需要深入这些高级特性。 总结以上思考,现在组织成结构化的回答,分点列出主要差异,每个点包括OraclePG的语法示例,以及注意事项。</think>以下是OraclePostgreSQL(PG)基础语法的主要差异对比,按常见使用场景分类整理: --- ### 一、**数据类型差异** | **场景** | **Oracle语法** | **PG语法** | **注意事项** | |------------------|-------------------------|-------------------------|----------------------------------| | 字符串类型 | `VARCHAR2(50)` | `VARCHAR(50)` 或 `TEXT` | PG的`TEXT`类型无长度限制 | | 日期类型 | `DATE`(含日期时间) | `TIMESTAMP` 或 `DATE` | Oracle的`DATE`包含时间,PG的仅日期需显式指定`DATE` | --- ### 二、**字符串连接** | **场景** | **Oracle语法** | **PG语法** | **示例** | |------------------|-------------------------|-------------------------|----------------------------------| | 字符串拼接 | `CONCAT(a, b)` 或 `||` | `||` | Oracle的`CONCAT`只支持两个参数,PG的`||`更灵活 | **示例:** - Oracle: `SELECT 'Hello' || 'World' FROM DUAL;` - PG: `SELECT 'Hello' || 'World';` --- ### 三、**日期处理** | **场景** | **Oracle语法** | **PG语法** | **说明** | |------------------|-------------------------|-------------------------|----------------------------------| | 当前时间 | `SYSDATE` | `NOW()` 或 `CURRENT_TIMESTAMP` | Oracle默认含时间,PG需指定精度(如`CURRENT_TIMESTAMP(0)`) | | 日期加减 | `SYSDATE + 1`(加1天) | `NOW() + INTERVAL '1 DAY'` | PG必须显式使用`INTERVAL` | --- ### 四、**分页查询** | **场景** | **Oracle语法** | **PG语法** | |------------------|---------------------------------|---------------------------------| | 分页 | `ROWNUM`(旧版)或 `OFFSET-FETCH`(12c+) | `LIMIT` `OFFSET` | **示例:** - Oracle (12c+): ```sql SELECT * FROM table ORDER BY id OFFSET 10 ROWS FETCH NEXT 5 ROWS ONLY; ``` - PG: ```sql SELECT * FROM table ORDER BY id LIMIT 5 OFFSET 10; ``` --- ### 五、**自增列处理** | **场景** | **Oracle语法** | **PG语法** | |------------------|---------------------------------|---------------------------------| | 自增主键 | `SEQUENCE` + `TRIGGER` 或 `IDENTITY`(12c+) | `SERIAL` 或 `GENERATED ALWAYS AS IDENTITY` | **示例:** - Oracle (IDENTITY): ```sql CREATE TABLE t (id NUMBER GENERATED ALWAYS AS IDENTITY, ...); ``` - PG (SERIAL): ```sql CREATE TABLE t (id SERIAL PRIMARY KEY, ...); ``` --- ### 六、**事务控制** | **场景** | **Oracle语法** | **PG语法** | **说明** | |------------------|-------------------------|-------------------------|----------------------------------| | 提交事务 | `COMMIT;` | `COMMIT;` | Oracle默认需显式提交,PG根据会话设置可能自动提交 | | 回滚事务 | `ROLLBACK;` | `ROLLBACK;` | 语法一致,行为依赖事务块 | --- ### 七、**DML语句差异** | **场景** | **Oracle语法** | **PG语法** | **示例** | |------------------|-------------------------|-------------------------|----------------------------------| | 插入默认值 | `INSERT INTO t VALUES (DEFAULT);` | 同Oracle | 两者均支持 | | 插入多行 | 不支持单语句多行 | `INSERT INTO t VALUES (1), (2);` | Oracle需多次执行或使用UNION ALL | --- ### 八、**函数存储过程** | **场景** | **Oracle语法(PL/SQL)** | **PG语法(PL/pgSQL)** | **说明** | |------------------|-------------------------|-------------------------|----------------------------------| | 函数定义 | `CREATE FUNCTION ... RETURN NUMBER` | `CREATE FUNCTION ... RETURNS INT` | PG返回值用`RETURNS`,Oracle用`RETURN` | | 存储过程 | `CREATE PROCEDURE` | `CREATE PROCEDURE`(PG 11+) | PG早期版本用函数替代 | **示例:** - Oracle函数: ```sql CREATE FUNCTION func() RETURN NUMBER IS BEGIN RETURN 1; END; ``` - PG函数: ```sql CREATE FUNCTION func() RETURNS INT AS $$ BEGIN RETURN 1; END; $$ LANGUAGE plpgsql; ``` --- ### 九、**其他差异** 1. **空值判断** - Oracle: `NVL(col, 0)` - PG: `COALESCE(col, 0)` 2. **正则表达式** - Oracle: `REGEXP_LIKE(str, 'pattern')` - PG: `str ~ 'pattern'`(区分大小写)或 `~*`(不区分) 3. **类型转换** - Oracle: `TO_DATE('2023', 'YYYY')` - PG: `TO_TIMESTAMP('2023', 'YYYY')` 或 `CAST('2023' AS DATE)` --- ### **总结建议** 1. **迁移注意事项**:需调整分页、自增列、日期函数等语法。 2. **测试验证**:重点关注隐式类型转换函数兼容性(如`NVL` vs `COALESCE`)。 3. **性能优化**:PG的索引类型更丰富(如GIN、GiST),可针对性优化。 实际开发中建议查阅官方文档或使用迁移工具(如`ora2pg`)辅助转换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值