以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 |
支持 |
附部分转换前后语句对比图:

变量定义及赋值-1.png

变量定义及赋值-2.png

LOOP-1.png

LOOP-2.png

LOOP-3.png

CASE-1.png

CASE-2.png

CURSOR-1.png

CURSOR-2.png

CURSOR-3.png

EXCEPTION-1.png

EXCEPTION-2.png

EXCEPTION-3.png