更新时间:2024-03-14 GMT+08:00
分享

PL/SQL语言

GaussDB数据库基本兼容的PL/SQL操作符、表达式,控制语句、集合和record等等,不支持预定义的PL/SQL常量和类型、子类型等。

PL/SQL基本语法

表1 PL/SQL操作符

序号

Oracle数据库

GaussDB数据库

差异

1

+

支持

-

2

:=

支持

-

3

=>

支持

-

4

%

支持

-

5

'

支持

-

6

.

支持

-

7

||

支持

-

8

/

支持

-

9

**

不支持

-

10

(

支持

-

11

)

支持

-

12

:

支持

-

13

,

支持

-

14

<<

支持

-

15

>>

支持

-

16

/*

支持

-

17

*/

支持

-

18

*

支持

-

19

"

支持

-

20

..

支持

-

21

=

支持

-

22

<>

支持

-

23

!=

支持

-

24

~=

支持

-

25

^=

支持

-

26

<

支持

-

27

>

支持

-

28

<=

支持

-

29

>=

支持

-

30

@

支持

-

31

--

支持

-

32

;

支持

-

33

-

支持

-

表2 逻辑运算符

序号

Oracle数据库

GaussDB数据库

差异

1

NOT

支持

-

2

AND

支持

-

3

OR

支持

-

表3 比较表达式

序号

Oracle数据库

GaussDB数据库

差异

1

IS [NOT] NULL

支持

-

2

LIKE

支持

-

3

BETWEEN

支持

-

4

IN

支持

-

表4 条件表达式

序号

Oracle数据库

GaussDB数据库

差异

1

simple CASE

支持

-

2

searched CASE

支持

-

表5 变量声明相关参数

序号

Oracle数据库

GaussDB数据库

差异

1

%TYPE

支持

-

2

%ROWTYPE

支持,有差异

GaussDB在多个CN的环境下,存储过程中无法声明临时表的%ROWTYPE及%TYPE属性。因为临时表仅在当前session有效,在编译阶段其他CN无法看到当前CN的临时表。故多个CN的环境下,会提示该临时表不存在。

数据类型兼容性

表6 其他PL/SQL数据类型

序号

Oracle数据库

GaussDB数据库

差异

3

CHARACTER

支持

-

4

VARCHAR

支持

-

5

STRING

不支持

-

6

PLS_INTEGER

不支持

-

7

BINARY_INTEGER

支持

-

表7 用户自定义PL/SQL子类型

序号

Oracle数据库

GaussDB数据库

差异

1

SUBTYPE subtype_name IS base_type

不支持

-

2

SUBTYPE subtype_name IS base_type

{ precision [, scale ] | RANGE low_value .. high_value } [ NOT NULL ]

不支持

-

3

SUBTYPE subtype_name IS base_type [ NOT NULL ]

不支持

-

控制语句

表8 条件语句

序号

Oracle数据库

GaussDB数据库

差异

1

IF THEN

支持

-

2

IF THEN ELSE

支持

-

3

IF THEN ELSIF

支持

-

4

simple CASE:

CASE selector

WHEN selector_value_1 THEN statements_1

WHEN selector_value_2 THEN statements_2

...

WHEN selector_value_n THEN statements_n

[ ELSE

else_statements

END CASE;]

支持

-

5

searched CASE:

CASE

WHEN condition_1 THEN statements_1

WHEN condition_2 THEN statements_2

...

WHEN condition_n THEN statements_n

[ ELSE

else_statements

END CASE;]

支持

-

表9 LOOP循环语句

序号

Oracle数据库

GaussDB数据库

差异

1

[ label ] LOOP

statements

END LOOP [ label ];

支持

-

2

EXIT;

支持

-

3

EXIT WHEN;

支持

-

4

CONTINUE;

支持

-

5

CONTINUE WHEN;

支持

-

表10 FOR循环语句

序号

Oracle数据库

GaussDB数据库

差异

1

[ label ] FOR index IN [ REVERSE ] lower_bound..upper_bound LOOP

statements

END LOOP [ label ];

支持

-

2

EXIT WHEN;

支持

-

3

CONTINUE WHEN;

支持

-

表11 WHILE LOOP循环语句

序号

Oracle数据库

GaussDB数据库

差异

1

[ label ] WHILE condition LOOP

statements

END LOOP [ label ];

支持

-

表12 GOTO语句

序号

Oracle数据库

GaussDB数据库

差异

1

GOTO

支持

-

表13 NULL语句

序号

Oracle数据库

GaussDB数据库

差异

1

NULL

支持

-

集合和record

表14 类型

序号

Oracle数据库

GaussDB数据库

差异

1

Associative array (or index-by table)

支持

-

2

VARRAY (variable-size array)

支持

-

3

Nested table

支持

-

4

record

支持

-

表15 语法

序号

类型

Oracle数据库

GaussDB数据库

差异

1

Associative array (or index-by table)

TABLE OF datatype [ NOT NULL ]

INDEX BY { PLS_INTEGER | BINARY_INTEGER | VARCHAR2 ( v_size ) | data_type }

支持,有差异

  • GaussDB不支持 PLS_INTEGER类型,GaussDB内data_type可以为基础数据类型、或存储过程内定义的record类型、集合类型、数组类型,不支持ref cursor类型。
  • GaussDB内NOT NULL只支持语法不支持功能。

2

VARRAY (variable-size array)

{ VARRAY | [ VARYING ] ARRAY } ( size_limit )

OF datatype [ NOT NULL ]

支持,有差异

GaussDB内不支持not null,不支持datatype为varray类型(varray不能嵌套)。

3

Nested table

TABLE OF datatype [ NOT NULL ]

支持,有差异

GaussDB内NOT NULL只支持语法不支持功能。

4

record

TYPE record_type IS RECORD ( field_definition [, field_definition]... ) ;

支持

-

表16 构造器

序号

Oracle数据库

GaussDB数据库

差异

1

collection_type ( [ value [, value ]... ] )

支持

-

表17 变量赋值

序号

Oracle数据库

GaussDB数据库

差异

1

Associative array (or index-by table)

支持

-

2

VARRAY (variable-size array)

支持,有差异

GaussDB不同类型的数据可以赋值。

3

Nested table

支持

-

4

record

支持,有差异

GaussDB不同类型的数据可以赋值。

表18 集合操作符

序号

Oracle数据库

GaussDB数据库

差异

1

=

支持,有差异

在比较字符串时结果有差异;只支持集合的等值(=)与非等值(<>或!=)比较,不支持其他关系运算和算数运算操作。

2

<>

支持,有差异

在比较字符串时结果有差异;只支持集合的等值(=)与非等值(<>或!=)比较,不支持其他关系运算和算数运算操作。

3

IS[NOT] NULL

支持

-

4

^=

支持,有差异

在比较字符串时结果有差异。

5

~=

不支持

-

6

IS[NOT] A SET

不支持

-

7

IS [NOT] EMPTY

不支持

-

8

expr [ NOT ] MEMBER [ OF ] nested_table

不支持

-

9

nested_table1

[ NOT ] SUBMULTISET [ OF ]

nested_table2

不支持

-

10

[NOT] IN

支持

-

表19 集合MULTISET函数

序号

Oracle数据库

GaussDB数据库

差异

1

MULTISET UNION [ALL | DISTINCT]

支持

-

2

MULTISET EXCEPT [ALL | DISTINCT]

支持

-

3

MULTISET INTERSECT [ALL | DISTINCT]

支持

-

表20 集合类型函数

序号

Oracle数据库

GaussDB数据库

差异

1

exists(idx)

支持

-

2

extend[(count[, idx])]

支持,有差异

GaussDB仅支持nesttable类型。

3

delete[(idx1[, idx2])]

支持

-

4

trim[(n)]

支持,有差异

GaussDB仅支持nesttable类型。

5

count

支持

-

6

first

支持

-

7

last

支持

-

8

prior(idx)

支持

-

9

next(idx)

支持

-

10

limit

支持,有差异

用于nesttable类型,返回集合中最大可以储存的元素个数,只适用于array类型,nesttable返回空。

表21 record变量操作

序号

Oracle数据库

GaussDB数据库

差异

1

构造器

支持

-

2

%ROWTYPE声明变量

支持

-

3

定义常量constant

不支持

-

表22 record比较符

序号

Oracle数据库

GaussDB数据库

差异

1

IS NULL

支持

-

2

=

支持

-

3

>

支持

-

表23 集合相关函数

序号

Oracle数据库

GaussDB数据库

差异

1

unnest_table(anynesttable)

支持

-

2

unnest_table(anyindexbytable)

支持

-

静态SQL

表24 静态查询 SQL语句

序号

Oracle数据库

GaussDB数据库

差异

1

SELECT

支持,有差异

FOR SHARE对检索出来的行加共享锁,不同事务的共享锁不会互相阻塞,若数据在一个事务中被FOR SHARE锁定,在另一个事务中使用SELECT FOR SHARE SKIP LOCKED时,SKIP LOCKED不会跳过锁。

表25 静态DML SQL语句

序号

Oracle数据库

GaussDB数据库

差异

1

INSERT

支持

-

2

UPDATE

支持

-

3

DELETE

支持

-

4

MERGE

支持

-

5

LOCK TABLE

支持

-

表26 静态TCL SQL语句

序号

Oracle数据库

GaussDB数据库

差异

1

COMMIT

支持

-

2

ROLLBACK

支持

-

3

SAVEPOINT

支持

-

4

SET TRANSACTION

支持,有差异

-

表27 伪列

序号

Oracle数据库

GaussDB数据库

差异

1

CURRVAL and NEXTVAL

支持

-

2

LEVEL

支持

-

3

OBJECT_VALUE

不支持

-

4

ROWID

不支持

-

5

ROWNUM

支持,有差异

不推荐ROWNUM条件用于JOIN ON子句,GaussDB中ROWNUM条件用于JOIN ON子句时在LEFT JOIN、RIGHT JOIN、FULL JOIN场景下和MERGE INTO场景下与其他数据库行为不一致,直接进行业务迁移存在风险。

表28 隐式游标属性

序号

Oracle数据库

GaussDB数据库

差异

1

SQL%FOUND

支持

-

2

SQL%NOTFOUND

支持

-

3

SQL%ROWCOUNT

支持

-

4

SQL%ISOPEN

支持

-

5

SQL%BULK_ROWCOUNT

不支持

-

6

SQL%BULK_EXCEPTIONS

不支持

-

表29 显式游标语法及关键字

序号

Oracle数据库

GaussDB数据库

差异

1

CURSOR cursor_name [ parameter_list ] RETURN return_type;

支持

-

2

CURSOR cursor_name [ parameter_list ] [ RETURN return_type ]

IS select_statement;

支持

-

3

OPEN

支持

-

4

CLOSE

支持

-

5

FETCH

支持

-

6

CURRENT OF CURSOR

支持

-

表30 显式游标属性

序号

Oracle数据库

GaussDB数据库

差异

1

SQL%FOUND

支持

-

2

SQL%NOTFOUND

支持

-

3

SQL%ROWCOUNT

支持

-

4

SQL%ISOPEN

支持

-

表31 游标循环

序号

Oracle数据库

GaussDB数据库

差异

1

FOR LOOP

支持

-

表32 自治事务支持场景

序号

Oracle数据库

GaussDB数据库

差异

1

存储过程

支持

-

2

匿名块

支持

-

3

函数

支持

-

4

Package

支持

-

动态SQL

表33 动态SQL语句执行方式

序号

Oracle数据库

GaussDB数据库

差异

1

EXECUTE IMMEDIATE

支持

-

2

OPEN FOR、FETCH 、CLOSE

支持

-

trigger

表34 trigger类型

序号

Oracle数据库

GaussDB数据库

差异

1

DML TRIGGER

支持,有差异

不支持Compound DML Triggers。

2

SYSTEM TRIGGER

不支持

-

表35 create trigger

语法类型

Oracle数据库

GaussDB数据库

差异

create语法

CREATE [ OR REPLACE ] [ EDITIONABLE | NONEDITIONABLE ] TRIGGER plsql_trigger_source

支持,有差异

不支持OR REPLACE 、EDITIONABLE | NONEDITIONABLE、plsql_trigger_source部分支持。

plsql_trigger_source ::=

[schema.] trigger_name

[ sharing_clause ] [ default_collation_clause ]

{ simple_dml_trigger

| instead_of_dml_trigger

| compound_dml_trigger

| system_trigger

}

支持,有差异

不支持schema、 sharing_clause、default_collation_clause。

simple_dml_trigger ::=

{ BEFORE | AFTER } dml_event_clause [ referencing_clause ] [ FOR EACH ROW ]

[ trigger_edition_clause ] [ trigger_ordering_clause ]

[ ENABLE | DISABLE ] [ WHEN ( condition ) ] trigger_body

支持,有差异

不支持referencing_clause、referencing_clause(用from referencing_table代替)、trigger_edition_clause、trigger_ordering_clause、 ENABLE | DISABLE;部分支持trigger_body。

dml_event_clause ::=

{ DELETE | INSERT | UPDATE [ OF column [, column ]... ] }

[ OR { DELETE | INSERT | UPDATE [ OF column [, column]... ] }...

ON [ schema.] { table | view }

不支持

-

trigger_body ::=

{ plsql_block | CALL routine_clause }

支持,有差异

不支持plsql_block,仅支持EXECUTE PROCEDURE function_name ( arguments );方式执行func,并且func需要用户定义,必须声明为不带参数并返回类型为触发器,在触发器触发时执行。

instead_of_dml_trigger ::=

INSTEAD OF { DELETE | INSERT | UPDATE } [ OR { DELETE | INSERT | UPDATE } ]...

ON [ NESTED TABLE nested_table_column OF ] [ schema. ] noneditioning_view

[ referencing_clause ] [ FOR EACH ROW ]

[ trigger_edition_clause ] [ trigger_ordering_clause ]

[ ENABLE | DISABLE ] trigger_body

支持,有差异

不支持NESTED TABLE nested_table_column OF、referencing_clause、trigger_edition_clause、trigger_ordering_clause、ENABLE | DISABLE。

compound_dml_trigger ::=

CREATE trigger FOR dml_event_clause ON view

COMPOUND TRIGGER

INSTEAD OF EACH ROW IS BEGIN

statement;

END INSTEAD OF EACH ROW;

不支持

-

system_trigger ::=

{ BEFORE | AFTER | INSTEAD OF }

{ ddl_event [OR ddl_event]... | database_event [OR database_event ]... }

ON { [schema.] SCHEMA | [ PLUGGABLE ] DATABASE }

[ trigger_ordering_clause ] [ ENABLE | DISABLE ] trigger_body

不支持

-

表36 alter trigger

序号

Oracle数据库

GaussDB数据库

差异

1

ALTER TRIGGER [ schema. ] trigger_name

{ trigger_compile_clause

| { ENABLE | DISABLE }

| RENAME TO new_name

| { EDITIONABLE | NONEDITIONABLE }

} ;

支持,有差异

不支持schema、trigger_compile_clause、{ ENABLE | DISABLE }、{ EDITIONABLE | NONEDITIONABLE }。

表37 drop trigger

序号

Oracle数据库

GaussDB数据库

差异

1

DROP TRIGGER [ schema. ] trigger ;

支持,有差异

不支持schema。

Oracle数据库名为*_TRIGGERS的视图统计了trigger的相关信息,视图具体差异参考系统视图章节。

表38 Nested, Package, and Standalone Subprograms 兼容性

序号

Oracle数据库

GaussDB数据库

差异

1

nested subprogram(子块)

支持,有差异

不支持重载,不支持定义为自治事务,不支持SETOF的使用,仅限一个限定符引用嵌套子程序或嵌套子程序的变量。

2

package subprogram

支持

-

3

standalone subprogram(包含Function & Procedure)

支持

-

4

匿名块

支持

-

表39 RETURN语句支持情况

序号

Oracle数据库

GaussDB数据库

差异

1

Function

支持

-

2

Procedure

支持

-

3

匿名块

支持

-

表40 Function相关参数

序号

Oracle数据库

GaussDB数据库

差异

1

DETERMINISTIC

支持,有差异

GaussDB中为IMMUTABLE。

2

PARALLEL_ENABLE

不支持

-

3

PIPELINED

不支持

-

4

RESULT_CACHE

不支持

-

表41 参数形式支持

序号

Oracle数据库

GaussDB数据库

差异

1

IN

支持

-

2

OUT

支持

-

3

IN OUT

支持

-

表42 CREATE语句

序号

Oracle数据库

GaussDB数据库

差异

1

CREATE FUNCTION

支持

-

2

CREATE LIBRARY

不支持

-

3

CREATE PACKAGE

支持

-

4

CREATE PACKAGE BODY

支持

-

5

CREATE PROCEDURE

支持

-

6

CREATE TRIGGER

支持

-

7

CREATE TYPE

支持,有差异

支持类型不同。

8

CREATE TYPE BODY

不支持

-

表43 ALTER语句

序号

Oracle数据库

GaussDB数据库

差异

1

ALTER FUNCTION

支持

-

2

ALTER LIBRARY

不支持

-

3

ALTER PACKAGE

支持

-

4

ALTER PROCEDURE

支持

-

5

ALTER TRIGGER

支持

-

6

ALTER TYPE

支持

-

表44 DROP语句

序号

Oracle数据库

GaussDB数据库

差异

1

DROP FUNCTION

支持

-

2

DROP LIBRARY

不支持

-

3

DROP PACKAGE

支持

-

4

DROP PROCEDURE

支持

-

5

DROP TRIGGER

支持

-

6

DROP TYPE

支持

-

7

DROP TYPE BODY

不支持

-

表45 Function、Procedure、匿名块相关关键字

序号

Oracle数据库

GaussDB数据库

差异

1

ACCESSIBLE BY

不支持

-

2

AGGREGATE

支持

-

3

DETERMINISTIC

支持,有差异

-

4

PIPE ROW

不支持

-

5

PIPELINED

不支持

-

6

SQL_MACRO

不支持

-

7

RESTRICT_REFERENCES

不支持

-

8

INLINE

支持,有差异

-

表46 异常处理相关关键字

序号

Oracle数据库

GaussDB数据库

差异

1

EXCEPTION_INIT

支持,有差异

不支持与系统错误码进行绑定。

2

Exception

支持

-

3

Exception Handler

支持

-

4

SQLCODE

支持

-

5

SQLERRM

支持

-

表47 其他PL/SQL关键字

序号

Oracle数据库

GaussDB数据库

差异

1

COVERAGE

不支持

-

2

COLLATION

支持

-

3

DEPRECATE

不支持

-

4

FORALL

支持

-

5

NOCOPY

不支持

-

6

RETURNING INTO

支持

-

7

SERIALLY_REUSABLE

不支持

-

8

SHARING

不支持

-

9

BULK COLLECT

支持

-

分享:

    相关文档

    相关产品