久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Oracle如何向PostgresQL移植

共計(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è)資訊頻道!

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-07-19發(fā)表,共計(jì)4733字。
轉(zhuǎn)載說(shuō)明:除特殊說(shuō)明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請(qǐng)注明出處。
評(píng)論(沒(méi)有評(píng)論)
主站蜘蛛池模板: 盐山县| 香格里拉县| 临邑县| 古田县| 霍邱县| 临西县| 姜堰市| 汝城县| 罗源县| 木兰县| 洛南县| 简阳市| 祥云县| 肇庆市| 河曲县| 旬阳县| 政和县| 尚义县| 安乡县| 乌鲁木齐县| 遵义县| 泗阳县| 巴东县| 临夏市| 乌兰察布市| 恩平市| 柞水县| 淳化县| 潞城市| 通化市| 温州市| 唐河县| 德兴市| 喜德县| 夏河县| 渝中区| 江安县| 厦门市| 葵青区| 崇仁县| 达孜县|