标签
PostgreSQL , EDB , ppas , epas , enterprisedb , 阿里云
背景
Oracle兼容性越高,迁移改造工作量越少,时间成本越低。对于大多数传统企业来说,去O已势在必行。
PostgreSQL 数据库本身与O的兼容性还行,同时功能覆盖度也还是很不错的,所以自己有专业研发团队的企业,选择PG来去O是不错的选择,其中也有很多非常成功的案例,例如平安集团,邮储银行。
去O需要耗费较多研发资源,对于已有系统来说,多多少少都会涉及改造应用程序。并不是所有企业都有这个条件,所以去O去到哪里?目标数据库的Oracle兼容性至关重要。
PostgreSQL 数据库生态的商业数据库中,EDB为首,从2005年开始基于PostgreSQL的代码适配Oracle,已经有14年的Oracle兼容性适配积累,应该来说是PG生态中,ORACLE兼容性最好的产品了。
Oracle兼容性涉及
1、SQL语法
2、类型
3、函数
4、包
5、索引类型
6、操作符
7、格式(内部存储格式,输入输出格式)
8、样式(使用样式,例如 null='')
9、编程语言
10、自定义pl/sql 存储过程
11、自定义pl/sql 函数
12、自定义pl/sql 包
13、客户端驱动(OCI)
14、客户端编程(PRO*C)
2015年,阿里云与EDB合作推出云端RDS PPAS,兼容Oracle的版本。兼具了PostgreSQL社区版本特性,以及Oracle兼容性。EDB在以上兼容性做得非常到位。
截止目前,已有很多传统客户借助PPAS产品,几乎无痛地成功去O(从8i到12c都有非常成功的案例)。
2018年云栖大会阿里云与EDB达成深层战略合作。为客户去O提供更好的服务与产品。
兼容性评估、不兼容转换、整体迁移工具
去O除了数据库引擎,还有一个更不可或缺的是去O工具与生态。
ADAM是阿里云提供的去O兼容性评估、不兼容转换、整体迁移工具。提供能力:
1、兼容性评估,改造工作量
2、不兼容转换
3、schema迁移
4、全量数据迁移
5、增量迁移
6、一致性校验
7、SQL、存储过程调用一致性校验
8、仿真回放与结果一致性校验
9、引擎独特特性优化
10、风险揭示(慢SQL揭示)
11、拆库建议
12、分库建议
13、一键迁移
14、优化与诊断
15、迁移过程植入人工干预(DDL允许改动(结构变更、索引变更...),迁移数据允许增加WHERE条件(部分、满足条件迁移))
16、并行迁移
17、多合一迁移
18、一拆多迁移
O兼容性对比
以内置系统表、包的兼容性入手,分析Oracle兼容性是否到了深水区。
一、pg 社区版本 orafce
pg社区版本,通过增加orafce插件,实现了少部分的Oracle兼容性。
1、少量包
2、一些O常用函数
3、一些O的类型
4、一些系统视图
5、dual
6、少量系统表
1 包
postgres=# select oid,nspname,obj_description(oid) from pg_namespace order by 2;
oid | nspname | obj_description
---------+--------------------+----------------------------------
1912706 | dbms_alert |
1912769 | dbms_assert |
1912527 | dbms_output |
1912593 | dbms_pipe |
1912797 | dbms_random |
1912725 | dbms_utility |
12989 | information_schema |
1912485 | oracle |
11 | pg_catalog | system catalog schema
11804 | pg_temp_1 |
99 | pg_toast | reserved schema for TOAST tables
11805 | pg_toast_temp_1 |
1912778 | plunit |
1912684 | plvchr |
1912626 | plvdate |
1912728 | plvlex |
1912480 | plvstr |
1912716 | plvsubst |
2200 | public | standard public schema
1912730 | utl_file |
(20 rows)
2 包内支持方法
postgres=# select proname from pg_proc where pronamespace=(select oid from pg_namespace where nspname='dbms_random') order by 1;
proname
------------
initialize
normal
random
seed
seed
string
terminate
value
value
(9 rows)
postgres=# select proname from pg_proc where pronamespace=(select oid from pg_namespace where nspname='dbms_output') order by 1;
proname
--------------
disable
enable
enable
get_line
get_lines
new_line
put
put_line
serveroutput
(9 rows)
3 包内支持方法的源代码
postgres=# select pronamespace::regnamespace,proname,prosrc,probin from pg_proc where proname='put_line';
pronamespace | proname | prosrc | probin
--------------+----------+------------------------------------------------+----------------
dbms_output | put_line | dbms_output_put_line | $libdir/orafce
utl_file | put_line | utl_file_put_line | $libdir/orafce
utl_file | put_line | SELECT utl_file.put_line($1, $2::text); |
utl_file | put_line | utl_file_put_line | $libdir/orafce
utl_file | put_line | SELECT utl_file.put_line($1, $2::text, true); |
(5 rows)
4 系统表
postgres=# select distinct on (relkind,relnamespace,relname) oid,relkind,relname,relnamespace::regnamespace from pg_class where relname ~ '^dba|^user|^all|^v\$|^dbms' order by 2,4,3;
oid | relkind | relname | relnamespace
---------+---------+----------------------+--------------------
16610 | v | all_permissions | public
13196 | v | user_defined_types | information_schema
13264 | v | user_mapping_options | information_schema
13268 | v | user_mappings | information_schema
1913061 | v | dba_segments | oracle
1913024 | v | user_cons_columns | oracle
1913028 | v | user_constraints | oracle
1913056 | v | user_ind_columns | oracle
1913037 | v | user_objects | oracle
1913042 | v | user_procedures | oracle
1913047 | v | user_source | oracle
1913016 | v | user_tab_columns | oracle
1913020 | v | user_tables | oracle
1913051 | v | user_views | oracle
(14 rows)
二、某个基于PG的产品
1 系统表
未支持 dblink , 同义词, 策略, profile, schedule, 高级队列, job, 角色, 触发器等。
postgres=> select distinct on (relkind,relname) oid,relkind,relname from pg_class where relname ~ '^dba|^user|^all|^v\$|^dbms' order by 2,3;
oid | relkind | relname
-------+---------+----------------------
12047 | v | all_all_tables
11888 | v | all_col_comments
11929 | v | all_directories
11952 | v | all_objects
12113 | v | all_procedures
11935 | v | all_sequences
11975 | v | all_source
12075 | v | all_tab_cols
12071 | v | all_tab_columns
12023 | v | all_tables
12001 | v | all_users
11871 | v | all_views
12035 | v | dba_all_tables
11988 | v | dba_data_files
11926 | v | dba_directories
11857 | v | dba_indexes
11920 | v | dba_jobs
12106 | v | dba_procedures
14235 | v | dba_sequences
11972 | v | dba_source
12059 | v | dba_tab_cols
12051 | v | dba_tab_columns
12015 | v | dba_tables
11845 | v | dba_tablespaces
11905 | v | dba_triggers
11994 | v | dba_users
11868 | v | dba_views
11894 | v | user_col_comments
14150 | v | user_defined_types
12142 | v | user_indexes
14218 | v | user_mapping_options
14222 | v | user_mappings
11962 | v | user_objects
12116 | v | user_procedures
11945 | v | user_sequences
11985 | v | user_source
12095 | v | user_tab_cols
12087 | v | user_tab_columns
12027 | v | user_tables
12150 | v | user_tablespaces
11911 | v | user_triggers
11878 | v | user_views
12158 | v | v$session
(43 rows)
postgres=> select distinct on (relkind,relnamespace,relname) oid,relkind,relname,relnamespace::regnamespace from pg_class where relname ~ '^dba|^user|^all|^v\$|^dbms' order by 2,4,3;
oid | relkind | relname | relnamespace
-------+---------+----------------------+--------------------
12047 | v | all_all_tables | pg_catalog
11891 | v | all_col_comments | pg_catalog
11932 | v | all_directories | pg_catalog
11956 | v | all_objects | pg_catalog
12113 | v | all_procedures | pg_catalog
11939 | v | all_sequences | pg_catalog
11979 | v | all_source | pg_catalog
12079 | v | all_tab_cols | pg_catalog
12071 | v | all_tab_columns | pg_catalog
12023 | v | all_tables | pg_catalog
12004 | v | all_users | pg_catalog
11875 | v | all_views | pg_catalog
12039 | v | dba_all_tables | pg_catalog
11991 | v | dba_data_files | pg_catalog
11926 | v | dba_directories | pg_catalog
11857 | v | dba_indexes | pg_catalog
11920 | v | dba_jobs | pg_catalog
12106 | v | dba_procedures | pg_catalog
14235 | v | dba_sequences | pg_catalog
11972 | v | dba_source | pg_catalog
12063 | v | dba_tab_cols | pg_catalog
12055 | v | dba_tab_columns | pg_catalog
12015 | v | dba_tables | pg_catalog
11849 | v | dba_tablespaces | pg_catalog
11908 | v | dba_triggers | pg_catalog
11998 | v | dba_users | pg_catalog
11868 | v | dba_views | pg_catalog
11897 | v | user_col_comments | pg_catalog
12142 | v | user_indexes | pg_catalog
11962 | v | user_objects | pg_catalog
12119 | v | user_procedures | pg_catalog
11945 | v | user_sequences | pg_catalog
11985 | v | user_source | pg_catalog
12095 | v | user_tab_cols | pg_catalog
12087 | v | user_tab_columns | pg_catalog
12031 | v | user_tables | pg_catalog
12150 | v | user_tablespaces | pg_catalog
11914 | v | user_triggers | pg_catalog
11881 | v | user_views | pg_catalog
12158 | v | v$session | pg_catalog
12043 | v | all_all_tables | sys
11888 | v | all_col_comments | sys
11929 | v | all_directories | sys
11952 | v | all_objects | sys
12109 | v | all_procedures | sys
11935 | v | all_sequences | sys
11975 | v | all_source | sys
12075 | v | all_tab_cols | sys
12067 | v | all_tab_columns | sys
12019 | v | all_tables | sys
12001 | v | all_users | sys
11871 | v | all_views | sys
12035 | v | dba_all_tables | sys
11988 | v | dba_data_files | sys
11923 | v | dba_directories | sys
11853 | v | dba_indexes | sys
11917 | v | dba_jobs | sys
12103 | v | dba_procedures | sys
14231 | v | dba_sequences | sys
11969 | v | dba_source | sys
12059 | v | dba_tab_cols | sys
12051 | v | dba_tab_columns | sys
12011 | v | dba_tables | sys
11845 | v | dba_tablespaces | sys
11905 | v | dba_triggers | sys
11994 | v | dba_users | sys
11865 | v | dba_views | sys
11894 | v | user_col_comments | sys
12138 | v | user_indexes | sys
11959 | v | user_objects | sys
12116 | v | user_procedures | sys
11942 | v | user_sequences | sys
11982 | v | user_source | sys
12091 | v | user_tab_cols | sys
12083 | v | user_tab_columns | sys
12027 | v | user_tables | sys
12146 | v | user_tablespaces | sys
11911 | v | user_triggers | sys
11878 | v | user_views | sys
12154 | v | v$session | sys
14150 | v | user_defined_types | information_schema
14218 | v | user_mapping_options | information_schema
14222 | v | user_mappings | information_schema
(83 rows)
postgres=> select distinct on (relkind,relname) oid,relkind,relname from pg_class where relnamespace='sys'::regnamespace order by 2,3;
oid | relkind | relname
-------+---------+-------------------
12043 | v | all_all_tables
11888 | v | all_col_comments
11929 | v | all_directories
11952 | v | all_objects
12109 | v | all_procedures
11935 | v | all_sequences
11975 | v | all_source
12075 | v | all_tab_cols
12067 | v | all_tab_columns
12019 | v | all_tables
12001 | v | all_users
11871 | v | all_views
12035 | v | dba_all_tables
11988 | v | dba_data_files
11923 | v | dba_directories
11853 | v | dba_indexes
11917 | v | dba_jobs
12103 | v | dba_procedures
14231 | v | dba_sequences
11969 | v | dba_source
12059 | v | dba_tab_cols
12051 | v | dba_tab_columns
12011 | v | dba_tables
11845 | v | dba_tablespaces
11905 | v | dba_triggers
11994 | v | dba_users
11865 | v | dba_views
11894 | v | user_col_comments
12138 | v | user_indexes
11959 | v | user_objects
12116 | v | user_procedures
11942 | v | user_sequences
11982 | v | user_source
12091 | v | user_tab_cols
12083 | v | user_tab_columns
12027 | v | user_tables
12146 | v | user_tablespaces
11911 | v | user_triggers
11878 | v | user_views
12154 | v | v$session
(40 rows)
2 存储过程语言
未支持 pl/sql
postgres=> select * from pg_pltemplate ;
tmplname | tmpltrusted | tmpldbacreate | tmplhandler | tmplinline | tmplvalidator | tmpllibrary | tmplacl
----------+-------------+---------------+----------------------+------------------------+-------------------+-----------------+---------
plpgsql | t | t | plpgsql_call_handler | plpgsql_inline_handler | plpgsql_validator | $libdir/plpgsql |
(1 row)
3 包
1、支持的包较少
postgres=> select oid,nspname,obj_description(oid) from pg_namespace order by 2;
oid | nspname | obj_description
-------+--------------------+----------------------------------
12130 | dbms_output |
12133 | dbms_random |
2、包的方法较少
postgres=> select proname from pg_proc where pronamespace=(select oid from pg_namespace where nspname='dbms_output') order by 1;
proname
----------
put
put_line
(2 rows)
postgres=> select proname from pg_proc where pronamespace=(select oid from pg_namespace where nspname='dbms_random') order by 1;
proname
---------
seed
seed
value
value
(4 rows)
包的方法的源代码内容
postgres=> select pronamespace::regnamespace,proname,prosrc,probin from pg_proc where proname='put_line';
pronamespace | proname | prosrc | probin
--------------+----------+----------------------+-----------------
dbms_output | put_line | dbms_output_put_line | $libdir/plpgsql
(1 row)
4、一些语义一致性问题
语义上支持varchar2(byte|char),实际上并没有按实际约束。
postgresdb=> create table test (id varchar2(10 char));
CREATE TABLE
postgresdb=> drop table test;
DROP TABLE
postgresdb=> create table test (id varchar2(10 char));
CREATE TABLE
postgresdb=> \d+ test
Table "public.test"
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
--------+-----------------------+-----------+----------+---------+----------+--------------+-------------
id | character varying(10) | | | | extended | |
postgresdb=> drop table test;
DROP TABLE
postgresdb=> create table test (id varchar2(10 byte));
CREATE TABLE
postgresdb=> \d+ test
Table "public.test"
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
--------+-----------------------+-----------+----------+---------+----------+--------------+-------------
id | character varying(10) | | | | extended | |
限制的是BYTE,实际上是CHAR。
postgresdb=> insert into test values ('abcdefg');
INSERT 0 1
postgresdb=> insert into test values ('abcdefg你好');
INSERT 0 1
postgresdb=> insert into test values ('中国你好你好');
INSERT 0 1
5、一些SQL语法深水区问题
1、例如对connect by语法并未支持。
postgresdb=> CREATE TABLE TBL_TEST
postgresdb-> (
postgresdb(> ID NUMBER,
postgresdb(> NAME VARCHAR2(100 BYTE),
postgresdb(> PID NUMBER DEFAULT 0
postgresdb(> );
CREATE TABLE
postgresdb=> INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('1','10','0');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('2','11','1');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('3','20','0');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('4','12','1');
INSERT 0 1
postgresdb=> INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('2','11','1');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('5','121','2'); INSERT 0 1
postgresdb=> INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('3','20','0');
INSERT 0 1
postgresdb=> INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('4','12','1');
INSERT 0 1
postgresdb=> INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('5','121','2');
INSERT 0 1
postgresdb=> select * from TBL_TEST
postgresdb-> start with id=1
postgresdb-> connect by prior id = pid;
ERROR: syntax error at or near "with"
LINE 2: start with id=1
^
2、不支持分区表语法
postgresdb=> CREATE table TABLE_PARTITION(
postgresdb(> COL1 NUMBER,
postgresdb(> COL2 VARCHAR2(10)
postgresdb(> )
postgresdb-> partition by range(COL1)(
postgresdb(> partition TAB_PARTOTION_01 values less than (450000),
postgresdb(> partition TAB_PARTOTION_02 values less than (900000),
postgresdb(> partition TAB_PARTOTION_03 values less than (1350000),
postgresdb(> partition TAB_PARTOTION_04 values less than (1800000),
postgresdb(> partition TAB_PARTOTION_OTHER values less THAN (MAXVALUE)
postgresdb(> );
ERROR: syntax error at or near "("
LINE 5: partition by range(COL1)(
^
3、不支持rowid
postgresdb=> select rowid from test limit 1;
ERROR: column "rowid" does not exist
LINE 1: select rowid from test limit 1;
^
4、rownum的支持方法有点问题,依赖临时sequence,调用频繁的话会导致元数据膨胀
postgresdb=> select * from tbl_test where rownum<10;
id | name | pid
----+------+-----
1 | 10 | 0
2 | 11 | 1
3 | 20 | 0
4 | 12 | 1
5 | 121 | 2
(5 rows)
postgresdb=> explain select * from tbl_test where rownum<10;
QUERY PLAN
------------------------------------------------------------
Seq Scan on tbl_test (cost=0.00..78.25 rows=87 width=282)
Filter: ("rownum"() < 10)
(2 rows)
postgresdb=> \df rownum
List of functions
Schema | Name | Result data type | Argument data types | Type
------------+--------+------------------+---------------------+------
pg_catalog | rownum | integer | | func
(1 row)
postgresdb=> \sf rownum
CREATE OR REPLACE FUNCTION pg_catalog."rownum"()
RETURNS integer
LANGUAGE plpgsql
AS $function$
DECLARE myid int := 0;
func_cmd varchar(200) :='';
myret int := 23;
BEGIN
PERFORM setseed(0.4);
select trunc(random()*100000000) into myid;
SET client_min_messages = 'error';
func_cmd := 'create TEMP sequence IF NOT EXISTS rownum_' || myid ||' maxvalue 9223372036854775807 nocache';
EXECUTE func_cmd;
func_cmd = 'select nextval(''rownum_' ||myid|| ''') ' ;
EXECUTE func_cmd into myret;
RETURN myret;
END;
$function$;
三、EDB, 阿里云RDS PPAS
1、支持哪些ORACLE相关系统视图
支持的系统视图非常多
postgres=# select distinct on (relkind,relname) oid,relkind,relname from pg_class where relname ~ '^dba|^user|^all|^v\$|^dbms' order by 2,3;
oid | relkind | relname
-------+---------+-----------------------------
33757 | r | dbms_job_user
15009 | v | all_all_tables
15093 | v | all_cons_columns
14995 | v | all_constraints
15176 | v | all_db_links
15189 | v | all_directories
15121 | v | all_ind_columns
15107 | v | all_indexes
33777 | v | all_jobs
15198 | v | all_objects
15271 | v | all_part_key_columns
15226 | v | all_part_tables
15212 | v | all_policies
15299 | v | all_queue_tables
15313 | v | all_queues
33954 | v | all_scheduler_job_args
33940 | v | all_scheduler_jobs
33910 | v | all_scheduler_program_args
33898 | v | all_scheduler_programs
33922 | v | all_scheduler_schedules
15163 | v | all_sequences
15333 | v | all_source
15285 | v | all_subpart_key_columns
15065 | v | all_synonyms
15051 | v | all_tab_columns
15241 | v | all_tab_partitions
15256 | v | all_tab_subpartitions
14981 | v | all_tables
15023 | v | all_triggers
15135 | v | all_types
14963 | v | all_users
15037 | v | all_view_columns
15079 | v | all_views
15004 | v | dba_all_tables
15088 | v | dba_cons_columns
14990 | v | dba_constraints
15172 | v | dba_db_links
15185 | v | dba_directories
15116 | v | dba_ind_columns
15102 | v | dba_indexes
33767 | v | dba_jobs
15193 | v | dba_objects
15266 | v | dba_part_key_columns
15221 | v | dba_part_tables
15207 | v | dba_policies
14971 | v | dba_profiles
15294 | v | dba_queue_tables
15308 | v | dba_queues
15148 | v | dba_role_privs
15144 | v | dba_roles
33950 | v | dba_scheduler_job_args
33935 | v | dba_scheduler_jobs
33906 | v | dba_scheduler_program_args
33894 | v | dba_scheduler_programs
33918 | v | dba_scheduler_schedules
15158 | v | dba_sequences
15328 | v | dba_source
15280 | v | dba_subpart_key_columns
15060 | v | dba_synonyms
15046 | v | dba_tab_columns
15236 | v | dba_tab_partitions
15251 | v | dba_tab_subpartitions
14976 | v | dba_tables
15018 | v | dba_triggers
15130 | v | dba_types
14958 | v | dba_users
15032 | v | dba_view_columns
15074 | v | dba_views
14476 | v | dbms_aq_stat_databases
14485 | v | dbms_aq_stat_messages
14471 | v | dbms_aq_stat_queues
14480 | v | dbms_aq_stat_waiters
15014 | v | user_all_tables
15098 | v | user_cons_columns
15000 | v | user_constraints
15181 | v | user_db_links
13871 | v | user_defined_types
15126 | v | user_ind_columns
15112 | v | user_indexes
33772 | v | user_jobs
13940 | v | user_mapping_options
13944 | v | user_mappings
15203 | v | user_objects
15276 | v | user_part_key_columns
15231 | v | user_part_tables
15217 | v | user_policies
15304 | v | user_queue_tables
15318 | v | user_queues
15153 | v | user_role_privs
33958 | v | user_scheduler_job_args
33945 | v | user_scheduler_jobs
33914 | v | user_scheduler_program_args
33902 | v | user_scheduler_programs
33926 | v | user_scheduler_schedules
15168 | v | user_sequences
15338 | v | user_source
15290 | v | user_subpart_key_columns
15070 | v | user_synonyms
15056 | v | user_tab_columns
15246 | v | user_tab_partitions
15261 | v | user_tab_subpartitions
14986 | v | user_tables
15028 | v | user_triggers
15140 | v | user_types
14967 | v | user_users
15042 | v | user_view_columns
15084 | v | user_views
13959 | v | v$version
(108 rows)
2、支持哪些ORACLE相关系统视图,收敛到schema层级
postgres=# select distinct on (relkind,relnamespace,relname) oid,relkind,relname,relnamespace::regnamespace from pg_class where relname ~ '^dba|^user|^all|^v\$|^dbms' order by 2,4,3;
oid | relkind | relname | relnamespace
-------+---------+-----------------------------+--------------------
33757 | r | dbms_job_user | sys
15009 | v | all_all_tables | sys
15093 | v | all_cons_columns | sys
14995 | v | all_constraints | sys
15176 | v | all_db_links | sys
15189 | v | all_directories | sys
15121 | v | all_ind_columns | sys
15107 | v | all_indexes | sys
33777 | v | all_jobs | sys
15198 | v | all_objects | sys
15271 | v | all_part_key_columns | sys
15226 | v | all_part_tables | sys
15212 | v | all_policies | sys
15299 | v | all_queue_tables | sys
15313 | v | all_queues | sys
33954 | v | all_scheduler_job_args | sys
33940 | v | all_scheduler_jobs | sys
33910 | v | all_scheduler_program_args | sys
33898 | v | all_scheduler_programs | sys
33922 | v | all_scheduler_schedules | sys
15163 | v | all_sequences | sys
15333 | v | all_source | sys
15285 | v | all_subpart_key_columns | sys
15065 | v | all_synonyms | sys
15051 | v | all_tab_columns | sys
15241 | v | all_tab_partitions | sys
15256 | v | all_tab_subpartitions | sys
14981 | v | all_tables | sys
15023 | v | all_triggers | sys
15135 | v | all_types | sys
14963 | v | all_users | sys
15037 | v | all_view_columns | sys
15079 | v | all_views | sys
15004 | v | dba_all_tables | sys
15088 | v | dba_cons_columns | sys
14990 | v | dba_constraints | sys
15172 | v | dba_db_links | sys
15185 | v | dba_directories | sys
15116 | v | dba_ind_columns | sys
15102 | v | dba_indexes | sys
33767 | v | dba_jobs | sys
15193 | v | dba_objects | sys
15266 | v | dba_part_key_columns | sys
15221 | v | dba_part_tables | sys
15207 | v | dba_policies | sys
14971 | v | dba_profiles | sys
15294 | v | dba_queue_tables | sys
15308 | v | dba_queues | sys
15148 | v | dba_role_privs | sys
15144 | v | dba_roles | sys
33950 | v | dba_scheduler_job_args | sys
33935 | v | dba_scheduler_jobs | sys
33906 | v | dba_scheduler_program_args | sys
33894 | v | dba_scheduler_programs | sys
33918 | v | dba_scheduler_schedules | sys
15158 | v | dba_sequences | sys
15328 | v | dba_source | sys
15280 | v | dba_subpart_key_columns | sys
15060 | v | dba_synonyms | sys
15046 | v | dba_tab_columns | sys
15236 | v | dba_tab_partitions | sys
15251 | v | dba_tab_subpartitions | sys
14976 | v | dba_tables | sys
15018 | v | dba_triggers | sys
15130 | v | dba_types | sys
14958 | v | dba_users | sys
15032 | v | dba_view_columns | sys
15074 | v | dba_views | sys
14476 | v | dbms_aq_stat_databases | sys
14485 | v | dbms_aq_stat_messages | sys
14471 | v | dbms_aq_stat_queues | sys
14480 | v | dbms_aq_stat_waiters | sys
15014 | v | user_all_tables | sys
15098 | v | user_cons_columns | sys
15000 | v | user_constraints | sys
15181 | v | user_db_links | sys
15126 | v | user_ind_columns | sys
15112 | v | user_indexes | sys
33772 | v | user_jobs | sys
15203 | v | user_objects | sys
15276 | v | user_part_key_columns | sys
15231 | v | user_part_tables | sys
15217 | v | user_policies | sys
15304 | v | user_queue_tables | sys
15318 | v | user_queues | sys
15153 | v | user_role_privs | sys
33958 | v | user_scheduler_job_args | sys
33945 | v | user_scheduler_jobs | sys
33914 | v | user_scheduler_program_args | sys
33902 | v | user_scheduler_programs | sys
33926 | v | user_scheduler_schedules | sys
15168 | v | user_sequences | sys
15338 | v | user_source | sys
15290 | v | user_subpart_key_columns | sys
15070 | v | user_synonyms | sys
15056 | v | user_tab_columns | sys
15246 | v | user_tab_partitions | sys
15261 | v | user_tab_subpartitions | sys
14986 | v | user_tables | sys
15028 | v | user_triggers | sys
15140 | v | user_types | sys
14967 | v | user_users | sys
15042 | v | user_view_columns | sys
15084 | v | user_views | sys
13959 | v | v$version | sys
13871 | v | user_defined_types | information_schema
13940 | v | user_mapping_options | information_schema
13944 | v | user_mappings | information_schema
(108 rows)
3、经过改造的sys下包含哪些对象
14年兼容性打磨,已经支持了很多对象兼容
postgres=# select distinct on (relkind,relname) oid,relkind,relname from pg_class where relnamespace='sys'::regnamespace order by 2,3;
oid | relkind | relname
-------+---------+---------------------------------------------
14552 | S | plsql_profiler_runid
33792 | S | scheduler_0200_program_dsp_program_id_seq
33825 | S | scheduler_0300_schedule_dss_schedule_id_seq
15743 | S | snapshot_num_seq
1322 | c | aq$_agent
1132 | c | aq$_descriptor
1135 | c | aq$_queued_callback
1117 | c | aq$_reg_info
2801 | c | edb_dbms_redact_full_default_values_type
536 | c | lineno_text
1129 | c | msg_prop_t
417 | c | scheduler_0100_component_name_type
519 | c | scheduler_0200_program_type
522 | c | scheduler_0250_program_argument_type
525 | c | scheduler_0300_schedule_type
528 | c | scheduler_0400_job_type
533 | c | scheduler_0450_job_argument_type
1228 | i | aq$_callback_queue_table_i
14002 | i | at_most_one_row_con1
33764 | i | dju_jobid_idx
33877 | i | dsj_job_name_idx
33806 | i | dsp_program_name_idx
33852 | i | dss_schedule_name_idx
15788 | i | edb$stat_db_pk
15778 | i | edb$stat_idx_pk
15783 | i | edb$stat_tab_pk
15793 | i | edb$statio_idx_pk
15798 | i | edb$statio_tab_pk
1227 | i | edb_qt_1220_msgid
1226 | i | edb_qt_1220_next_event_time
14560 | i | plsql_profiler_runs_pkey
33789 | i | scheduler_0100_component_name_dsc_name_key
33804 | i | scheduler_0200_program_pkey
33818 | i | scheduler_0250_program_argument_pkey
33850 | i | scheduler_0300_schedule_pkey
33865 | i | scheduler_0400_job_pkey
33887 | i | scheduler_0450_job_argument_pkey
15773 | i | session_waits_hist_pk
15766 | i | session_waits_pk
15751 | i | snap_pk
15759 | i | system_waits_pk
1220 | r | callback_queue_table
33757 | r | dbms_job_user
13966 | r | dual
15767 | r | edb$session_wait_history
15760 | r | edb$session_waits
15745 | r | edb$snap
15775 | r | edb$stat_all_indexes
15780 | r | edb$stat_all_tables
15785 | r | edb$stat_database
15790 | r | edb$statio_all_indexes
15795 | r | edb$statio_all_tables
15753 | r | edb$system_waits
13994 | r | edb_dbms_redact_full_default_values
14546 | r | plsql_profiler_rawdata
14554 | r | plsql_profiler_runs
14562 | r | plsql_profiler_units
13956 | r | product_component_version
33783 | r | scheduler_0100_component_name
33794 | r | scheduler_0200_program
33809 | r | scheduler_0250_program_argument
33827 | r | scheduler_0300_schedule
33855 | r | scheduler_0400_job
33880 | r | scheduler_0450_job_argument
15532 | v | _utl_file_dir
15009 | v | all_all_tables
15093 | v | all_cons_columns
14995 | v | all_constraints
15176 | v | all_db_links
15189 | v | all_directories
15121 | v | all_ind_columns
15107 | v | all_indexes
33777 | v | all_jobs
15198 | v | all_objects
15271 | v | all_part_key_columns
15226 | v | all_part_tables
15212 | v | all_policies
15299 | v | all_queue_tables
15313 | v | all_queues
33954 | v | all_scheduler_job_args
33940 | v | all_scheduler_jobs
33910 | v | all_scheduler_program_args
33898 | v | all_scheduler_programs
33922 | v | all_scheduler_schedules
15163 | v | all_sequences
15333 | v | all_source
15285 | v | all_subpart_key_columns
15065 | v | all_synonyms
15051 | v | all_tab_columns
15241 | v | all_tab_partitions
15256 | v | all_tab_subpartitions
14981 | v | all_tables
15023 | v | all_triggers
15135 | v | all_types
14963 | v | all_users
15037 | v | all_view_columns
15079 | v | all_views
15004 | v | dba_all_tables
15088 | v | dba_cons_columns
14990 | v | dba_constraints
15172 | v | dba_db_links
15185 | v | dba_directories
15116 | v | dba_ind_columns
15102 | v | dba_indexes
33767 | v | dba_jobs
15193 | v | dba_objects
15266 | v | dba_part_key_columns
15221 | v | dba_part_tables
15207 | v | dba_policies
14971 | v | dba_profiles
15294 | v | dba_queue_tables
15308 | v | dba_queues
15148 | v | dba_role_privs
15144 | v | dba_roles
33950 | v | dba_scheduler_job_args
33935 | v | dba_scheduler_jobs
33906 | v | dba_scheduler_program_args
33894 | v | dba_scheduler_programs
33918 | v | dba_scheduler_schedules
15158 | v | dba_sequences
15328 | v | dba_source
15280 | v | dba_subpart_key_columns
15060 | v | dba_synonyms
15046 | v | dba_tab_columns
15236 | v | dba_tab_partitions
15251 | v | dba_tab_subpartitions
14976 | v | dba_tables
15018 | v | dba_triggers
15130 | v | dba_types
14958 | v | dba_users
15032 | v | dba_view_columns
15074 | v | dba_views
14476 | v | dbms_aq_stat_databases
14485 | v | dbms_aq_stat_messages
14471 | v | dbms_aq_stat_queues
14480 | v | dbms_aq_stat_waiters
14568 | v | plsql_profiler_data
15014 | v | user_all_tables
15098 | v | user_cons_columns
15000 | v | user_constraints
15181 | v | user_db_links
15126 | v | user_ind_columns
15112 | v | user_indexes
33772 | v | user_jobs
15203 | v | user_objects
15276 | v | user_part_key_columns
15231 | v | user_part_tables
15217 | v | user_policies
15304 | v | user_queue_tables
15318 | v | user_queues
15153 | v | user_role_privs
33958 | v | user_scheduler_job_args
33945 | v | user_scheduler_jobs
33914 | v | user_scheduler_program_args
33902 | v | user_scheduler_programs
33926 | v | user_scheduler_schedules
15168 | v | user_sequences
15338 | v | user_source
15290 | v | user_subpart_key_columns
15070 | v | user_synonyms
15056 | v | user_tab_columns
15246 | v | user_tab_partitions
15261 | v | user_tab_subpartitions
14986 | v | user_tables
15028 | v | user_triggers
15140 | v | user_types
14967 | v | user_users
15042 | v | user_view_columns
15084 | v | user_views
13959 | v | v$version
(170 rows)
4、支持哪些存储过程、函数编程语言
edbspl即pl/sql兼容性LANGUAGE。
postgres=# select * from pg_pltemplate ;
tmplname | tmpltrusted | tmpldbacreate | tmplhandler | tmplinline | tmplvalidator | tmpllibrary | tmplacl
------------+-------------+---------------+------------------------+--------------------------+---------------------+-------------------+---------
edbspl | t | t | spl_call_handler | spl_inline_handler | spl_validator | $libdir/edb-spl |
plpgsql | t | t | plpgsql_call_handler | plpgsql_inline_handler | plpgsql_validator | $libdir/plpgsql |
pltcl | t | t | pltcl_call_handler | | | $libdir/pltcl |
pltclu | f | f | pltclu_call_handler | | | $libdir/pltcl |
plperl | t | t | plperl_call_handler | plperl_inline_handler | plperl_validator | $libdir/plperl |
plperlu | f | f | plperlu_call_handler | plperlu_inline_handler | plperlu_validator | $libdir/plperl |
plpythonu | f | f | plpython_call_handler | plpython_inline_handler | plpython_validator | $libdir/plpython2 |
plpython2u | f | f | plpython2_call_handler | plpython2_inline_handler | plpython2_validator | $libdir/plpython2 |
plpython3u | f | f | plpython3_call_handler | plpython3_inline_handler | plpython3_validator | $libdir/plpython3 |
(9 rows)
5、支持哪些包
支持的包非常多
postgres=# select oid,nspname,obj_description(oid) from pg_namespace order by 2;
oid | nspname | obj_description
-------+--------------------+----------------------------------
14380 | aq$_agent |
14406 | aq$_descriptor |
14403 | aq$_reg_info |
14068 | dbms_alert |
14407 | dbms_aq |
14381 | dbms_aqadm |
14750 | dbms_crypto |
14085 | dbms_job |
33756 | dbms_job_procedure | dbms_job what procedures
14102 | dbms_lob |
14705 | dbms_lock |
14791 | dbms_mview |
14158 | dbms_output |
14179 | dbms_pipe |
14504 | dbms_profiler |
14573 | dbms_random |
14586 | dbms_redact |
14213 | dbms_rls |
14707 | dbms_scheduler |
14806 | dbms_session |
14228 | dbms_sql |
14322 | dbms_utility |
13663 | information_schema |
14405 | msg_prop_t |
33583 | pgagent | pgAgent system tables
9 | sys | sys schema
15342 | utl_encode |
15536 | utl_file |
15367 | utl_http |
15643 | utl_mail |
15681 | utl_raw |
15590 | utl_smtp |
15572 | utl_tcp |
15674 | utl_url |
6、包支持哪些方法(函数)
包内的方法丰富
postgres=# select proname from pg_proc where pronamespace=(select oid from pg_namespace where nspname='dbms_mview') order by 1;
proname
----------------------
_get_mv_dependencies
_refresh
_refresh_all_mviews
_refresh_dependent
get_dependent_mvs
get_mv_dependencies
get_relid
refresh
refresh
refresh_all_mviews
refresh_dependent
refresh_dependent
validate_list
validate_method
(14 rows)
postgres=# select proname from pg_proc where pronamespace=(select oid from pg_namespace where nspname='dbms_output') order by 1;
proname
--------------
cons
disable
enable
enable
get_line
get_lines
get_lines
new_line
put
put_line
serveroutput
(11 rows)
postgres=# select proname from pg_proc where pronamespace=(select oid from pg_namespace where nspname='dbms_random') order by 1;
proname
------------
initialize
normal
random
seed
seed
string
terminate
value
value
(9 rows)
所有支持的方法如下
postgres=# select pronamespace::regnamespace,proname from pg_proc where pronamespace in (select oid from pg_namespace where nspname ~ '^dbms|^utl') order by 1,2;
pronamespace | proname
----------------+--------------------------------------------
dbms_alert | _signal
dbms_alert | register
dbms_alert | remove
dbms_alert | removeall
dbms_alert | set_defaults
dbms_alert | signal
dbms_alert | waitany
dbms_alert | waitone
dbms_job | _check_pgagent
dbms_job | _create_validate_interval_function
dbms_job | _create_what_procedure
dbms_job | _run_job
dbms_job | broken
dbms_job | change
dbms_job | interval
dbms_job | next_date
dbms_job | remove
dbms_job | run
dbms_job | submit
dbms_job | updatepgajob
dbms_job | validate_job
dbms_job | what
dbms_lob | append
dbms_lob | append
dbms_lob | arguments_bad
dbms_lob | bytesleft
dbms_lob | check_db_csid
dbms_lob | compare
dbms_lob | compare
dbms_lob | converttoblob
dbms_lob | converttoclob
dbms_lob | copy
dbms_lob | copy
dbms_lob | erase
dbms_lob | erase
dbms_lob | get_storage_limit
dbms_lob | get_storage_limit
dbms_lob | getlength
dbms_lob | getlength
dbms_lob | instr
dbms_lob | instr
dbms_lob | read
dbms_lob | read
dbms_lob | substr
dbms_lob | substr
dbms_lob | trim
dbms_lob | trim
dbms_lob | validate_arguments
dbms_lob | validate_length
dbms_lob | write
dbms_lob | write
dbms_lob | write_to_lob
dbms_lob | write_to_lob
dbms_lob | writeappend
dbms_lob | writeappend
dbms_output | cons
dbms_output | disable
dbms_output | enable
dbms_output | enable
dbms_output | get_line
dbms_output | get_lines
dbms_output | get_lines
dbms_output | new_line
dbms_output | put
dbms_output | put_line
dbms_output | serveroutput
dbms_pipe | create_pipe
dbms_pipe | next_item_type
dbms_pipe | pack_message
dbms_pipe | pack_message
dbms_pipe | pack_message
dbms_pipe | pack_message_raw
dbms_pipe | purge
dbms_pipe | receive_message
dbms_pipe | remove_pipe
dbms_pipe | reset_buffer
dbms_pipe | send_message
dbms_pipe | unique_session_name
dbms_pipe | unpack_message
dbms_pipe | unpack_message
dbms_pipe | unpack_message
dbms_pipe | unpack_message_raw
dbms_rls | add_policy
dbms_rls | drop_policy
dbms_rls | enable_policy
dbms_sql | bind_variable
dbms_sql | bind_variable
dbms_sql | bind_variable
dbms_sql | bind_variable
dbms_sql | bind_variable
dbms_sql | bind_variable
dbms_sql | bind_variable
dbms_sql | bind_variable
dbms_sql | bind_variable_char
dbms_sql | bind_variable_raw
dbms_sql | close_cursor
dbms_sql | column_value
dbms_sql | column_value
dbms_sql | column_value
dbms_sql | column_value
dbms_sql | column_value
dbms_sql | column_value
dbms_sql | column_value
dbms_sql | column_value
dbms_sql | column_value
dbms_sql | column_value
dbms_sql | column_value
dbms_sql | column_value
dbms_sql | column_value
dbms_sql | column_value
dbms_sql | column_value
dbms_sql | column_value
dbms_sql | column_value
dbms_sql | column_value
dbms_sql | column_value
dbms_sql | column_value
dbms_sql | column_value
dbms_sql | column_value
dbms_sql | column_value
dbms_sql | column_value
dbms_sql | column_value_char
dbms_sql | column_value_char
dbms_sql | column_value_char
dbms_sql | column_value_char
dbms_sql | column_value_raw
dbms_sql | column_value_raw
dbms_sql | column_value_raw
dbms_sql | column_value_raw
dbms_sql | define_column
dbms_sql | define_column
dbms_sql | define_column
dbms_sql | define_column
dbms_sql | define_column
dbms_sql | define_column
dbms_sql | define_column_char
dbms_sql | define_column_raw
dbms_sql | describe_columns
dbms_sql | execute
dbms_sql | execute_and_fetch
dbms_sql | fetch_rows
dbms_sql | is_open
dbms_sql | last_row_count
dbms_sql | open_cursor
dbms_sql | parse
dbms_utility | analyze_database
dbms_utility | analyze_part_object
dbms_utility | analyze_schema
dbms_utility | appendtostring
dbms_utility | canonicalize
dbms_utility | comma_to_table
dbms_utility | comma_to_table
dbms_utility | db_version
dbms_utility | exec_ddl_statement
dbms_utility | format_call_stack
dbms_utility | get_cpu_time
dbms_utility | get_dependency
dbms_utility | get_hash_value
dbms_utility | get_parameter_value
dbms_utility | get_time
dbms_utility | getdependency
dbms_utility | getoid
dbms_utility | gettoken
dbms_utility | name_tokenize
dbms_utility | showerror
dbms_utility | showerror
dbms_utility | table_to_comma
dbms_utility | table_to_comma
dbms_aqadm | _dbms_aqadm_validate_name
dbms_aqadm | alter_queue
dbms_aqadm | alter_queue_table
dbms_aqadm | create_queue
dbms_aqadm | create_queue_table
dbms_aqadm | drop_queue
dbms_aqadm | drop_queue_table
dbms_aqadm | purge_queue_table
dbms_aqadm | start_queue
dbms_aqadm | stop_queue
dbms_aq | _dbms_aq_build_dequeue_query
dbms_aq | _dbms_aq_callback_operation
dbms_aq | _dbms_aq_open_dequeue_cursor
dbms_aq | _enqueue
dbms_aq | dequeue
dbms_aq | enqueue
dbms_aq | get_qualified_object_name
dbms_aq | register
dbms_aq | unregister
dbms_profiler | _install
dbms_profiler | _reset
dbms_profiler | _write_runs
dbms_profiler | _write_units
dbms_profiler | cons
dbms_profiler | flush_data
dbms_profiler | flush_data
dbms_profiler | get_version
dbms_profiler | internal_version_check
dbms_profiler | pause_profiler
dbms_profiler | pause_profiler
dbms_profiler | resume_profiler
dbms_profiler | resume_profiler
dbms_profiler | start_profiler
dbms_profiler | start_profiler
dbms_profiler | start_profiler
dbms_profiler | start_profiler
dbms_profiler | stop_profiler
dbms_profiler | stop_profiler
dbms_random | initialize
dbms_random | normal
dbms_random | random
dbms_random | seed
dbms_random | seed
dbms_random | string
dbms_random | terminate
dbms_random | value
dbms_random | value
dbms_redact | _get_qualified_table_name
dbms_redact | _get_redact_func_call
dbms_redact | add_policy
dbms_redact | alter_policy
dbms_redact | disable_policy
dbms_redact | drop_policy
dbms_redact | enable_policy
dbms_redact | update_full_redaction_values
dbms_lock | sleep
dbms_scheduler | _check_job_arg_has_value
dbms_scheduler | _check_pgagent
dbms_scheduler | _get_job_action_for_stored_procedure
dbms_scheduler | _get_job_action_procedure
dbms_scheduler | _scheduler_convert_int_array_to_bool_array
dbms_scheduler | _scheduler_create_job
dbms_scheduler | _scheduler_create_program
dbms_scheduler | _scheduler_create_schedule
dbms_scheduler | _scheduler_evaluate_calendar_string
dbms_scheduler | _scheduler_execute_job_action_string
dbms_scheduler | _scheduler_get_job_id
dbms_scheduler | _scheduler_get_job_program_schedule_id
dbms_scheduler | _scheduler_get_next_run_date
dbms_scheduler | _scheduler_get_next_run_from_now
dbms_scheduler | _scheduler_get_program_id
dbms_scheduler | _scheduler_get_schedule_id
dbms_scheduler | _scheduler_raise_invalid_parameter_value
dbms_scheduler | _scheduler_raise_undefined_object
dbms_scheduler | _scheduler_resolve_calender_string
dbms_scheduler | _scheduler_run_job
dbms_scheduler | create_job
dbms_scheduler | create_job
dbms_scheduler | create_program
dbms_scheduler | create_schedule
dbms_scheduler | define_program_argument
dbms_scheduler | define_program_argument
dbms_scheduler | disable
dbms_scheduler | drop_job
dbms_scheduler | drop_program
dbms_scheduler | drop_program_argument
dbms_scheduler | drop_program_argument
dbms_scheduler | drop_schedule
dbms_scheduler | enable
dbms_scheduler | evaluate_calendar_string
dbms_scheduler | run_job
dbms_scheduler | set_job_argument_value
dbms_scheduler | set_job_argument_value
dbms_crypto | convert_typ_to_pg
dbms_crypto | decrypt
dbms_crypto | decrypt
dbms_crypto | decrypt
dbms_crypto | encrypt
dbms_crypto | encrypt
dbms_crypto | encrypt
dbms_crypto | hash
dbms_crypto | hash
dbms_crypto | mac
dbms_crypto | mac
dbms_crypto | randombytes
dbms_crypto | randominteger
dbms_crypto | randomnumber
dbms_mview | _get_mv_dependencies
dbms_mview | _refresh
dbms_mview | _refresh_all_mviews
dbms_mview | _refresh_dependent
dbms_mview | get_dependent_mvs
dbms_mview | get_mv_dependencies
dbms_mview | get_relid
dbms_mview | refresh
dbms_mview | refresh
dbms_mview | refresh_all_mviews
dbms_mview | refresh_dependent
dbms_mview | refresh_dependent
dbms_mview | validate_list
dbms_mview | validate_method
dbms_session | set_role
utl_encode | base64_decode
utl_encode | base64_encode
utl_encode | base64_encode
utl_encode | get_losize
utl_encode | mimeheader_decode
utl_encode | mimeheader_encode
utl_encode | quoted_printable_decode
utl_encode | quoted_printable_encode
utl_encode | text_decode
utl_encode | text_encode
utl_encode | uudecode
utl_encode | uuencode
utl_http | begin_request
utl_http | end_request
utl_http | end_response
utl_http | get_body_charset
utl_http | get_body_charset
utl_http | get_follow_redirect
utl_http | get_header
utl_http | get_header_by_name
utl_http | get_header_count
utl_http | get_response
utl_http | get_response_error_check
utl_http | get_transfer_timeout
utl_http | read_line
utl_http | read_raw
utl_http | read_text
utl_http | request
utl_http | request_pieces
utl_http | set_body_charset
utl_http | set_body_charset
utl_http | set_body_charset
utl_http | set_follow_redirect
utl_http | set_follow_redirect
utl_http | set_header
utl_http | set_response_error_check
utl_http | set_transfer_timeout
utl_http | set_transfer_timeout
utl_http | write_line
utl_http | write_raw
utl_http | write_text
utl_file | fclose
utl_file | fclose_all
utl_file | fcopy
utl_file | fflush
utl_file | fopen
utl_file | fopen
utl_file | fremove
utl_file | frename
utl_file | get_line
utl_file | get_nextline
utl_file | is_open
utl_file | new_line
utl_file | new_line
utl_file | put
utl_file | put
utl_file | put
utl_file | put
utl_file | put
utl_file | put_line
utl_file | put_line
utl_file | put_line
utl_file | put_line
utl_file | putf
utl_file | putf
utl_file | putf
utl_file | putf
utl_file | putf
utl_file | putf
utl_tcp | close_all_connections
utl_tcp | close_connection
utl_tcp | cons
utl_tcp | open_connection
utl_tcp | prv_write_text
utl_tcp | read_line
utl_tcp | write_line
utl_tcp | write_raw
utl_tcp | write_text
utl_smtp | close_data
utl_smtp | close_data
utl_smtp | command
utl_smtp | command
utl_smtp | command_replies
utl_smtp | data
utl_smtp | data
utl_smtp | ehlo
utl_smtp | ehlo
utl_smtp | get_reply_record
utl_smtp | helo
utl_smtp | helo
utl_smtp | help
utl_smtp | imp_close_data
utl_smtp | imp_command
utl_smtp | imp_command_replies
utl_smtp | imp_data
utl_smtp | imp_ehlo
utl_smtp | imp_get_tcp_from_smtp
utl_smtp | imp_helo
utl_smtp | imp_mail
utl_smtp | imp_noop
utl_smtp | imp_open_connection
utl_smtp | imp_open_data
utl_smtp | imp_quit
utl_smtp | imp_rcpt
utl_smtp | imp_rset
utl_smtp | mail
utl_smtp | mail
utl_smtp | noop
utl_smtp | noop
utl_smtp | open_connection
utl_smtp | open_data
utl_smtp | open_data
utl_smtp | quit
utl_smtp | q