九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
oracle遷移到pg問題整理
  這個(gè)帖子轉(zhuǎn)自http://bbs.pgsqldb.com,把兩個(gè)帖子合在一起了

很多內(nèi)容是網(wǎng)上查的資料,我只是整理下,有遺漏的地方,歡迎補(bǔ)充
首先用工具(Ora2pg)自動(dòng)轉(zhuǎn)換
由于這個(gè)項(xiàng)目后臺(tái)程序量很大,存儲(chǔ)過程+觸發(fā)器大約有15萬行代碼。
用這個(gè)工具可以將一些oracle與pgsql的語(yǔ)法差異自動(dòng)處理下,但不是全部,剩下的需要手工修改。

ORACLE語(yǔ)法 → PostgreSQL語(yǔ)法
1、VARCHAR2 → varchar
2、DATE → timestamp
3、SYSDATE → localtimestamp
4、Oracle中''和NULL是相同的,但pgsql是不同的,所以需要將''修改成NULL
5、字符串連接符 ||
Oracle: 'a'||null 結(jié)果是'a'
pgsql: 'a'||null 結(jié)果是null
所以用concat()函數(shù)替代
6、trunc(時(shí)間) → date_trunc()
7、to_char, to_number, to_date pgsql都需要指定格式
8、DECODE → case
9、NVL → coalesce()
10、外連接(+) → left(right) join
11、GOTO語(yǔ)句 → pgsql不支持
12、pgsql不支持procedure和package,都需要改寫成function
當(dāng)package有全局變量的情況修改起來比較麻煩,我們是用臨時(shí)表傳遞的。
14、COMMIT,ROLLBACK;SAVEPOINT → pgsql不支持
15、Oracle的系統(tǒng)包,例如 DBMS_OUTPUT,DBMS_SQL,UTIL_FILE,UTIL_MAIL → pgsql不支持
16、異常處理方法不同
17、trigger的語(yǔ)法不同
18、日期的加減計(jì)算語(yǔ)法不同。

13、cursor的屬性
%FOUND → found
%NOTFOUND → not found
%ISOPEN → pgsql不支持
%ROWCOUNT → pgsql不支持
另外關(guān)于cursor還發(fā)現(xiàn)了其他差異,見下面:


13.1、pgsql中cursor名是全局的

例如函數(shù)A和函數(shù)B有一個(gè)相同名字的cursor,當(dāng)A打開這個(gè)cursor,然后調(diào)用B,當(dāng)B再打開同名的cursor時(shí),會(huì)拋出異常。
這個(gè)問題在oracle中不會(huì)出現(xiàn)。
解決辦法:用隱式聲明定義cursor,或者保證所有的程序中cursor名唯一。

13.2、pgsql中使用for update 的cursor,loop循環(huán)次數(shù)很可能被改變

例如這樣一段代碼

for rec in (select * from employee for update) loop
update employee set dep_no = 'test';
end loop;

按通常的理解,如果employee中有100條記錄,這個(gè)循環(huán)就會(huì)執(zhí)行100次,
但pgsql只會(huì)執(zhí)行1次,因?yàn)橐粋€(gè)update語(yǔ)句會(huì)把所有的記錄都更新了,好像與鎖有關(guān),
如果把 for update 去掉,就會(huì)執(zhí)行100次。

這個(gè)和cursor的聲明及使用方式有關(guān),見下面實(shí)踐:
測(cè)試了加上 " for update " 和不加的情況,測(cè)試的結(jié)果都是要更新游標(biāo)結(jié)果集的次數(shù),

實(shí)驗(yàn)如下:


--1 創(chuàng)建表和初始數(shù)據(jù)
skytf=> create table employee(id serial,emp_name varchar(32),dep_no int4);
NOTICE: CREATE TABLE will create implicit sequence "employee_id_seq" for serial column "employee.id"
CREATE TABLE

skytf=> insert into employee (emp_name,dep_no) select generate_series(1,3)||'a',1;
INSERT 0 3

skytf=> insert into employee (emp_name,dep_no) select generate_series(4,10)||'b',2;
INSERT 0 7

skytf=> select * From employee;
id | emp_name | dep_no
----+----------+--------
1 | 1a | 1
2 | 2a | 1
3 | 3a | 1
4 | 4b | 2
5 | 5b | 2
6 | 6b | 2
7 | 7b | 2
8 | 8b | 2
9 | 9b | 2
10 | 10b | 2
(10 rows)


--2 創(chuàng)建函數(shù),不帶 for update 屬性
CREATE or replace FUNCTION fun_employee() RETURNS INTEGER AS
LANGUAGE 'plpgsql';


--3 創(chuàng)建函數(shù),加上 for update 屬性
CREATE or replace FUNCTION fun_employee_for_update() RETURNS INTEGER AS
LANGUAGE 'plpgsql';


--4 測(cè)試 fun_employee()
skytf=> select fun_employee();
NOTICE: The update_flag is 1
NOTICE: The update_flag is 2
NOTICE: The update_flag is 3
NOTICE: The update_flag is 4
NOTICE: The update_flag is 5
NOTICE: The update_flag is 6
NOTICE: The update_flag is 7
NOTICE: The update_flag is 8
NOTICE: The update_flag is 9
NOTICE: The update_flag is 10
fun_employee
--------------
0
(1 row)


--5 測(cè)試 fun_employee_for_update()
skytf=> select fun_employee_for_update();
NOTICE: The update_flag is 1
NOTICE: The update_flag is 2
NOTICE: The update_flag is 3
NOTICE: The update_flag is 4
NOTICE: The update_flag is 5
NOTICE: The update_flag is 6
NOTICE: The update_flag is 7
NOTICE: The update_flag is 8
NOTICE: The update_flag is 9
NOTICE: The update_flag is 10
fun_employee_for_update
-------------------------
0
(1 row)

備注:根據(jù)測(cè)試結(jié)果輸出,兩個(gè)函數(shù)都執(zhí)行了 10 次 update 語(yǔ)句。


--6
把什么的函數(shù)改為如下聲明的cursor,只執(zhí)行一次

CREATE or replace FUNCTION fun_employee_for_update() RETURNS INTEGER AS
360docimg_501_360docimg_502_360docimg_503_360docimg_504_360docimg_505_360docimg_506_360docimg_507_360docimg_508_360docimg_509_360docimg_510_360docimg_511_360docimg_512_360docimg_513_360docimg_514_360docimg_515_360docimg_516_360docimg_517_360docimg_518_360docimg_519_360docimg_520_360docimg_521_360docimg_522_360docimg_523_360docimg_524_360docimg_525_360docimg_526_360docimg_527_360docimg_528_360docimg_529_360docimg_530_360docimg_531_360docimg_532_360docimg_533_360docimg_534_360docimg_535_360docimg_536_360docimg_537_360docimg_538_360docimg_539_360docimg_540_360docimg_541_360docimg_542_360docimg_543_360docimg_544_360docimg_545_360docimg_546_360docimg_547_360docimg_548_360docimg_549_360docimg_550_360docimg_551_360docimg_552_360docimg_553_360docimg_554_360docimg_555_360docimg_556_360docimg_557_360docimg_558_360docimg_559_360docimg_560_360docimg_561_360docimg_562_360docimg_563_360docimg_564_360docimg_565_360docimg_566_360docimg_567_360docimg_568_360docimg_569_360docimg_570_360docimg_571_360docimg_572_360docimg_573_360docimg_574_360docimg_575_360docimg_576_360docimg_577_360docimg_578_360docimg_579_360docimg_580_360docimg_581_360docimg_582_360docimg_583_360docimg_584_360docimg_585_360docimg_586_360docimg_587_360docimg_588_360docimg_589_
LANGUAGE 'plpgsql';


另外:
oracle中 %rowcount pg 可以用 GET DIAGNOSTICS integer_var = ROW_COUNT;
oracle 中我們調(diào)試過程時(shí)常用 output.putline 去輸出一些變量的值 在pg 中 可以用 RAISE NOTICE 'i IS %', i; 去輸出你想輸出的變量。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Oracle觸發(fā)器語(yǔ)法(三)
Oracle Cursor的使用
oracle cursor 學(xué)習(xí)小結(jié)
Oracle中的for和while循環(huán)
多維分析后臺(tái)實(shí)踐 3:維度排序壓縮
Oracle游標(biāo)使用大全2
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服