义的变量来替换SQL%ROWCOUNT。
%ISOPEN,%NOTFOUND
PostgreSQL不支持%ISOPEN和%NOTFOUND,但可以在存储过程内部定义一个boolean变量,然后当游标打开或关闭时手工去更新这个变量的值。
表
当定义表时,如果列名是关键字要用用引号引起来。如:
CREATE TABLE AD_TRACE
(
"WHEN" TIMESTAMP NOT NULL,
NO NUMERIC DEFAULT 0 NOT NULL,
WHAT VARCHAR(2000) NOT NULL
);
列WHEN用引号引起来以避免转到PostgreSQL后出现问题。
同样在约束、解发器、存储过程、视图和函数中也要这样处理。
函数
可以使用PERFORM和SELECT调用函数。因为PostgreSQL不支持默认参数,可以定义一个带有默认参数的重载函数。
另外如果要使自动翻译能正常工作,你应该遵循以下的建议:
AS和IS的左边不能有空格
函数名不能用引号
函数中,END前不能有空格。
存储过程
在PostgreSQL中有两种方法调用存储过程:
变量名:=存储过程名(...)
使用SELECT。这种方法用于存储过程返回多个参数时使用。
视图
PostgreSQL不支持可更新视图。如果要通过视图更新要创建一系列的规则。
在PostgreSQL中没有USER_TABLES和USER_TAB_COLUMNS。应该根据PostgreSQL的pg_class或pg_attribute表来创建。
触发器
触发器的规则如下:
通常来说,父表中的触发器不应该修改子表中的列,因为子表中的触发器经常会参考父表中的数据,否则会引起mutating table的错误。
触发器的名称不要用引号引起来,否则PostgreSQL会作为文本处理。
所有的触发器都要有DECLARE在合法的注释前。
PostgreSQL不支持延迟计算值。如下面的语句在Oracle中可以运行但不能在PostgreSQL中运行:
IF INSERTING OR (UPDATING AND :OLD.FIELD = '') THEN
正确的方法是:
IF INSERTING THEN ...
IF UPDATING THEN
IF :OLD.NAME = '' THEN
PostgreSQL中总会有返回值。按不同的操作类型分别返回OLD(DELETE)或NEW(INSERT/UPDATE)。
如果使用自动翻译应注意:
最后一个EXCEPTION的左边不能有空格。自动翻译者用最后一个EXCEPTION来设置返回值。
最后一个END的左边不能有空格。缩排用于决定函数据结束。
序列数
PostgreSQL中的bigInts类型是18位的。将
sequence_name.NEXTVAL
用
nextval("sequence_name")
代替。如果是使用自动转换,这个会自动的修改。
命令
下面列出了从Oracle转换到PostgreSQL时要修改的语句:
Oracle PostgreSQL
SQLCODE SQLSTATE
RAISE; RAISE EXCEPTION ;
RAISE_APPLICATION_ERROR RAISE ERROR ;
DBMS.OUTPUT RAISE NOTICE '%'
ROWNUM LIMIT
MINUS EXCEPT
ISREFCURSOR REFCURSOR
EXECUTE IMMEDIATE EXECUTE
EXCEPTION NO_DATA_FOUND EXCEPTION DATA EXCEPTION
COMMIT
ROLLBACK RAISE EXCEPTION
支持PostgreSQL8.3
为了支持PostgreSQL8.3,Openbravo2.40alpha已经调整了源代码。为了兼容这个版本的P