暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

Halo数据库之Oracle兼容性(3)--兼容的Oracle包

原创 贾桂军 2023-11-15
15160

5 兼容的Oracle包

DBMS_ALERT

DBMS_ALERT支持数据库事件(警报)的异步通知。通过适当使用此包和数据库触发器,应用程序可以在数据库中特殊的值发生更改时通知自己。

假设一个图形工具正在显示来自数据库表的一些数据的图形。 在读取和绘制数据之后,图形工具可以等待覆盖刚刚读取的数据的数据库警报。当数据被任何其他用户更改时,该工具会自动唤醒。 只需将触发器放在数据库表上,每当触发器被触发时,数据库表就会执行一个信号。

halo0root=# \df dbms_alert.*

 

dbms_alert.register:注册一个预警事件

语法:DBMS_ALERT.REGISTER (name IN VARCHAR(30) );

说明:neme 输入参数,预警事件名。

例如:

halo0root=# exec dbms_alert.register('aldd');

CALL

 

dbms_alert.remove:删除会话不需要的预警事件

语法:DBMS_ALERT.REMOVE (name IN VARCHAR2);

说明:name要从列表中删除的预警事件名称(不区分大小写)。

例如:

halo0root=# exec dbms_alert.remove ('aldd');

CALL

 

dbms_alert.removeall:删除当前会话已注册所有预警事件

语法: DBMS_ALERT.REMOVEALL;

例如:

halo0root=# exec dbms_alert.removeall();

CALL

 

 

dbms_alert.signal:用于指定预警事件所对应的预警消息

语法:DBMS_ALERT.SIGNAL ( name   IN  VARCHAR2,

                           message  IN  VARCHAR2);

说明:

name预警事件的名称。

Message是与此警报相关联的消息,长度为1800字节或更少。此消息被传递给等待会话。通过使用消息中的信息,等待会话可以避免在警报发生后读取数据库。

例如:

halo0root=# exec dbms_alert.signal('aldd','zlq');

CALL

 

DBMS_ASSERT

DBMS_ASSERT包提供了一个接口来验证输入值的属性。

halo0root=# \df dbms_assert.*

 

dbms_assert.enquote_literal:用于字符串字面值添加了首引号和尾单引号。

语法:DBMS_ASSERT.ENQUOTE_LITERAL (str  VARCHAR2)

RETURN VARCHAR2;

例如:

halo0root=# select DBMS_ASSERT.ENQUOTE_LITERAL (ename) from emp;

 enquote_literal

-----------------

 'ALLEN'

 'WARD'

 'JONES'

 'MARTIN'

 'BLAKE'

(5 行记录)

 

dbms_assert.enquote_namep:提供的字符串括在引号中。如果字符串已经在引号中,则不会添加额外的引号。然后检查用引号内的字符串,看它是否是一个有效的标识符。

语法:DBMS_ASSERT.ENQUOTE_NAME (

str            VARCHAR2,

capitalize     BOOLEAN DEFAULT TRUE)

RETURN VARCHAR2;

说明:capitalize如果为TRUE或默认值,不包含在引号中的str的字母字符将被转换为大写。

例如:

halo0root=# select DBMS_ASSERT.ENQUOTE_NAME (ename ) from emp;

 enquote_name

--------------

 "allen"

 "ward"

 "jones"

 "martin"

 "blake"

(5行记录)

 

dbms_assert.noop :返回值时不进行任何检查。

语法:DBMS_ASSERT.NOOP (

str  VARCHAR2 CHARACTER SET ANY_CS)

RETURN     VARCHAR2 CHARACTER SET str%CHARSET;

      DBMS_ASSERT.NOOP (

          str      CLOB CHARACTER SET ANY_CS)

RETURN     CLOB CHARACTER SET str%CHARSET;

说明:str 输入值

例如:

halo0root=# select dbms_assert.noop ('666') from dual;

 noop

------

 666

(1 行记录)

 

dbms_assert.qualified_sql_name: 验证输入的字符串是否为合格的SQL名称。

语法:DBMS_ASSERT.QUALIFIED_SQL_NAME (

str      VARCHAR2 CHARACTER SET ANY_CS)

      RETURN     VARCHAR2 CHARACTER SET str%CHARSET;

说明:str 输入值

例如:

halo0root=# select dbms_assert.qualified_sql_name ('wy') from dual;

 qualified_sql_name

--------------------

 wy

(1 行记录)

 

dbms_assert.schema_name :验证输入字符串是否为一个现有的模式名。

语法:DBMS_ASSERT.SCHEMA_NAME (

str    VARCHAR2 CHARACTER SET ANY_CS)

      RETURN   VARCHAR2 CHARACTER SET str%CHARSET;

说明:str输入值

例如:

halo0root=#select dbms_assert.schema_name('DBMS_OUTPUT') from dual;

 schema_name

-------------

     DBMS_OUTPUT

(1 行记录)

 

dbms_assert.simple_sql_name :验证输入字符串是否为一个简单的SQL名称。

语法:DBMS_ASSERT.SIMPLE_SQL_NAME (

str      VARCHAR2 CHARACTER SET ANY_CS)

      RETURN     VARCHAR2 CHARACTER SET str%CHARSET;

例如:

halo0root=#select dbms_assert.simple_sql_name('emp') from dual;

 simple_sql_name

-----------------

 emp

(1 行记录)

 

 

DBMS_OUTPUT

DBMS_OUTPUT包能够从存储过程、包和触发器发送消息,对于显示 PL/SQL 调试信息特别有用

halo0root=# \df dbms_output.*

 

dbms_output.disable:禁用、调用、清除缓冲区的信息。

语法:DBMS_OUTPUT.DISABLE;

示例:

halo0root=# call DBMS_OUTPUT.DISABLE ( );

CALL

 

dbms_output.enable:对过程的调用。

语法:DBMS_OUTPUT.ENABLE (

   buffer_size IN INTEGER DEFAULT 20000);

说明:buffer_size上限(以字节为单位),缓冲信息量。

例如:

halo0root=# call DBMS_OUTPUT.ENABLE ( );

CALL

 

 

dbms_output.new_line :放置一个行尾标记

语法:DBMS_OUTPUT.NEW_LINE;

例如:

halo0root=# call DBMS_OUTPUT.NEW_LINE( );

CALL

 

dbms_output.put :对在缓冲区中放置一条部分行。 

语法:  DBMS_OUTPUT.PUT (

item IN VARCHAR2);

说明:item要缓冲的项目

   例如:

halo0root=# exec DBMS_OUTPUT.PUT ('hello');

CALL

 

dbms_output.put_line :在缓冲区中放置一条线。

语法:DBMS_OUTPUT.PUT_LINE (

   item IN VARCHAR2);

说明: item要缓冲的项目

例如:

halo0root=# exec DBMS_OUTPUT.PUT_LINE ('hello');

hello

CALL

 

 

DBMS_PIPE包允许同一实例中的两个或多个会话进行通信,Oracle 管道在概念上与 UNIX 中使用的管道相似,但 Oracle 管道不是使用操作系统管道机制实现的;管道功能有几个潜在的应用程序:外部服务接口、独立事务、警报器(非事务性)、调试和集中器。

halo0root=# \df dbms_pipe.*

 

dbms_pipe.__list_pipes :获取所有命名管道的列表

 例如:halo0root=# select dbms_pipe.__list_pipes ();

  __list_pipes

-----------------

 (abc,0,0,,f,)

 (123,0,0,,f,)

 (wjj,0,0,,f,)

 (56789,0,0,,f,)

 (asas,0,0,,f,)

(5 行记录)

 

dbms_pipe.__unpack_message_bytea

语法:

例如:

halo0root=# select dbms_pipe.__unpack_message_bytea ();

 __unpack_message_bytea

------------------------

 

(1 行记录)

 

dbms_pipe.__unpack_message_date

例如:

halo0root=# select dbms_pipe.__unpack_message_date ();

 __unpack_message_date

-----------------------

 

(1 行记录)

 

dbms_pipe.__unpack_message_number

语法:

例如:

halo0root=# select dbms_pipe.__unpack_message_number ();

 __unpack_message_number

-------------------------

                        

(1 行记录)

 

dbms_pipe.__unpack_message_record

语法:

例如:

halo0root=# select dbms_pipe.__unpack_message_record ();

 __unpack_message_record

-------------------------

 

(1 行记录)

 

dbms_pipe.__unpack_message_text

语法:

例如:

halo0root=# select dbms_pipe.__unpack_message_text ();

 __unpack_message_text

-----------------------

 

(1 行记录)

 

dbms_pipe.__unpack_message_timestamp

语法:

例如:

halo0root=# select dbms_pipe.__unpack_message_timestamp ();

 __unpack_message_timestamp

----------------------------

 

(1 行记录)

 

dbms_pipe.create_pipe:显式创建公共或专用管道

语法:DBMS_PIPE.CREATE_PIPE (

   pipename     IN VARCHAR2,

   maxpipesize  IN INTEGER DEFAULT 8192,

   private      IN BOOLEAN DEFAULT TRUE)

RETURN INTEGER;

说明:

pipename要创建的管道的名称,在调用和使用时必须使用此名称,且名称在整个实例中必须是唯一的

maxpipesize管道允许的最大大小,默认值为 8192 字节。

Private使用缺省值 ,创建专用管道,可以在调用时隐式创建公共管道。

例如:

halo0root=# select dbms_pipe.create_pipe ('asas');

 create_pipe

-------------

 

(1 行记录)

 

dbms_pipe.next_item_type:确定本地消息缓冲区中下一项的数据类型。

调用以将管道信息放置在本地缓冲区中后

RECEIVE_MESSAGENEXT_ITEM_TYPE.

语法:DBMS_PIPE.NEXT_ITEM_TYPE 

  RETURN INTEGER;

例如:

halo0root=# select DBMS_PIPE.NEXT_ITEM_TYPE ();

 next_item_type

----------------

              0

(1 行记录)

 

dbms_pipe.pack_message:在本地消息缓冲区中生成消息。

要发送消息,先对函数进行一次或多次调用,然后调用以在命名管道上的本地缓冲区中发送消息

语法: DBMS_PIPE.PACK_MESSAGE (

   item  IN  VARCHAR2);

DBMS_PIPE.PACK_MESSAGE (

   item  IN  NCHAR);

DBMS_PIPE.PACK_MESSAGE (

   item  IN  NUMBER);

DBMS_PIPE.PACK_MESSAGE (

   item  IN  DATE);

DBMS_PIPE.PACK_MESSAGE_RAW (

   item  IN  RAW);

DBMS_PIPE.PACK_MESSAGE_ROWID (

   item  IN  ROWID);

说明:

item 要打包到本地消息缓冲区中的项。

例如:

halo0root=# call DBMS_PIPE.PACK_MESSAGE('abc');

CALL

 

dbms_pipe.purge:此过程清空命名管道的内容。

根据最近最少使用的算法,隐式创建的空管道会从共享全局区域中老化。因此,调用允许您释放与隐式创建的管道关联的内存

语法:DBMS_PIPE.PURGE (

   pipename  IN  VARCHAR2);

说明:pipename要从中删除所有邮件的管道的名称。

例如:

halo0root=# call dbms_pipe.purge ('abc');

CALL

 

dbms_pipe.receive_message:将消息复制到本地消息缓冲区

语法:DBMS_PIPE.RECEIVE_MESSAGE (

   pipename     IN VARCHAR2,

   timeout      IN INTEGER      DEFAULT maxwait)

RETURN INTEGER;

说明:

pipename要在其上接收消息的管道的名称。

timeout等待消息的时间(以秒为单位)。

默认值为常量 ,定义为 86400000(1000 天)。超时 0 可让您在不阻塞的情况下进行读取。

例如:

halo0root=#select dbms_pipe.receive_message('abc','10');

 receive_message

-----------------

               1

(1 行记录)

 

dbms_pipe.remove_pipe:删除显式创建的管道。

隐式创建的管道在为空时会自动删除。但是,只有通过调用 或关闭实例来显式创建的管道。在删除管道之前,将删除管道中所有未使用的记录。

语法:DBMS_PIPE.REMOVE_PIPE (

   pipename  IN  VARCHAR2)

RETURN INTEGER;

例如:

halo0root=# select dbms_pipe.remove_pipe ('123');

 remove_pipe

-------------

 

(1 行记录)

 

dbms_pipe.reset_buffer:此过程将定位指示器重置为 0。

由于所有管道共享一个缓冲区,因此您可能会发现在使用新管道之前重置缓冲区很有用。这可确保首次尝试向管道发送消息时,不会无意中发送缓冲区中剩余的过期消息。

语法:DBMS_PIPE.RESET_BUFFER;

例如:

halo0root=# exec dbms_pipe.reset_buffer ();

CALL

 

dbms_pipe.send_message:在命名管道上发送消息。

该消息包含在本地消息缓冲区中,该缓冲区中充满了对管道的调用。可以使用 显式创建管道,否则,将隐式创建管道。

语法:DBMS_PIPE.SEND_MESSAGE (

    pipename     IN VARCHAR2,

    timeout      IN INTEGER DEFAULT MAXWAIT,

    maxpipesize  IN INTEGER DEFAULT 8192)

  RETURN INTEGER;

说明:

pipename放置消息的管道的名称。

如果使用的是显式管道,则这是您在调用时指定的名称

timeout尝试将消息放在管道上时等待的时间(以秒为单位)。

默认值为常量 ,定义为 86400000(1000 天)。

maxpipesize管道允许的最大大小(以字节为单位),默认值为 8192 字节。

例如:

haloOroot=#select dbms_pipe.send_message('123','10','800');

send_message

--------------

            0

(1 行记录)

 

dbms_pipe.unique_session_name:用于接收的名称在当前连接到数据库中所有会话唯一的。

从同一会话对此函数的多次调用始终返回相同的值。您可能会发现使用此函数为您的调用提供参数非常有用

语法:DBMS_PIPE.UNIQUE_SESSION_NAME

  RETURN VARCHAR2;

例如:

halo0root=# select dbms_pipe.unique_session_name();

 unique_session_name

---------------------

 PG$PIPE$7$176085

(1 行记录)

 

dbms_pipe.unpack_message:从缓冲区中检索项,调用以将管道信息放在本地缓冲区中后。

语法:DBMS_PIPE.UNPACK_MESSAGE (

   item  OUT VARCHAR2);

DBMS_PIPE.UNPACK_MESSAGE (

   item  OUT NCHAR);

DBMS_PIPE.UNPACK_MESSAGE (

   item  OUT NUMBER);

DBMS_PIPE.UNPACK_MESSAGE (

   item  OUT DATE);

DBMS_PIPE.UNPACK_MESSAGE_RAW (

   item  OUT RAW);

DBMS_PIPE.UNPACK_MESSAGE_ROWID (

   item  OUT ROWID);

说明:

item:用于从本地消息缓冲区接收下一个解压缩项的参数。

例如:

halo0root=# call dbms_pipe.unpack_message('raw');

 item

------

 

(1 行记录)

 

DBMS_RANDOM包提供了一个内置的随机数生成器,不适用于加密

dbms_random.__value

 

例如:

halo0root=# select dbms_random.__value( );

      __value

--------------------

 0.4003495955839753

(1 行记录)

 

dbms_random.initialize:初始化生成器

语法:DBMS_RANDOM.INITIALIZE (

   val  IN  BINARY_INTEGER);

说明:val用于生成随机数的种子号

例如:

halo0root=# call dbms_random.initialize('10');

CALL

 

dbms_random.random:将生成一个随机数

语法:DBMS_RANDOM.RANDOM

   RETURN binary_integer;

说明:binary_integer返回大于或等于 -power(2,31) 且小于 power(2,31) 的随机整数

例如:

halo0root=# select dbms_random.random ();

   random

-------------

 -1364538998

(1 行记录)

 

dbms_random.seed:将重置种子

语法:DBMS_RANDOM.SEED (

   val  IN  BINARY_INTEGER);

DBMS_RANDOM.SEED (

   val  IN  VARCHAR2);

说明:val用于生成随机数的种子号或字符串

例如:

halo0root=# call dbms_random.seed ('123');

CALL

 

dbms_random.string:获取一个随机字符串。

语法:DBMS_RANDOM.STRING

   opt  IN  CHAR,

   len  IN  NUMBER)

  RETURN VARCHAR2;

说明:

opt指定返回字符串的外观:

'u', 'U' - 以大写字母字符返回字符串

'l', 'L' - 以小写字母字符返回字符串

'a', 'A' - 以混合大小写字母字符返回字符串

"x"、"X" - 以大写字母数字字符返回字符串

'p', 'P' - 返回任何可打印字符的字符串。

否则,返回字符串为大写字母字符。

Len返回字符串长度

例如:

halo0root=# select dbms_random.string ('p','200');

 

                  string

 

-------------------------------------------------------------------------------

-------------------------------------------------------------------------------

------------------------------------------

 bX_%,_NrnapHbS?"<4?=dl' JpG4lT)D^th`Fato%v3>y2Lw6JsltTl1Cw6]JR4'L''WE&"t?VetB`

 KQk2sO3t"0mUA@5+Xnp$`0P 1XrNX#N{qd|v F+:C6^R(+a,4@ 5QO4W)o(/}$uZH<fG|VTE if*J*

Z71BI{?jhiVH<n1K[?q5{6{;5NTWAoRWfY*`c&j}S

(1 行记录)

 

dbms_random.terminate:完成包后,调用该过程,终止程序。

语法:DBMS_RANDOM.TERMINATE;

例如:

halo0root=# call DBMS_RANDOM.TERMINATE ( );

CALL

 

dbms_random.value:得到一个随机数,大于或等于 0 且小于 1,小数点右侧有 38 位数字(38 位精度)。

语法:DBMS_RANDOM.VALUE

  RETURN NUMBER;

 

DBMS_RANDOM.VALUE(

  low  IN  NUMBER,

  high IN  NUMBER)

RETURN NUMBER;

说明:

low从中生成随机数的范围内的最低数字。生成的数字可能等于low

high低于该值可生成随机数的最高数字。生成的数字将小于high

例如:

halo0root=# select DBMS_RANDOM.VALUE( );

       value

-------------------

 0.177380431909114

(1 行记录)

 

DBMS_UTILITY包提供了各种实用程序子程序。

dbms_utility.format_call_stack:格式化当前调用堆栈。这可以用于任何存储过程或触发器,以访问调用堆栈。

语法:DBMS_UTILITY.FORMAT_CALL_STACK

  RETURN VARCHAR2;

例如:

halo0root=# select DBMS_UTILITY.FORMAT_CALL_STACK ( );

     format_call_stack

----------------------------

 ----- SPL Call Stack -----+

   object     line  object +

   handle   number  name   +

 

(1 行记录)

 

dbms_utility.get_time:确定当前时间(以百分之一秒为单位)。此子程序主要用于确定经过的时间。子程序被调用两次 - 在某个过程的开始和结束时 - 然后从第二个(后来的)数字中减去第一个(较早)数字以确定经过的时间。

语法:DBMS_UTILITY.GET_TIME

  RETURN NUMBER;

例如:

halo0root=# select dbms_utility.get_time ( );

 get_time

----------

  -157669

(1 行记录)

 

                        

UTL_FILE包使用该软件包,PL / SQL程序可以读取和写入操作系统文本文件。 提供受限版本的操作系统流文件 I/O

文件位置和文件名参数作为单独的字符串提供给函数,以便可以根据可访问目录对象视图指定的可访问目录列表检查文件位置。文件位置和名称必须共同表示系统上的合法文件名,并且目录必须是可访问的。可访问目录的子目录不一定也可访问;它也必须使用与对象匹配的完整路径名来指定。

   halo0root=#  \df utl_file.*

   

utl_file.fclose_all:将关闭会话的所有打开的文件句柄。这应用作紧急清理过程,例如,当 PL/SQL 程序在异常时退出时。

语法:UTL_FILE.FCLOSE_ALL;

例如:

halo0root=# call utl_file.fclose_all( );

CALL

 

utl_file.fcopy:将文件的连续部分复制到新创建的文件。

默认情况下,如果省略 了 and 参数,则会复制整个文件。源文件以读取模式打开。目标文件以写入模式打开。可以选择指定起始行号和结束行号,以便从源文件的中心选取一个部分进行复制。

语法:UTL_FILE.FCOPY (

   src_location    IN VARCHAR2,

   src_filename    IN VARCHAR2,

   dest_location   IN VARCHAR2,

   dest_filename   IN VARCHAR2,

   start_line      IN BINARY_INTEGER DEFAULT 1,

   end_line        IN BINARY_INTEGER DEFAULT NULL);

说明:src_location源文件的目录位置,从视图中(区分大小写)DIRECTORY_NAMEALL_DIRECTORIES

src_filename要复制的源文件

dest_location创建目标文件的目标目录

dest_filename从源文件创建的目标文件

start_line开始复制的行号。默认值为第一行1

end_line停止复制的行号。默认值表示文件的结尾NULL,

例如:

call utl_file.fcopy('/home/halo','hh','/home/halo','xx.txt');

CALL

 

utl_file.fopen:打开一个文件,可以指定最大行大小,最多可以同时打开50个文件

语法:UTL_FILE.FOPEN (

   location     IN VARCHAR2,

   filename     IN VARCHAR2,

   open_mode    IN VARCHAR2,

   max_linesize IN BINARY_INTEGER DEFAULT 1024)

  RETURN FILE_TYPE;

说明:

 location文件的目录位置。此字符串是目录对象名称,必须以大写形式指定。必须对此目录对象授予读取权限,用户才能运行 。UTL_FILEFOPEN

filename文件名,包括扩展名(文件类型),不带目录路径。如果目录路径作为文件名的一部分提供,则 将被 忽略。在 Unix 上,文件名不能以 / 结尾。FOPEN

open_mode指定如何打开文件。模式包括:

r-- 阅读文本

w-- 写文字

a-- 附加文本

rb-- 读取字节模式

wb-- 写入字节模式

ab-- 追加字节模式

如果尝试打开指定""或""的文件,但该文件不存在,则会在模式下创建该文件。aabopen_modewrite

max_linesize此文件的每行(包括换行符)的最 大字节数(最小值 1,最大值 32767)。如果未指定,Oracle 将提供默认值 1024。

例如:

halo0root=#select UTL_FILE.FOPEN

('/home/halo','abc.txt','w','100') from dual ;

 fopen

-------

     1

(1 行记录)

 

utl_file.fremove:将删除磁盘文件,前提需要足够的权限。

语法: UTL_FILE.FREMOVE ( location IN VARCHAR2, filename IN VARCHAR2);

说明:

location文件的目录位置,发件人(区分大小写)DIRECTORY_NAMEALL_DIRECTORIES

filename要删除的文件的名称

例如:

halo0root=# call  utl_file.fremove('/home/halo','abc.txt');

CALL

 

utl_file.frename:将现有文件重命名为新名称

语法:UTL_FILE.FRENAME ( src_location IN VARCHAR2, src_filename IN VARCHAR2, dest_location IN VARCHAR2, dest_filename IN VARCHAR2, OVERWOVER IN BOOLEAN DEFAULT FALSE);

说明:src_location源文件的目录位置,从视图中(区分大小写)DIRECTORY_NAMEALL_DIRECTORIES

src_filename要重命名的源文件

dest_location目标文件的目标目录,从视图中(区分大小写)DIRECTORY_NAMEALL_DIRECTORIES

dest_filename文件的新名称

overwrite默认值为 。必须同时授予对源目录和目标目录的权限。可以使用该参数指定是否覆盖目标目录中存在文件。

例如:

halo0root=#call UTL_FILE.FRENAME('/home/halo','G.txt','/home/halo','hh');

CALL

utl_file.is_open:测试文件句柄以查看它是否标识打开的文件。

语法:UTL_FILE.IS_OPEN ( file  IN FILE_TYPE) RETURN BOOLEAN;

说明:file调用返回的活动文件句柄

例如:

halo0root=# select utl_file.is_open ('123') from dual;

 is_open

---------

 f

(1 行记录)

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论