共計(jì) 4733 個(gè)字符,預(yù)計(jì)需要花費(fèi) 12 分鐘才能閱讀完成。
這篇文章主要為大家展示了“Oracle 如何向 PostgresQL 移植”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓丸趣 TV 小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Oracle 如何向 PostgresQL 移植”這篇文章吧。
Oracle 向 PostgresQL 移植實(shí)例
1、數(shù)據(jù)移植
1.1、數(shù)據(jù)庫(kù)初始化
以 WINDOWS 平臺(tái)為例
標(biāo)準(zhǔn)版本 PostgresQL 8.0.3
安裝時(shí) LOCALE 必須選擇 C,否則會(huì)產(chǎn)生大量編碼問(wèn)題!?。。?br /> 初始化數(shù)據(jù)庫(kù)選擇 SQL_ASCII 編碼,因?yàn)?8.0.3 安裝時(shí)不允許直接使用 UNICODE 初始化數(shù)據(jù)庫(kù)
管理工具使用 pgAdmin III,因?yàn)榇斯ぞ邥?huì)自動(dòng)偵測(cè)數(shù)據(jù)庫(kù)編碼,默認(rèn)使用 UNICODE,只有在數(shù)據(jù)庫(kù)使用 SQL_ASCII 時(shí),才使用 SQL_ASCII 編碼
1.2、建庫(kù)
1.2.1、建立生產(chǎn)數(shù)據(jù)庫(kù)時(shí)用 UNICODE 編碼,建庫(kù)時(shí)表空間置空(與 ORACLE 表空間概念不同),所有者選擇 Postgres
1.2.2、建好庫(kù)之后請(qǐng)建立 schema,此用法與 ORACLE 相同
1.2.3、PostgresQL 的權(quán)限管理較為嚴(yán)格,建好庫(kù)后創(chuàng)建的所有對(duì)象如不特殊聲明,都將建立在 public schema 下,請(qǐng)注意?。。?!
1.2.4、在庫(kù)中創(chuàng)建的所有對(duì)象所有者均為庫(kù)的所有者(默認(rèn)為 Postgres),如需變更,請(qǐng)手動(dòng)處理
1.2.5、public schema 下創(chuàng)建的視圖、表、函數(shù)等,默認(rèn)不允許其他用戶訪問(wèn),如有需要請(qǐng)?jiān)谑跈?quán)向?qū)е刑砑?public 組的權(quán)限
1.3、建表
1.3.1、數(shù)據(jù)類(lèi)型
Oracle 數(shù)據(jù)類(lèi)型 ||| PostgresQL 數(shù)據(jù)類(lèi)型
VARCHAR2||| VARCHAR
CLOB||| TEXT
DATE||| DATE/TIME/TIMESTAMP(DATE 僅包含日期、TIME 僅包含時(shí)間、TIMESTAMP 均包含, 通常使用 DATE)
NUMBER||| SMALLINT/INTEGER/BIGINT/NUMERIC/REAL/DOUBLE PRECISION(通??捎?NUMERIC)
BLOB||| BYTEA
×上表只包括常見(jiàn)數(shù)據(jù)類(lèi)型中兩者不同的部分
1.3.2、建表腳本
ORACLE 腳本
CREATE TABLE SCHEMA.PREFIX_INFO
(
INFO_ID VARCHAR2(25 BYTE),
INFO_TITLE VARCHAR2(500 BYTE),
INFO_CONTENT CLOB,
INFO_DATE DATE DEFAULT sysdate,
INFO_STATUS VARCHAR2(1 BYTE) DEFAULT 1 ,
LANG_ID NUMBER DEFAULT 1,
INFO_CLICKNUM NUMBER DEFAULT 0,
IS_POP VARCHAR2(1 BYTE) DEFAULT 0 ,
INFO_VALIDDAYS NUMBER DEFAULT 1
)
LOGGING
NOCACHE
NOPARALLEL;
ALTER TABLE SCHEMA.PREFIX_INFO ADD (
CONSTRAINT PK_PREFIX_INFO PRIMARY KEY (INFO_ID));
CREATE SEQUENCE PREFIX_INFO_SEQUENCE
INCREMENT BY 1
START WITH 582
MINVALUE 1
MAXVALUE 9999999999999999999999999999
NOCYCLE
CACHE 20
NOORDER;
PostgresQL 腳本
create table schema.prefix_info
(
info_id varchar(25),
info_title varchar(500),
info_content text,
info_date date default now(),
info_status varchar(1) default 1 ,
lang_id numeric default 1,
info_clicknum numeric default 0,
is_pop varchar2(1) default 0 ,
info_validdays numeric default 1
);
–PostgresQL 中字段名稱(chēng)區(qū)分大小寫(xiě),為保證兼容性,強(qiáng)烈建議腳本中的字符均用小寫(xiě),這樣在 SQL 語(yǔ)句中將忽略大小寫(xiě)
–PostgresQL 中字段類(lèi)型的括號(hào)中只能出現(xiàn)數(shù)字
–PostgresQL 中 sysdate 應(yīng)寫(xiě)為 now(),用來(lái)取系統(tǒng)當(dāng)前時(shí)間
alter table schema.prefix_info add constraint prefix_info_pkey primary
key(info_id);
– 注意增加約束時(shí)的寫(xiě)法,和 ORACLE 略有不同
CREATE SEQUENCE schema.prefix_info_sequence
increment 1
minvalue 1
maxvalue 9223372036854775807
start 582
cache 20;
– 系統(tǒng)默認(rèn)的最大值與 ORACLE 不同
1.3.3、數(shù)據(jù)移植
強(qiáng)烈建議使用 TOAD 中的 SAVE AS 工具,不要使用 export table 工具(時(shí)間格式有問(wèn)題),建好表后可無(wú)縫移植。
2、程序移植
2.1、環(huán)境處理
2.1.1、注意事項(xiàng)
PostgresQL 中的 || 用法與其他數(shù)據(jù)庫(kù)不同:
select a||b from table1;
當(dāng) a 或 b 其中一個(gè)為 null 時(shí),該查詢返回 null,切記切記?。。。?!
2.2、兼容性設(shè)置
2.2.1、PostgresQL 中沒(méi)有 concat 函數(shù),且由于 || 用法的問(wèn)題,無(wú)法使用 || 替換,解決方法為
在 public schema 中創(chuàng)建函數(shù) 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;
– 注意 coalesce()的作用
– 無(wú)需特殊授權(quán)即可在其他 schema 中使用
2.2.2、PostgresQL 中沒(méi)有 dual 虛擬表,為保證程序兼容性,可創(chuàng)建偽視圖(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;
– 必須授權(quán) public 以 select 權(quán)限
2.3、程序移植
2.3.1、concat 函數(shù):見(jiàn) 2.1.2.1,程序中無(wú)需修改
2.3.2、外連接
移植方法:
ORACLE:
簡(jiǎn)單外連接:
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
超級(jí)變態(tài)外連接:
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:
簡(jiǎn)單外連接:
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
超級(jí)變態(tài)外連接:
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
2.3.3、子查詢:
PostgresQL 中子查詢較為規(guī)范,子查詢結(jié)果集必須擁有 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
2.3.4、數(shù)據(jù)分頁(yè)
PostgresQL 中沒(méi)有 rownum,無(wú)法使用 where rownum = X 的方法進(jìn)行分頁(yè),取而代之的是 limit X,offset Y 方法
而 ORACLE 中不允許使用 LIMIT X 的方法
移植方法:
×此移植無(wú)法做到兩種數(shù)據(jù)庫(kù)兼容
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;
– 注意?。imit 必須用于 order by 之后?。。。?!
2.3.4、序列使用:
移植方法:
×此移植無(wú)法做到兩種數(shù)據(jù)庫(kù)兼容
ORACLE:
SELECT SCHEMA.PREFIX_TABLE1_SEQUENCE.NEXTVAL AS nCode FROM DUAL
POSTGRES:
SELECT NEXTVAL(SCHEMA.PREFIX_TABLE1_SEQUENCE) AS nCode FROM DUAL
– 注意,此方法前提是 dual 視圖已建立,如沒(méi)有,可省略 FROM DUAL
2.3.5、JDBC 調(diào)整
使用 postgresql-8.0-312.jdbc3.jar
ORACLE:
db.url=jdbc:oracle:thin:@192.168.0.1:1521:ORCL
POSTGRESQL:
db.url=jdbc:postgresql://192.168.0.1:5432/database
以上是“Oracle 如何向 PostgresQL 移植”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注丸趣 TV 行業(yè)資訊頻道!