以oracle 11g pl/sql语法为例,目标postgresql版本10.5
pl/sql语法转换
1. 变量定义及赋值
—— | 是否支持 |
---|---|
普通类型:NUMBER,VARCHAR2,BOOLEAN,%ROWTYPE | 支持 |
table types:TYPE IS TABLE OF | 不支持,定义时报语法错误 |
数组类型 TYPE IS VARRAY | 不支持,定义时报语法错误 |
2.LOOP语句
—— | 是否支持 |
---|---|
LOOP ... END LOOP | 支持 |
带 CONTINUE, EXIST关键字 | 支持 |
LOOP嵌套LOOP | 支持 |
多个LOOP语句 | 不支持,只转换了第一个LOOP |
3.CASE语句
—— | 是否支持 |
---|---|
CASE...END CASE | 支持 |
多个CASE语句 | 支持 |
4.CURSOR
—— | 是否支持 |
---|---|
CURSOR 带参数、不带参数 | 支持 |
FOR IN CURSOR | 支持 |
CURSOR 关键字%NOTFOUND | %NOTFOUND嵌套在FOR IN LOOP语句中时未转换成 NOT FOUND,导致执行出错 |
多个CURSOR | 支持,但是上个cursor OPEN之后需要CLOSE,否则执行的时候到下一个cursor会报错 |
5.EXCEPTION
—— | 是否支持 |
---|---|
RAISE EXCEPTION | 支持 |
声明EXCEPTION_INIT | 不支持 |
oracle自带异常INVALID_NUMBER | 不支持,未转换 |
6.EXECUTE IMMEDIATE
—— | 是否支持 |
---|---|
EXECUTE IMMEDIATE | 支持,转换为EXECUTE,但是EXECUTE的语句未转换 |
EXECUTE IMMEDIATE.. USING [IN OUT]... | 不支持 |
7.EXPRESSION
—— | 是否支持 |
---|---|
+,-,*,/,(),=,<>,!=,<,>,<=,>=,LIKE,BETWEEN,IN | 支持 |
**(取幂运算符) | 不支持 |
~=关系运算符(not equal) | 不支持 |
^=关系运算符(not equal) | 不支持 |
8.FORALL语句
—— | 是否支持 |
---|---|
FORALL | 不支持,pl/pgsql不支持该语法 |
9.GOTO语句
—— | 是否支持 |
---|---|
GOTO | 不支持,pl/pgsql不支持该语法 |
10.IF THEN语句
—— | 是否支持 |
---|---|
IF..ELSIF..ELSE..END IF | 支持 |
嵌套IF | 支持 |
11.RETURN
—— | 是否支持 |
---|---|
RETURN... | 支持 |
RETURN... INTO... | 支持 |
12.WHILE LOOP语句
—— | 是否支持 |
---|---|
WHILE..LOOP..END LOOP | 支持 |
多个WHILE LOOP | 支持 |
附部分转换前后语句对比图: