41.11. 包

41.11.1. 包概述
41.11.2. 创建包
41.11.3. 创建和访问包
41.11.4. 示例
41.11.5. 限制
41.11.6. 包参考

本节介绍 LightDB 的“Oracle 风格包”(Oracle Style Package)。按照定义,一个包是一组打包在一起的对象或者一组对象。在数据库领域,这意味着一个命名的模式对象,其中包含逻辑上分组的一组过程、函数、变量、游标、用户定义的记录类型和引用记录。

41.11.1. 包概述

41.11.1.1. 包的必要性

与其他编程语言中类似的结构一样,使用 SQL 包有很多好处。在本节中,我们将涵盖其中的一些。

  • 可靠性和可重用性 - 包提供了创建封装代码的模块化对象的能力。这使得整体设计和实现变得更简单。封装允许通过公开包接口而不是其实现细节即包体来实现,从而使得模块更加简单易懂、易于维护和使用。 此外,封装还允许应用程序和用户引用一致的接口,而不用担心其包含的内容。它还可以防止用户基于代码实现做出任何决策,因为它们永远不会暴露给用户。

  • 易用性 - 在 LightDB 中创建一致的函数接口可以帮助简化应用程序开发,因为可以在不包括其正文的情况下编译包。在开发阶段之外,包允许用户管理整个包的访问控制,而不是单个对象。如果包含许多模式对象,则这是非常有价值的。

  • 性能 - 包被加载到内存中进行维护,因此利用最少的 I/O 资源。重新编译仅限于更改的对象,而依赖对象不会重新编译。

  • 附加功能 - 除了性能和易用性之外,包还为变量和游标提供了会话级持久性。这意味着变量和游标的生命周期与数据库会话相同,并在会话结束时被销毁。

41.11.1.2. 包组成部分

包由两个组成部分组成:包规范和包体。

包规范 - 包中要从外部使用的任何对象都在包规范部分中指定。这是我们在早期部分中提到的公共可访问接口。 它不包含它们的定义或实现,即函数和过程。它只定义了它们的头部而没有定义正文。变量可以初始化。 下面是可以列在包规范中的对象列表:

  • 函数

  • 过程

  • 游标

  • 类型

  • 变量

  • 记录类型

  • 关联数组

  • 嵌套表

包体 - 包体包含包的所有实现代码,包括公共接口和私有对象。如果规范不包含任何子程序或游标,则包体是可选的。

包体必须包含规范中声明的子程序的定义,并且相应的定义必须匹配。

包体可以包含其自己的子程序和类型声明,以及任何未在规范中指定的内部对象。然后,这些对象被视为私有对象。私有对象无法从包外部访问。

如果guc参数'lightdb_oracle_enble_drop_package_body_equal_drop_package'未设置, 则该guc参数默认值为true,删除包体时会同时删除包规范。

除了子程序定义之外,它还可以可选地包含一个初始化块,用于初始化规范中声明的变量,仅在会话中第一次调用包时执行一次。

41.11.2. 创建包

41.11.2.1. 创建包

CREATE PACKAGE —— 定义一个新的包规范。

语法

CREATE [ OR REPLACE ] [ EDITIONABLE | NONEDITIONABLE ] PACKAGE [schema.]package_name  [IS | AS] 
   item_list[, item_list ...]
END [package_name];
 

 
item_list: 
[
   function_declaration    | 
   procedure_declaration   | 
   type_definition         | 
   cursor_declaration      | 
   item_declaration
]
 
 
function_declaration:
     FUNCTION function_name [(parameter_declaration[, ...])] RETURN datatype;
 
procedure_declaration:
     PROCEDURE procedure_name [(parameter_declaration[, ...])]
 
type_definition:
     record_type_definition      |
     ref_cursor_type_definition
 
cursor_declaration:
   CURSOR name [(cur_param_decl[, ...])] RETURN rowtype;
 
item_declaration:
     cursor_declaration             |
     cursor_variable_declaration    |
     record_variable_declaration    |
     variable_declaration           |
 
record_type_definition:
   TYPE record_type IS RECORD  ( variable_declaration [, variable_declaration]... ) ;
 
ref_cursor_type_definition:
   TYPE type IS REF CURSOR [ RETURN type%ROWTYPE ];
 
cursor_variable_declaration:
   curvar curtype;
 
record_variable_declaration:
   recvar { record_type | rowtype_attribute | record_type%TYPE };
 
variable_declaration:
   varname datatype [ [ NOT NULL ] := expr ]
 
parameter_declaration:
   parameter_name [IN] datatype [[:= | DEFAULT] expr]

描述

CREATE PACKAGE用于创建包规范,其中包含公共声明。包规范中声明的项可以从包中的任何位置以及同一数据库中的任何其他子程序中访问。

CREATE PACKAGE用于定义一个新的包。CREATE OR REPLACE PACKAGE既可以创建一个新的包,也可以替换现有的定义。

如果包含模式名称,则在指定的模式中创建包。否则,它将在当前模式中创建。新包的名称在模式内必须是唯一的。

当使用CREATE OR REPLACE PACKAGE替换现有包时,包的所有权和权限不会更改。所有其他包属性都分配了指定或隐含在命令中的值。只有所有者和拥有角色的成员才允许替换包。

用户创建包后成为包的所有者。

41.11.2.2. 创建包体

CREATE PACKAGE BODY —— 定义一个新的包定义。

语法

CREATE [ OR REPLACE ] [ EDITIONABLE | NONEDITIONABLE ] PACKAGE BODY [schema.]package_name [IS | AS]
   [item_list[, item_list ...]] | 
   item_list_2 [, item_list_2 ...]
   [initialize_section]
END [package_name];
 
 
initialize_section:
   BEGIN statement[, ...]
 
item_list: 
[
   function_declaration    | 
   procedure_declaration   | 
   type_definition         | 
   cursor_declaration      | 
   item_declaration
]
 
item_list_2:
[
   function_declaration
   function_definition
   procedure_declaration
   procedure_definition
   cursor_definition
]
 
function_definition:
   FUNCTION function_name [(parameter_declaration[, ...])] RETURN datatype  [IS | AS]
   [declare_section] body;
 
procedure_definition:
   PROCEDURE procedure_name [(parameter_declaration[, ...])] [IS | AS] 
   [declare_section] body;
 
cursor_definition:
   CURSOR name [(cur_param_decl[, ...])] RETURN rowtype IS select_statement;
 
body:
   BEGIN statement[, ...] END [name];
 
statement:
   [LABEL] pl_statments[, ...];

        

描述

CREATE PACKAGE BODY 用于定义包的包体。 CREATE OR REPLACE PACKAGE BODY 可以创建新的包体,或替换现有的包体定义。 要创建包体,必须先创建包规范。包体包含通过 CREATE PACKAGE 创建的包规范中声明的每个游标和子程序的实现。 仅当包规范中列出它们的规范时,包体中定义的对象才可以被外部访问。 对于仅在包体中定义而未包含在包规范中的所有对象,它们成为包的私有成员,并且无法在包外部访问。 包和其包体必须在同一架构中创建。

41.11.2.3. 参数

EDITIONABLE,NONEDITIONABLE 如果为 schema 中的架构对象 PACKAGE 启用了版本控制, 则使用这两个属性可以指定函数是受版本控制的对象还是非受版本控制的对象。但目前只支持语法,未实现功能。 且该用法仅支持在oracle兼容模式使用。

package_name 是要创建的包的名称(可选模式限定符)。

item_list 是包含在包中的项目列表。

procedure_declaration 表示过程签名,即 procedure_name(argument_list)。 procedure_declaration 可以出现在包规范和包体中。 在包规范中列出的过程声明使该过程成为公共过程,并且可以从包外部访问。 而在包体中声明的过程被视为前向声明,并成为包的私有成员。

procedure_definition 是包过程的具体实现/定义。 procedure_definition 只能在包体中提供。 过程访问限定符由过程声明确定,而在包体中定义的过程,如果没有相应的声明,则自动成为包的私有成员。

function_declaration 表示函数签名及其返回类型,即 function_name(argument_list) RETURN return_type;。

function_declaration 可以出现在包规范和包体中。 在包规范中列出的函数声明使该函数成为公共函数,并且可以从包外部访问。 而在包体中声明的函数被视为前向声明,并成为包的私有成员。

function_definition 是包函数的具体实现/定义。 function_definition 只能在包体中提供。 函数访问限定符由函数声明确定,而在包体中定义的函数,如果没有相应的声明,则自动成为包的私有成员。

type_definition 可以是 RECORD 或 CURSOR 类型定义。

cursor_declaration 表示带有参数和返回类型为所需 ROWTYPE 的 CURSOR 声明。

item_declaration 允许声明:游标、游标变量、记录变量、变量。

parameter_declaration 定义声明参数的语法。 如果指定了关键字“IN”,则表示这是一个输入参数。 对于输入参数,DEFAULT 关键字后跟表达式(或值)。

declare_section 包含所有对于函数或过程局部的元素,可以在其体内被引用。

body 由 pl/sql 语言支持的 SQL 语句或 PL 控制结构组成。

41.11.3. 创建和访问包

41.11.3.1. 创建包

在之前的章节中,我们已经了解了规定包结构的语法。在本章中,我们将进一步了解包的构造过程以及如何访问其公共元素。

包创建后,LightDB 会编译它并报告任何可能发现的问题。一旦包成功编译,它就可以用于操作了。

41.11.3.2. 访问包元素

在会话中首次引用包时,将实例化和初始化该包。在此过程中按相同顺序执行以下操作:

  • 给公共变量分配初始值

  • 执行包的初始化程序块

有几种方法可以访问包元素:

  • 包函数可以像其他函数一样在 SELECT 语句或其他 PL 块中使用

  • 可以直接使用 CALL 调用包过程或从其他 PL 块调用

  • 可以在 PL 块中使用包名称限定符直接读取和写入包变量。

  • 可以使用点符号表示法进行直接访问:可以按以下方式访问元素:

    • package_name.func('foo');

    • package_name.proc('foo');

    • package_name.variable;

    如果元素是函数,则可以从 PL 块内或 SELECT 语句中使用这些语句。

  • SQL CALL 语句:另一种方法是使用 CALL 语句。CALL 语句在类型或包中执行独立过程。

    • CALL package_name.proc('foo');

41.11.3.3. 了解可见性范围

pl/sql 块中声明的变量的作用域仅限于该块。如果它有嵌套块,则对于嵌套块来说,它将是一个全局变量。

同样地,如果两个块声明了相同名称的变量,那么在嵌套块中,其自己声明的变量可见,父级的变量则不可见。要访问父级变量,必须完全限定该变量。

请看以下代码片段。

示例:可见性和限定变量名称

    
-- blk_1
DECLARE
   x INT;
   y INT;
BEGIN
   -- both blk_1.x and blk_1.y are visible
   -- blk_2
   DECLARE
      x INT;
      z INT;
   BEGIN
      -- blk_2.x, y and z are visible
      -- to access blk_1.x it has to be a qualified name. blk_1.x := 0; NULL;
      NULL;
   END;
   -- both x and y are visible
END;
/
    

上面的示例展示了当嵌套包含一个与变量同名的变量时,必须完全限定变量名的方法。

变量名限定有助于解决以下情况中引入的可能混淆:

  • 包和嵌套包变量:未经限定,嵌套包优先。

  • 包变量和列名称:未经限定,列名称优先。

  • 函数或过程变量和包变量:未经限定,包变量优先。

41.11.4. 示例

创建一个名为 example 的包。

CREATE TABLE test(x INT, y VARCHAR2(100));
create table rectype(a int,b varchar2(100));
INSERT INTO test VALUES (1, 'One');
INSERT INTO test VALUES (2, 'Two');
INSERT INTO test VALUES (3, 'Three');

CREATE OR REPLACE PACKAGE example
AS
   -- 声明类型和游标:
   CURSOR curtype RETURN rectype%rowtype;
 
   rec rectype%rowtype;
 
   -- 声明子程序:
   FUNCTION somefunc (v int) RETURN NUMBER;
 
   -- 重载前面的子程序:
   PROCEDURE xfunc (emp_id NUMBER);
   PROCEDURE xfunc (emp_email VARCHAR2);
END;
/

创建一个名为 example 的包体。

CREATE OR REPLACE PACKAGE BODY example
AS
   nelems NUMBER; -- 这个包中的变量

   -- 定义在包规范中声明的游标:
   CURSOR curtype RETURN rectype%rowtype IS SELECT x, y FROM test ORDER BY x;
   -- 定义在包规范中声明的子程序:
   FUNCTION somefunc (v int) RETURN NUMBER
   IS
       id NUMBER := 0;
	   BEGIN
	     OPEN curtype;
            FETCH curtype INTO rec;
         RETURN rec.a;
     END;
 
   PROCEDURE xfunc (emp_id NUMBER) IS
   BEGIN
      NULL;
   END;
 
   PROCEDURE xfunc (emp_email VARCHAR2) IS
   BEGIN
      NULL;
   END;
 
END;
/
    

41.11.5. 限制

记录类型被支持作为包变量,但是它们只能在包元素内使用,即包函数/过程可以利用它们。 它们不能在包外部访问。

不建议将包类型用于建表和函数/过程语句(在包外部),因为这可能会导致一些问题。

同一 schema 下不能存在相同名字的表和包。与 oracle 相同。

lightdb@postgres=# create table t1(key1 int);
CREATE TABLE
lightdb@postgres=# create package t1 IS
        key1 real;
        end;
/
ERROR:  relation "t1" already exists
HINT:  A relation has the same name, so you must use a name that doesn't conflict with any existing relation.
lightdb@postgres=# drop table t1;
DROP TABLE
lightdb@postgres=# create package t1 IS
        key1 real;
        end;
/
CREATE PACKAGE
lightdb@postgres=# create table t1(key1 int);
ERROR:  package "t1" already exists
HINT:  A package has the same name, so you must use a name that doesn't conflict with any existing package.
lightdb@postgres=# 
    

schema 和 table 不能有相同的名字。

lightdb@postgres=# create package t1 IS
        key1 real;
        end;
/
CREATE PACKAGE
lightdb@postgres=# create schema t1;
ERROR:  package name "t1" exists, schema name is forbid same with package name.
lightdb@postgres=# drop package t1;
DROP PACKAGE
lightdb@postgres=# create schema t1;
CREATE SCHEMA
lightdb@postgres=# create package t1 IS
        key1 real;
        end;
/
ERROR:  schema name "t1" exists, package name is forbid same with schema name.
lightdb@postgres=# 
    

41.11.6. 包参考

“包”是由模式组合在一起的一组功能,具有单一的功能,并通过从PL/pgSQL调用来使用。

支持以下包:

  • DBMS_ALERT

  • DBMS_ASSERT

  • DBMS_DATAPUMP

  • DBMS_LOB

  • DBMS_OUTPUT

  • DBMS_PIPE

  • DBMS_RANDOM

  • DBMS_UTILITY

  • DBMS_JOB

  • DBMS_LOCK

  • DBMS_METADATA

  • DBMS_OBFUSCATION_TOOLKIT

  • DBMS_SNAPSHOT

  • DBMS_SQL

  • DBMS_STATS

  • UTL_FILE

  • UTL_RAW

  • UTL_URL

  • UTL_ENCODE

要从PL/pgSQL调用不同的功能,请使用PERFORM语句或SELECT语句,并使用包名称限定功能名称。请参考每个包功能的解释,以获取有关调用格式的信息。

41.11.6.1. DBMS_ALERT

概述

DBMS_ALERT包可将警报从一个PL/pgSQL会话发送到多个其他PL/pgSQL会话。

当进行1:N处理时,可以使用此包,例如在同时将警报从给定的PL/pgSQL会话通知到另一个PL/pgSQL会话时。

Table 41.2. DBMS_ALERT功能

特性描述
REGISTER注册指定的警报。
REMOVE删除指定的警报。
REMOVEALL从会话中删除所有警报。
SIGNAL通知警报。
WAITANY等待会话注册的任何警报的通知。
WAITONE等待会话注册的特定警报的通知。

语法

41.11.6.1.1. 功能说明

本节将说明DBMS_ALERT的每个功能。

REGISTER

  • REGISTER函数将指定的警报注册到会话中。通过将警报注册到会话中,可以接收到SIGNAL通知。

  • 指定警报的名称。

  • 警报区分大小写。

  • 可以在单个会话中注册多个警报。如果注册多个警报,请为每个警报调用REGISTER函数。

示例

        PERFORM DBMS_ALERT.REGISTER('sample_alert');
        

REMOVE

  • REMOVE 从会话中移除指定警报。

  • 指定警报的名称。

  • 警报区分大小写。

  • 警报留下的消息将被移除。

示例

        PERFORM DBMS_ALERT.REMOVE('sample_alert');
        

REMOVEALL

  • REMOVEALL 从会话中移除所有已注册的警报。

  • 所有警报留下的消息都将被移除。

示例

        PERFORM DBMS_ALERT.REMOVEALL();
        

SIGNAL

  • SIGNAL 发送指定警报的消息通知。

  • 指定要发送消息通知的警报名称。

  • 警报区分大小写。

  • 在消息中,指定要通知的警报消息。

  • 当执行 SIGNAL 时,消息通知并不完整。消息通知是在提交事务时发送的。如果在 SIGNAL 执行后执行回滚,则消息通知会被丢弃。

  • 如果来自多个会话的同一警报发送了消息通知,则消息将被累积而不被移除。

示例

        PERFORM DBMS_ALERT.SIGNAL('ALERT001','message001');
        

注意

如果连续发出 SIGNAL,累积的消息超过一定数量,则可能会输出内存不足错误。如果内存不足,请调用 AITANY 或 WAITONE 来接收警报,并减少累积的消息。

WAITANY

  • WAITANY 等待会话中任何已注册的警报的通知。

  • 指定等待警报的最大等待时间 timeout(以秒为单位)。

  • 使用 SELECT 语句获取通知信息,该信息存储在名称、消息和状态列中。

  • 名称列存储警报名称。名称的数据类型为 TEXT。

  • 消息列存储通知警报的消息。消息的数据类型为 TEXT。

  • 状态列存储操作返回的状态代码:0-发生警报;1-发生超时。状态的数据类型为 INTEGER。

示例

        DECLARE
            alert_name         TEXT := 'sample_alert';
            alert_message      TEXT;
            alert_status       INTEGER;
        BEGIN
            SELECT name,message,status INTO alert_name,alert_message,alert_status FROM DBMS_ALERT.WAITANY(60);
        

WAITONE

  • WAITONE 等待指定警报的通知。

  • 指定要等待的警报名称。

  • 警报区分大小写。

  • 指定等待警报的最大等待时间 timeout(以秒为单位)。

  • 使用 SELECT 语句获取通知信息,该信息存储在消息和状态列中。

  • 消息列存储通知警报的消息。消息的数据类型为 TEXT。

  • 状态列存储操作返回的状态代码:0-发生警报;1-发生超时。状态的数据类型为 INTEGER。

示例

        DECLARE
            alert_message   TEXT;
            alert_status    INTEGER;
        BEGIN
            SELECT message,status INTO alert_message,alert_status FROM DBMS_ALERT.WAITONE('sample_alert', 60);
        
41.11.6.1.2. 使用示例

下面是 DBMS_ALERT 处理流程的使用示例。

DBMS_ALERT 流程

注意

  • SIGNAL 发送的消息通知的目标是在执行 SIGNAL 时执行 REGISTER 的会话。

  • 在接收端,始终确保使用 REMOVE 或 REMOVEALL 尽快删除警报,以便在不再需要警报时将其删除。如果关闭会话而没有删除警报,则可能无法在另一个会话中接收到同名警报的 SIGNAL。

  • DBMS_ALERT 和 DBMS_PIPE 使用相同的内存环境。因此,当检测到 DBMS_PIPE 的内存不足时,也可能会检测到 DBMS_ALERT 的内存不足。

使用示例

  • 发送方

        CREATE FUNCTION send_dbms_alert_exe() RETURNS VOID AS $$
        BEGIN
            PERFORM DBMS_ALERT.SIGNAL('sample_alert','SIGNAL ALERT');
        END;
        $$ LANGUAGE plpgsql;
        SELECT send_dbms_alert_exe();
        DROP FUNCTION send_dbms_alert_exe();
        
  • 接收方

        CREATE FUNCTION receive_dbms_alert_exe() RETURNS VOID AS $$
        DECLARE
            alert_name    TEXT := 'sample_alert';
          alert_message TEXT;
          alert_status  INTEGER;
        BEGIN
          PERFORM DBMS_ALERT.REGISTER(alert_name);
          SELECT message,status INTO alert_message,alert_status FROM DBMS_ALERT.WAITONE(alert_name,300);
          RAISE NOTICE 'Message : %', alert_message;
          RAISE NOTICE 'Status  : %', alert_status;
          PERFORM DBMS_ALERT.REMOVE(alert_name);
        END;
        $$ LANGUAGE plpgsql;
        SELECT receive_dbms_alert_exe();
        DROP FUNCTION receive_dbms_alert_exe();
        

41.11.6.2. DBMS_ASSERT

概述

在 PL/pgSQL 中执行输入值属性的验证。

Table 41.3. DBMS_ASSERT 特性

特性描述
ENQUOTE_LITERAL返回用单引号括起来的指定字符串。
ENQUOTE_NAME返回用双引号括起来的指定字符串。
NOOP按原样返回指定的字符串。
OBJECT_NAME验证指定的字符串是否为已定义的标识符。
QUALIFIED_SQL_NAME验证指定的字符串是否以适当的格式作为标识符。
SCHEMA_NAME验证指定的字符串是否为已定义的模式。
SIMPLE_SQL_NAME验证指定的字符串是否以适当的格式作为单个标识符。

语法

41.11.6.2.1. 特性描述

本节介绍了 DBMS_ASSERT 的每个特性。

ENQUOTE_LITERAL

  • ENQUOTE_LITERAL 返回用单引号括起来的指定字符串。

  • 指定一个用单引号括起来的字符串。

  • 返回值的数据类型是VARCHAR。

示例

        DECLARE
            q_literal    VARCHAR(256);
        BEGIN
            q_literal := DBMS_ASSERT.ENQUOTE_LITERAL('literal_word');
        

ENQUOTE_NAME

  • ENQUOTE_NAME将指定的字符串用双引号括起来返回。

  • 指定用双引号括起来的字符串。

  • 对于小写字母转换,请指定TRUE或FALSE。指定TRUE将字符串中的大写字母转换为小写字母。如果指定FALSE,则不会进行小写转换。默认值为TRUE。

  • 如果字符串中的所有字符都是小写,则不会用双引号括起来。

  • 返回值的数据类型是VARCHAR。

参见

有关布尔类型(TRUE/FALSE)值的信息,请参阅LightDB文档中的“The SQL Language”>“Data Types”>“Boolean Type”。

示例

        DECLARE
            dq_literal    VARCHAR(256);
        BEGIN
            dq_literal := DBMS_ASSERT.ENQUOTE_NAME('TBL001');
        

NOOP

  • NOOP原样返回指定的字符串。

  • 指定一个字符串。

  • 返回值的数据类型是VARCHAR。

示例

        DECLARE
            literal    VARCHAR(256);
        BEGIN
            literal := DBMS_ASSERT.NOOP('NOOP_WORD');
        

OBJECT_NAME

  • OBJECT_NAME验证指定的字符串是否为已定义的标识符。

  • 指定要验证的标识符。如果已定义该标识符,则返回指定的标识符。否则,将出现以下错误。

        ERROR:  invalid object name
        
  • 返回值的数据类型是VARCHAR。

示例

        DECLARE
            object_name    VARCHAR(256);
        BEGIN
            object_name := DBMS_ASSERT.OBJECT_NAME('SCM001.TBL001');
        

QUALIFIED_SQL_NAME

  • QUALIFIED_SQL_NAME验证指定的字符串是否符合标识符的适当格式。

  • 指定要验证的标识符。如果字符串可以用作标识符,则将返回指定的标识符。否则,将出现以下错误。

        ERROR:  string is not qualified SQL name
        
  • 返回值的数据类型是VARCHAR。

参见

关于可以用作标识符的格式的信息,请参阅LightDB文档中的“The SQL Language”>“Lexical Structure”>“Identifiers and Key Words”。

示例

        DECLARE
            object_name    VARCHAR(256);
        BEGIN
            object_name := DBMS_ASSERT.QUALIFIED_SQL_NAME('SCM002.TBL001');
        

SCHEMA_NAME

  • SCHEMA_NAME验证指定的字符串是否为已定义的模式。

  • 指定要验证的模式名称。如果已定义该模式,则返回指定的模式名称。否则,将出现以下错误。

        ERROR:  invalid schema name
        
  • 返回值的数据类型是VARCHAR。

示例

        DECLARE
            schema_name    VARCHAR(256);
        BEGIN
            schema_name := DBMS_ASSERT.SCHEMA_NAME('SCM001');
        

SIMPLE_SQL_NAME

  • SIMPLE_SQL_NAME验证指定的字符串是否符合单个标识符的适当格式。

  • 指定要验证的标识符。如果指定的字符串可以用作标识符,则返回指定的标识符。否则,将出现以下错误。

        ERROR:  string is not qualified SQL name
        
  • 返回值的数据类型是VARCHAR。

参见

关于可以用作标识符的格式的信息,请参阅LightDB文档中的“The SQL Language”>“Lexical Structure”>“Identifiers and Key Words”。请注意,如果指定了使用全角字符的标识符,则会出现错误。如果包含全角字符,请指定带引号的标识符。

示例

        DECLARE
            simple_name    VARCHAR(256);
        BEGIN
            simple_name := DBMS_ASSERT.SIMPLE_SQL_NAME('COL01');
        
41.11.6.2.2. 用法示例

下面是 DBMS_ASSERT 的使用示例。

        CREATE FUNCTION dbms_assert_exe() RETURNS VOID AS $$
        DECLARE
          w_schema VARCHAR(20) := 'public';
          w_table  VARCHAR(20) := 'T1';
          w_object VARCHAR(40);
        BEGIN
          PERFORM DBMS_ASSERT.NOOP(w_schema);
          PERFORM DBMS_ASSERT.SIMPLE_SQL_NAME(w_table);
          PERFORM DBMS_ASSERT.SCHEMA_NAME(w_schema);
          w_object := w_schema || '.' || w_table;
          PERFORM DBMS_ASSERT.QUALIFIED_SQL_NAME(w_object);
          PERFORM DBMS_ASSERT.OBJECT_NAME(w_object);
          RAISE NOTICE 'OBJECT     : %', DBMS_ASSERT.ENQUOTE_LITERAL(w_object);
          RAISE NOTICE 'TABLE_NAME : %', DBMS_ASSERT.ENQUOTE_NAME(w_table);
        END;
        $$
        LANGUAGE plpgsql;
        SELECT dbms_assert_exe();
        DROP FUNCTION dbms_assert_exe();
        

41.11.6.3. DBMS_DATAPUMP

概述

提供一组函数存储过程来管理数据泵作业、导出和导入数据、查询作业状态等操作。

Table 41.4. DBMS_DATAPUMP功能

功能描述
ADD_FILE添加转储文件日志文件。
ATTACH获取数据泵作业句柄。
METADATA_FILTER添加元数据筛选项。
OPEN声明新作业返回句柄。
SET_PARALLEL指定作业并行度。
SET_PARAMETER指定作业配置项。
START_JOB启动数据泵作业。
STOP_JOB结束数据泵作业。
WAIT_FOR_JOB数据泵作业等待。(无效)

语法

        PROCEDURE ADD_FILE(HANDLE IN NUMERIC, FILENAME IN VARCHAR2, DIRECTORY IN VARCHAR2, FILESIZE IN VARCHAR2 DEFAULT NULL, FILETYPE IN NUMERIC DEFAULT 0, REUSEFILE IN NUMERIC DEFAULT NULL);

        FUNCTION ATTACH(JOB_NAME IN VARCHAR2 DEFAULT NULL, JOB_OWNER IN VARCHAR2 DEFAULT NULL) RETURN NUMERIC;

        PROCEDURE METADATA_FILTER(HANDLE IN NUMERIC, NAME IN VARCHAR2, VALUE IN VARCHAR2, OBJECT_PATH IN VARCHAR2 DEFAULT NULL);

        PROCEDURE METADATA_FILTER(HANDLE IN NUMERIC, NAME IN VARCHAR2, VALUE IN CLOB, OBJECT_PATH IN VARCHAR2 DEFAULT NULL);

        FUNCTION OPEN(OPERATION IN VARCHAR2, JOB_MODE IN VARCHAR2, REMOTE_LINK IN VARCHAR2 DEFAULT NULL, JOB_NAME IN VARCHAR2 DEFAULT NULL, VERSION IN VARCHAR2 DEFAULT 'COMPATIBLE') RETURN NUMERIC;

        PROCEDURE SET_PARAMETER(HANDLE IN NUMERIC, NAME IN VARCHAR2, VALUE IN VARCHAR2);

        PROCEDURE SET_PARAMETER(HANDLE IN NUMERIC, NAME IN VARCHAR2, VALUE IN NUMERIC);

        PROCEDURE SET_PARALLEL(HANDLE IN NUMERIC, DEGREE IN NUMERIC);

        PROCEDURE START_JOB(HANDLE IN NUMERIC, SKIP_CURRENT IN NUMERIC DEFAULT 0, ABORT_STEP IN NUMERIC DEFAULT 0, CLUSTER_OK IN NUMERIC DEFAULT 1, SERVICE_NAME IN VARCHAR2 DEFAULT NULL);

        PROCEDURE STOP_JOB(HANDLE IN NUMERIC, IMMEDIATE IN NUMERIC DEFAULT 0, KEEP_MASTER IN NUMERIC DEFAULT NULL, DELAY IN NUMERIC DEFAULT 60);

        PROCEDURE WAIT_FOR_JOB(HANDLE IN NUMERIC, JOB_STATE OUT VARCHAR2);
      
41.11.6.3.1. 功能描述

本节解释了DBMS_DATAPUMP的每个功能。

ADD_FILE

  • 此过程添加转储文件或日志文件到导入导出作业。

  • FILESIZE,REUSEFILE参数目前未使用。

示例

    DBMS_DATAPUMP.ADD_FILE(HANDLE => hdl, FILENAME => 'example001.dmp', DIRECTORY => 'DMPDIR');
    DBMS_DATAPUMP.ADD_FILE(HANDLE => hdl, FILENAME => 'example001.log', DIRECTORY => 'DMPDIR', FILESIZE => '', FILETYPE => DBMS_DATAPUMP.KU$_FILE_TYPE_LOG_FILE);
        

ATTACH

  • 此函数获取数据泵作业句柄。

示例

    DBMS_DATAPUMP.ATTACH(JOB_NAME => 'example001', JOB_OWNER => 'lightdb')
        

METADATA_FILTER

  • 此过程添加元数据筛选项。

  • NAME已支持'SCHEMA_EXPR','NAME_EXPR';VALUE已支持IN,NOT IN,LIKE,NOT LIKE表达式。

  • OBJECT_PATH参数目前未使用。

示例

    DBMS_DATAPUMP.METADATA_FILTER(HANDLE => hdl, NAME => 'SCHEMA_EXPR', VALUE => 'LIKE ''%HR%''');
    DBMS_DATAPUMP.METADATA_FILTER(HANDLE => hdl, NAME => 'NAME_EXPR', VALUE => 'LIKE ''%EMP%''');
        

OPEN

  • 此函数声明新作业返回句柄。

  • OPERATION已支持'EXPORT','IMPORT';JOB_MODE已支持'SHCEMA','TABLE'。

  • REMOTE_LINK,VERSION参数目前未使用。

示例

    DBMS_DATAPUMP.OPEN(OPERATION => 'EXPORT', JOB_MODE => 'TABLE', REMOTE_LINK => NULL, JOB_NAME => 'EXAMPLE001', VERSION => 'LATEST');
        

SET_PARAMETER

  • 指定作业配置项。

示例

    DBMS_DATAPUMP.SET_PARAMETER(HANDLE => hdl, NAME => 'COMPRESSION', VALUE => 'ALL');
        

SET_PARALLEL

  • 指定作业并行度。

示例

    DBMS_DATAPUMP.SET_PARALLEL(HANDLE => hdl, DEGREE => 2);
        

START_JOB

  • 启动数据泵作业。

    SKIP_CURRENT,ABORT_STEP,CLUSTER_OK,SERVICE_NAME参数目前未使用。

示例

    DBMS_DATAPUMP.START_JOB(HANDLE => hdl);
        

STOP_JOB

  • 结束数据泵作业。

  • IMMEDIATE,KEEP_MASTER,DELAY参数目前未使用。

示例

    DBMS_DATAPUMP.STOP_JOB(HANDLE => hdl);
        

WAIT_FOR_JOB

  • 数据泵作业等待(当前该存储过程内部未作实现)。

示例

    DBMS_DATAPUMP.WAIT_FOR_JOB(HANDLE => hdl,JOB_STATE => jbs);
        
41.11.6.3.2. 使用示例

下面是DBMS_DATAPUMP的一个使用示例。

    --EXPORT JOB
    declare
        hdl numeric;
        jbs varchar2;
    begin
        hdl := dbms_datapump.open(operation => 'EXPORT', job_mode => 'TABLE', remote_link => NULL, job_name => 'EXAMPLE001', version => 'LATEST');

        dbms_datapump.add_file(handle => hdl, filename => 'example001.dmp', directory => 'DMPDIR');
        dbms_datapump.add_file(handle => hdl, filename => 'example001.log', directory => 'DMPDIR', filesize => '', filetype => DBMS_DATAPUMP.KU$_FILE_TYPE_LOG_FILE);

        dbms_datapump.metadata_filter(handle => hdl, name => 'NAME_EXPR', value => 'LIKE ''%EMP%''');

        dbms_datapump.set_parameter(handle => hdl, name => 'COMPRESSION', value => 'ALL');
        dbms_datapump.set_parallel(handle => hdl, degree => 2);

        dbms_datapump.start_job(handle => hdl);

        dbms_datapump.wait_for_job(handle => hdl,job_state => jbs);

        dbms_datapump.stop_job(handle => hdl);
    end;
    /

    --IMPORT JOB
    declare
        hdl numeric;
        jbs varchar2;
    begin
        hdl := dbms_datapump.open(operation => 'IMPORT', job_mode => 'TABLE', remote_link => NULL, job_name => 'EXAMPLE001', version => 'LATEST');

        dbms_datapump.add_file(handle => hdl, filename => 'example001.dmp', directory => 'DMPDIR');
        dbms_datapump.add_file(handle => hdl, filename => 'example001.log', directory => 'DMPDIR', filesize => '', filetype => DBMS_DATAPUMP.KU$_FILE_TYPE_LOG_FILE);

        dbms_datapump.set_parallel(handle => hdl, degree => 2);

        dbms_datapump.start_job(handle => hdl);

        dbms_datapump.wait_for_job(handle => hdl,job_state => jbs);

        dbms_datapump.stop_job(handle => hdl);
    end;
    /
        

41.11.6.4. DBMS_LOB

概述

一些与 DBMS_LOB 包兼容的函数。

Table 41.5. DBMS_LOB 功能

功能描述
INSTR返回指定 LOB 的起始索引。
SUBSTR提取 LOB 的子字符串。
GETLENGTH返回 LOB 中字符的数量。
APPEND将源 LOB 的内容追加到目标 LOB 中。
CLOSE关闭之前打开的内部或外部 LOB。(已作废)
COMPARE比较两个完整的 LOB 或两个 LOB 的部分。
COPY将源 LOB 的全部或部分内容复制到目标 LOB 中。
CREATETEMPORAR在用户默认的临时表空间中创建一个临时 BLOB 或 CLOB 及其相应的索引。(已作废)
ERASE擦除一个LOB的全部或部分。
FREETEMPORARY释放一个LOB的全部或部分临时空间。
OPEN在默认的临时表空间中释放临时BLOB或CLOB。(无效)
READ从指定偏移量开始读取LOB中的数据。
TRIM将LOB值修剪为指定的较短长度。
WRITE从指定偏移量开始向LOB写入数据。
WRITEAPPEND将缓冲区写入LOB的末尾。
COMPARE比较两个完整的LOB或两个LOB的部分。
COMPARE比较两个完整的LOB或两个LOB的部分。
COMPARE比较两个完整的LOB或两个LOB的部分。

语法

        INSTR(STR TEXT, PATT TEXT, START INTEGER DEFAULT  1, NTH INTEGER DEFAULT 1) RETURNS INTEGER
        INSTR(STR BLOB, PATT TEXT, START INTEGER DEFAULT  1, NTH INTEGER DEFAULT 1) RETURNS INTEGER
        SUBSTR(STR CLOB, AMOUNT INTEGER DEFAULT 32767, START_OFFSET INTEGER DEFAULT 1) RETURNS VARCHAR2
        SUBSTR(STR BLOB, AMOUNT INTEGER DEFAULT 32767, START_OFFSET INTEGER DEFAULT 1) RETURNS RAW
        GETLENGTH(STR CLOB) RETURNS INTEGER
        GETLENGTH(STR BLOB) RETURNS INTEGER
        APPEND(dest_lob BLOB,src_lob BLOB)/APPEND(CLOB,CLOB)
        COMPARE(lob_1 BLOB,lob_2 BLOB,amount INT4 DEFAULT 2147483647,offset_1 INT4 DEFAULT 1,offset_2 INT4 DEFAULT 1) RETURNS INTEGER
        COMPARE(CLOB,CLOB,INT4 DEFAULT 2147483647,INT4 DEFAULT 1,INT4 DEFAULT 1) RETURNS INTEGER
        COPY(dest_lob BLOB,src_lob BLOB,amount INT4,dest_offset INT4 DEFAULT 1,src_offset INT4 DEFAULT 1)/COPY(CLOB,CLOB,INT4,INT4 DEFAULT 1,INT4 DEFAULT 1)
        ERASE(lob_loc BLOB,amount INT4,p_offset INT4 DEFAULT 1)/ERASE(CLOB,INT4,INT4 DEFAULT 1)
        READ(lob_loc BLOB,amount INT4,p_offset INT4,buffer RAW)/READ(CLOB,INT4,INT4,TEXT)
        TRIM(lob_loc BLOB,newlen INT4)/TRIM(CLOB,INT4)
        WRITE(lob_loc BLOB,amount INT4,p_offset INT4,buffer RAW)/WRITE(CLOB,INT4,INT4,TEXT)
        WRITEAPPEND(lob_loc BLOB,amount INT4,buffer RAW)/WRITEAPPEND(CLOB,INT4,TEXT)
        

特性

41.11.6.4.1. 描述

本节介绍了DBMS_LOB的每个特性。

INSTR

  • 匹配模式的起始偏移量,以字节或字符为单位。如果未找到模式,则返回0。

  • 如果任何一个或多个输入参数为NULL或INVALID,则返回null。

  • 如果offset < 1,则返回NULL。

例子

        select dbms_lob.INSTR('Thomas', 'om') from  dual;
        select dbms_lob.INSTR('Thomas'::blob, utl_raw.CAST_TO_RAW('om')) from  dual;
        

SUBSTR

  • 如果指定了start和count,则从start位置开始提取字符串的子字符串,并在count个字符后停止。

  • 如果任何输入参数为NULL,则返回NULL。

  • 如果amount < 1,则返回NULL。

  • 如果offset < 1,则返回NULL。

例子

        select dbms_lob.substr('1234567',1,2) from  dual;
        select dbms_lob.substr('1234567'::blob,1,2) from  dual;
        

GETLENGTH

  • 文本的长度,以字节或字符的形式表示为INTEGER。

  • 如果输入的str为NULL,则返回NULL。

例子

        select DBMS_LOB.GETLENGTH('abc') from dual;
        

APPEND

  • 将源LOB的内容附加到目标LOB中。

例子

    declare
        l_blob          blob := 'abcd'::blob;
        l_clob          clob := 'abcd'::clob;
    begin
        dbms_output.serveroutput(true);
        dbms_lob.append(l_blob, 'ext'::blob);
        dbms_output.put_line(l_blob::text);

        dbms_lob.append(l_clob, 'ext'::clob);
        dbms_output.put_line(l_clob);
    end;
    /
        

COMPARE

  • 比较两个完整的LOB或两个LOB的部分。

  • 返回 0 如果 `lob_1` 和 `lob_2` 相等,返回 -1 如果 `lob_1` 比 `lob_2` 小,返回 1 如果 `lob_1` 比 `lob_2` 大。

  • 返回 NULL 如果amount、offset_1或offset_2不是有效的LOB偏移值。有效偏移值的范围为1至LOBMAXSIZE(包括1和LOBMAXSIZE)。

例子

    declare
        l_result        int;
        l_blob          blob := 'abcd'::blob;
        l_clob          clob := 'abcd'::clob;
        l_raw_result    raw;
        l_amout         INTEGER := 100;
        l_text_result  text;
    begin
        dbms_output.serveroutput(true);
        l_result := dbms_lob.compare('abcd'::blob, 'abcd'::blob);
        dbms_output.put_line(l_result);
        l_result := dbms_lob.compare('abcd'::clob, 'abcd'::clob);
        dbms_output.put_line(l_result);

    end;
    /
        

COPY

  • 将源LOB的全部或部分内容复制到目标LOB中。 您可以指定源LOB和目标LOB的偏移量,以及要复制的字节数或字符数。

  • 如果您在目标LOB中指定的偏移量超出了当前LOB中的数据末尾,则会在目标BLOB或CLOB中插入零字节填充或空格。如果偏移量小于目标LOB的当前长度,则现有数据将被覆盖。

例子

    declare
        l_result        int;
        l_blob          blob := 'abcd'::blob;
        l_clob          clob := 'abcd'::clob;
        l_raw_result    raw;
        l_amout         INTEGER := 100;
        l_text_result  text;
    begin
        dbms_output.serveroutput(true);
        dbms_lob.copy(l_blob, 'new_blob'::blob, 100);
        dbms_output.put_line(l_blob::text);
        dbms_lob.copy(l_blob, 'xnew_blob'::blob, 100, 1, 2);
        dbms_output.put_line(l_blob::text);
        dbms_lob.copy(l_blob, 'xnew_blob'::blob, 100, 2, 2);
        dbms_output.put_line(l_blob::text);
    end;
    /
        

ERASE

  • 擦除整个内部LOB或部分内部LOB。

  • 当从LOB中间擦除数据时,会写入BLOB或CLOB的零字节填充或空格。

  • 如果在擦除指定数量之前到达LOB值的末尾,则实际擦除的字节数或字符数可能与您在amount参数中指定的数量不同。实际擦除的字符或字节数将在amount参数中返回。

例子

    declare
        l_result        int;
        l_blob          blob := 'abcd'::blob;
        l_clob          clob := 'abcd'::clob;
        l_raw_result    raw;
        l_amout         INTEGER := 100;
        l_text_result  text;
    begin
        dbms_output.serveroutput(true);

        l_blob := 'abcd'::blob;
        l_amout := 100;
        dbms_output.put_line(l_blob::text);
        dbms_lob.erase(l_blob, l_amout);
        dbms_output.put_line(l_blob::text);

        l_clob := 'abcd'::clob;
        l_amout := 4;
        dbms_lob.erase(l_clob, l_amout);
        dbms_output.put_line(l_clob);
    end;
    /
        

READ

  • 此过程读取LOB的一部分,并将指定的amount从LOB开头的绝对偏移量开始返回到缓冲区参数中。

  • 实际读取的字节数或字符数将在amount参数中返回。如果输入的偏移量指向LOB的末尾,则将amount设置为0,并引发NO_DATA_FOUND异常。

例子

    declare
        l_result        int;
        l_blob          blob := 'abcd'::blob;
        l_clob          clob := 'abcd'::clob;
        l_raw_result    raw;
        l_amout         INTEGER := 100;
        l_text_result  text;
    begin
        dbms_output.serveroutput(true);

        l_amout := 5;
        dbms_lob.read('abcde'::blob, l_amout, 1, l_raw_result);
        dbms_output.put_line(l_raw_result);

        l_amout := 5;
        dbms_lob.read('abcde'::clob, l_amout, 1, l_text_result);
        dbms_output.put_line(l_text_result);
    end;
    /
        

TRIM

  • 此过程将内部LOB的值修剪为您在newlen参数中指定的长度。对于BLOB,请以字节为单位指定长度;对于CLOB,请以字符为单位指定长度。

例子

    declare
        l_result        int;
        l_blob          blob := 'abcd'::blob;
        l_clob          clob := 'abcd'::clob;
        l_raw_result    raw;
        l_amout         INTEGER := 100;
        l_text_result  text;
    begin
        dbms_output.serveroutput(true);

        l_blob := 'abcde'::blob;
        dbms_lob.trim(l_blob, 1);
        dbms_output.put_line(l_blob::text);

        l_clob := 'abcde'::clob;
        dbms_lob.trim(l_clob, 1);
        dbms_output.put_line(l_clob);
    end;
    /
        

WRITE

  • 此过程从LOB开头的绝对偏移量开始,将指定数量的数据从缓冲区参数中写入内部LOB。数据从缓冲区参数中写入。

  • WRITE将替换(覆盖)在指定偏移量上已存在的LOB中的任何数据,替换的长度由您指定。

例子

    declare
        l_result        int;
        l_blob          blob := 'abcd'::blob;
        l_clob          clob := 'abcd'::clob;
        l_raw_result    raw;
        l_amout         INTEGER := 100;
        l_text_result  text;
    begin
        dbms_output.serveroutput(true);

        l_blob := 'abcde'::blob;
        dbms_lob.write(l_blob, pg_catalog.length(utl_raw.CAST_TO_RAW('测试')), 2, utl_raw.CAST_TO_RAW('测试'));
        dbms_output.put_line(l_blob::text);

        -- write clob
        l_clob := 'abcde'::clob;
        dbms_lob.write(l_clob, 2, 2,'测试'::text);
        dbms_output.put_line(l_clob);
    end;
    /
        

WRITEAPPEND

  • 此过程将指定数量的数据从缓冲区参数中写入内部LOB的末尾。

例子

    declare
        l_result        int;
        l_blob          blob := 'abcd'::blob;
        l_clob          clob := 'abcd'::clob;
        l_raw_result    raw;
        l_amout         INTEGER := 100;
        l_text_result  text;
    begin
        dbms_output.serveroutput(true);

        -- writeappend blob
        l_blob := 'abcde'::blob;
        dbms_lob.writeappend(l_blob, pg_catalog.length(utl_raw.CAST_TO_RAW('测试')), utl_raw.CAST_TO_RAW('测试'));
        dbms_output.put_line(l_blob::text);

        -- write clob
        l_clob := 'abcde'::clob;
        dbms_lob.writeappend(l_clob, 2,'测试'::text);
        dbms_output.put_line(l_clob);
    end;
    /
        
41.11.6.4.2. 使用示例

下面展示了DBMS_LOB的使用示例。

        CREATE PROCEDURE dbms_lob_exe() AS $$
        DECLARE
          str1 text;
            str2 text;
          pos INTEGER;
            count INTEGER;
        BEGIN
          str2 := dbms_lob.substr('1234567',2,3);
            pos := dbms_lob.instr('Tech on the net', 'e');
            count := dbms_lob.getlength('1234567');
            raise info 'str2=%,pos=%,count=%', str2, pos, count;
        END;
        $$ LANGUAGE plpgsql;
        call dbms_lob_exe();
        DROP PROCEDURE dbms_lob_exe();
        

41.11.6.5. DBMS_OUTPUT

概述

从PL/pgSQL向客户端(如ltsql)发送消息。

特点

Table 41.6. DBMS_OUTPUT 特点

特点描述
ENABLE启用此包的功能。
DISABLE禁用此包的功能。
SERVEROUTPUT控制是否发送消息。
PUT发送消息。
PUT_LINE发送带换行符的消息。
NEW_LINE发送一个换行符。不能带参数,支持两种使用方式:dbms_output.new_line和dbms_output.new_line()。
GET_LINE从消息缓冲区获取一行。
GET_LINES从消息缓冲区检索多行。

语法

41.11.6.5.1. 描述

本节详细说明了DBMS_OUTPUT的每个功能。

ENABLE

  • ENABLE启用PUT、PUT_LINE、NEW_LINE、GET_LINE和GET_LINES的使用。

  • 在多次执行ENABLE时,最后指定的值是缓冲区大小(以字节为单位)。请指定2000到1000000之间的缓冲区大小。

  • 缓冲区大小的默认值为20000。如果将NULL指定为缓冲区大小,则将使用1000000。

  • 如果没有执行ENABLE,则即使执行PUT、PUT_LINE、NEW_LINE、GET_LINE和GET_LINES,它们也会被忽略。

例子

        PERFORM DBMS_OUTPUT.ENABLE(20000);
        

DISABLE

  • DISABLE禁用PUT、PUT_LINE、NEW_LINE、GET_LINE和GET_LINES的使用。

  • 剩余的缓冲区信息将被丢弃。

例子

        PERFORM DBMS_OUTPUT.DISABLE();
        

SERVEROUTPUT

  • SERVEROUTPUT控制是否发送消息。

  • 对于sendMsgs,请指定TRUE或FALSE。

  • 如果指定为TRUE,则在执行PUT、PUT_LINE或NEW_LINE时,将消息发送到客户端(如ltsql),而不是存储在缓冲区中。

  • 如果指定为FALSE,则在执行PUT、PUT_LINE或NEW_LINE时,将消息存储在缓冲区中,而不发送到客户端(如ltsql)。

  • 默认指定为TRUE。

参见

请参阅LightDB文档中的“The SQL Language” > “Data Types” > “Boolean Type”以获取有关布尔类型(TRUE/FALSE)值的信息。

例子

        PERFORM DBMS_OUTPUT.SERVEROUTPUT(TRUE);
        

SET SERVEROUTPUT ON/OFF; 等同于 SELECT DBMS_OUTPUT.SERVEROUTPUT(TRUE/FALSE);。

例子

    lightdb@oracle=# SET SERVEROUTPUT ON;
    serveroutput 
    --------------
    
    (1 row)

    lightdb@oracle=# SELECT  DBMS_OUTPUT.PUT_LINE('my serveroutput');
    my serveroutput
    put_line 
    ----------
    
    (1 row)

    lightdb@oracle=# SET SERVEROUTPUT OFF;
    serveroutput 
    --------------
    
    (1 row)

    lightdb@oracle=#  SELECT  DBMS_OUTPUT.PUT_LINE('my serveroutput');
    put_line 
    ----------
    
    (1 row)

    lightdb@oracle=# 
        

PUT

  • PUT设置要发送的消息。

  • 字符串是要发送的消息。

  • 当为SERVEROUTPUT指定TRUE时,消息将发送到客户端,例如ltsql。

  • 当SERVEROUTPUT指定为FALSE时,消息将保留在缓冲区中。

  • PUT不会附加换行符。要附加换行符,请执行NEW_LINE。

  • 如果发送的字符串长度超过了在ENABLE中指定的缓冲区大小,则会发生错误。

示例

        PERFORM DBMS_OUTPUT.PUT('abc');
        

PUT_LINE

  • PUT_LINE将要发送的信息设置为末尾加上一个换行符。

  • 字符串是要发送的信息。

  • 当在SERVEROUTPUT中指定TRUE时,消息将被发送给客户端,如ltsql。

  • 当在SERVEROUTPUT中指定FALSE时,消息将被保留在缓冲区中。

  • 如果发送的字符串长度超过了ENABLE中指定的缓冲区大小,就会发生错误。

  • 支持输出时间类型: date 类型,interval 类型, timestamp without timezone类型, oracle.date类型输出, 时间格式受参数 nls_date_format 的影响。

示例

        PERFORM DBMS_OUTPUT.PUT_LINE('abc');
        

NEW_LINE

  • NEW_LINE在使用PUT创建消息时在末尾添加一个换行符。

  • 当在SERVEROUTPUT中指定TRUE时,消息将被发送给客户端,如ltsql。

  • 当在SERVEROUTPUT中指定FALSE时,消息将被保留在缓冲区中。

示例

        PERFORM DBMS_OUTPUT.NEW_LINE();
        

GET_LINE

  • GET_LINE从消息缓冲区中检索一行。

  • 使用SELECT语句获取检索到的行和操作返回的状态码,它们存储在line和status列中。

  • line列存储从缓冲区检索到的行。line的数据类型为TEXT。

  • status列存储操作返回的状态码:0-成功完成;1-因缓冲区中没有更多行而失败。status的数据类型为INTEGER。

  • 如果执行GET_LINE或GET_LINES,然后执行PUT、PUT_LINE或PUT_LINES,而缓冲区中仍存在未检索的消息,则未从缓冲区检索到的消息将被丢弃。

示例

        DECLARE
            buff1   VARCHAR(20);
            stts1   INTEGER;
        BEGIN
            SELECT line,status INTO buff1,stts1 FROM DBMS_OUTPUT.GET_LINE();
        

GET_LINES

  • GET_LINES从消息缓冲区中检索多行信息。

  • 指定从缓冲区中检索的行数。

  • 使用SELECT语句获取检索到的行和行数,它们存储在lines和numlines列中。

  • lines列存储从缓冲区检索到的行。lines的数据类型为TEXT。

  • numlines列存储从缓冲区检索到的行数。如果此数字小于所请求的行数,则缓冲区中没有更多行。numlines的数据类型为INTEGER。

  • 如果执行GET_LINE或GET_LINES,然后执行PUT、PUT_LINE或NEW_LINE,而缓冲区中仍存在未检索的消息,则未从缓冲区检索到的消息将被丢弃。

示例

        DECLARE
            buff    VARCHAR(20)[10];
            stts    INTEGER := 10;
        BEGIN
            SELECT lines, numlines INTO buff,stts FROM DBMS_OUTPUT.GET_LINES(stts);
        
41.11.6.5.2. 使用示例

下面是DBMS_OUTPUT的一个使用示例。

        CREATE FUNCTION dbms_output_exe() RETURNS VOID AS $$
        DECLARE
          buff1 VARCHAR(20);
          buff2 VARCHAR(20);
          stts1 INTEGER;
          stts2 INTEGER;
        BEGIN
          PERFORM DBMS_OUTPUT.DISABLE();
          PERFORM DBMS_OUTPUT.ENABLE();
          PERFORM DBMS_OUTPUT.SERVEROUTPUT(FALSE);
          PERFORM DBMS_OUTPUT.PUT('DBMS_OUTPUT TEST 1');
          PERFORM DBMS_OUTPUT.NEW_LINE();
          PERFORM DBMS_OUTPUT.PUT_LINE('DBMS_OUTPUT TEST 2');
          SELECT line,status INTO buff1,stts1 FROM DBMS_OUTPUT.GET_LINE();
          SELECT line,status INTO buff2,stts2 FROM DBMS_OUTPUT.GET_LINE();
          PERFORM DBMS_OUTPUT.SERVEROUTPUT(TRUE);
          PERFORM DBMS_OUTPUT.PUT_LINE(buff1);
          PERFORM DBMS_OUTPUT.PUT_LINE(buff2);
        END;
        $$ LANGUAGE plpgsql;
        SELECT dbms_output_exe();
        DROP FUNCTION dbms_output_exe();
        

41.11.6.6. DBMS_PIPE

概述

在执行PL / pgSQL的会话之间进行通信。

该包可用于1:1通信,例如在执行PL/pgSQL的会话之间交换数据时。

对于管道,有显式管道和隐式管道,并且对于显式管道,您可以选择公共管道和私有管道。每种类型的特征如下:

管道类型

Table 41.7. 管道类型

类型特点
显式管道

- 使用 CREATE_PIPE 显式地创建一个管道。

- 在创建管道时,可以选择公共管道和私有管道。

- 必须使用 REMOVE_PIPE 显式地删除一个管道。

隐式管道

- 在使用 SEND_MESSAGE 和 RECEIVE_MESSAGE 时自动创建。

- 创建的管道成为公共管道。

- 当使用 RECEIVE_MESSAGE 接收消息时,如果管道中没有其他消息剩余,管道将被自动删除。

公共管道

- 可以作为显式管道或隐式管道创建。

- 也可以被除创建者以外的用户使用。

私有管道

- 只能作为显式管道创建。

- 只能被其创建者使用。


注意

  • 单个实例最多可同时使用50个管道。

  • 在频繁创建和删除管道的情况下,请使用公共管道。 如果创建私有管道,即使在管道被删除后,内部信息(私有管道的创建者)仍将保留。 因此,反复创建和删除管道可能会导致内存耗尽。

  • 当通过 RECEIVE_MESSAGE 创建隐式管道时,在未收到消息的情况下发生超时,管道不会被移除。

特点

Table 41.8. DBMS_PIPE 特点

特点描述
CREATE_PIPE创建公共或私有管道。
NEXT_ITEM_TYPE确定本地缓冲区中下一个项目的数据类型,并返回该类型。
PACK_MESSAGE在本地缓冲区中设置一个消息。
PURGE清空指定管道的内容。
RECEIVE_MESSAGE在本地缓冲区设置接收到的消息。
REMOVE_PIPE移除指定的管道。
RESET_BUFFER重置本地缓冲区的设置位置。
SEND_MESSAGE发送本地缓冲区的内容。
UNIQUE_SESSION_NAME返回一个唯一的会话名称。
UNPACK_MESSAGE_BYTEA在本地缓冲区中以 BYTEA 类型接收一个消息。
UNPACK_MESSAGE_DATE在本地缓冲区中以 DATE 类型接收一个消息。
UNPACK_MESSAGE_NUMBER在本地缓冲区中以 NUMERIC 类型接收一个消息。
UNPACK_MESSAGE_RECORD在本地缓冲区中以 RECORD 类型接收一个消息。
UNPACK_MESSAGE_TEXT在本地缓冲区中以 TEXT 类型接收一个消息。
UNPACK_MESSAGE_TIMESTAMP在本地缓冲区中以 TIMESTAMP 类型接收一个消息。

语法

41.11.6.6.1. 特点描述

本节将解释 DBMS_PIPE 的每个特点。

CREATE_PIPE

  • CREATE_PIPE explicitly creates a pipe environment for data communication.

  • 指定要创建的管道的名称。

  • 管道名称区分大小写。

  • 指定可以发送或接收的最大消息数。如果省略,则使用 0(无法发送消息)。指定从 1 到 32767。

  • 对于 private,指定 TRUE 或 FALSE。如果指定为 TRUE,则创建私有管道。如果指定为 FALSE,则创建公共管道。默认值为 FALSE。

  • 如果已经创建了同名管道,则会发生错误。

参见

有关布尔类型(TRUE/FALSE)的信息,请参阅 LightDB 文档中的 "The SQL Language" > "Data Types" > "Boolean Type"。

示例

        PERFORM DBMS_PIPE.CREATE_PIPE('P01', 100, FALSE);
        

NEXT_ITEM_TYPE

  • NEXT_ITEM_TYPE 返回本地缓冲区中的下一个数据类型。

  • 返回值的数据类型为INTEGER。返回以下值之一:

Table 41.9. NEXT_ITEM_TYPE返回的值

返回值数据类型
9NUMERIC类型
11TEXT类型
12DATE类型
13TIMESTAMP类型
23BYTEA类型
24RECORD类型
0缓冲区中没有数据

示例

        DECLARE
            i_iType    INTEGER;
        BEGIN
            i_iType := DBMS_PIPE.NEXT_ITEM_TYPE();
        

PACK_MESSAGE

  • PACK_MESSAGE将指定的消息设置到本地缓冲区中。

  • 指定要设置到本地缓冲区中的数据。可以使用以下数据类型:

    • 字符类型 (*1)

    • 整数类型 (*2)

    • NUMERIC类型

    • DATE类型

    • TIMESTAMP类型 (*3)

    • BYTEA类型

    • RECORD类型

*1:字符类型在内部转换为TEXT类型。

*2:整数类型在内部转换为NUMERIC类型。

*3:TIMESTAMP类型在内部转换为带时区的TIMESTAMP类型。

  • 每次调用PACK_MESSAGE时,都会向本地缓冲区添加一个新消息。

  • 本地缓冲区的大小约为8KB。但是,每个消息都有开销,因此实际可以存储的总大小小于8KB。要清除本地缓冲区,请发送消息(SEND_MESSAGE)或将缓冲区(RESET_BUFFER)重置为其初始状态。

示例

        PERFORM DBMS_PIPE.PACK_MESSAGE('Message Test001');
        

PURGE

  • PURGE将管道中的消息删除。

  • 指定要删除其消息的管道的名称。

  • 管道名称区分大小写。

示例

        PERFORM DBMS_PIPE.PURGE('P01');
        

注意

执行PURGE操作时,本地缓冲区将用于删除管道中的消息。因此,如果管道中仍有任何消息,本地缓冲区将被PURGE覆盖。

RECEIVE_MESSAGE

  • RECEIVE_MESSAGE接收指定管道中存在的消息,并将这些消息设置在本地缓冲区中。

  • 消息按照发送到管道的单位进行接收,由SEND_MESSAGE发送。接收到的消息在设置到本地缓冲区之后会从管道中删除。

  • 指定要接收消息的管道名称。

  • 管道名称区分大小写。

  • 指定等待消息的最大等待时间timeout(单位:秒)。如果省略,则默认为31536000秒(1年)。

  • 返回值的数据类型为INTEGER。如果成功接收到消息,返回值为0。如果超时,则返回1。

示例

        DECLARE
            i_Ret    INTEGER;
        BEGIN
            i_Ret := DBMS_PIPE.RECEIVE_MESSAGE('P01', 60);
        

REMOVE_PIPE

  • REMOVE_PIPE将删除指定的管道。

  • 指定要删除的管道的名称。

  • 管道名称区分大小写。

示例

        PERFORM DBMS_PIPE.REMOVE_PIPE('P01');
        

RESET_BUFFER

  • RESET_BUFFER重置了本地缓冲区的设置位置。使用此操作可以丢弃本地缓冲区中剩余的任何不必要的数据。

示例

        PERFORM DBMS_PIPE.RESET_BUFFER();
        

SEND_MESSAGE

  • SEND_MESSAGE将本地缓冲区中存储的数据发送到指定的管道。

  • 指定数据要发送到的管道的名称。

  • 管道名称区分大小写。

  • 请指定以秒为单位的发送数据的最大等待时间超时时间。如果省略,则默认为31536000秒(1年)。

  • 请指定可以发送或接收的最大消息数。如果省略,则使用CREATE_PIPE中设置的最大消息数。如果在隐式管道中省略,则消息数将不受限制。可以指定1到32767之间的数字。

  • 如果在SEND_MESSAGE和CREATE_PIPE中都指定了最大消息数,则将使用较大的值。

  • 返回值的数据类型为INTEGER。如果成功接收到一条消息,则返回0。如果发生超时,则返回1。

示例

        DECLARE
            i_Ret    INTEGER;
        BEGIN
            i_Ret := DBMS_PIPE.SEND_MESSAGE('P01', 10, 20);
        

注意

如果达到最大消息数或正在发送的消息太大,则在发送过程中会发生超时。如果发生超时,请使用RECEIVE_MESSAGE接收管道中的任何消息。

UNIQUE_SESSION_NAME

  • UNIQUE_SESSION_NAME返回一个在所有会话中都唯一的名称。该名称可用作管道名称。

  • 同一会话的多个调用始终返回相同的名称。

  • 返回值的数据类型为VARCHAR。返回一个长度最多为30个字符的字符串。

示例

        DECLARE
            p_Name   VARCHAR(30);
        BEGIN
            p_Name := DBMS_PIPE.UNIQUE_SESSION_NAME();
        

UNPACK_MESSAGE_BYTEA

  • NPACK_MESSAGE_BYTEA在本地缓冲区中接收BTYEA类型的消息。

  • 通过PACK_MESSAGE在本地缓冲区中设置单位来接收消息。接收到的消息将从本地缓冲区中移除。

  • 返回值的数据类型是BYTEA。

  • 如果本地缓冲区中没有消息,则返回NULL值。

  • 对于数据类型,必须与PACK_MESSAGE设置的数据类型对齐。如果数据类型不同,则会出现以下错误。

        ERROR:  datatype mismatch
        DETAIL:  unpack unexpected type: xx
        

示例

        DECLARE
            g_Bytea   BYTEA;
        BEGIN
            g_Bytea := DBMS_PIPE.UNPACK_MESSAGE_BYTEA();
        

UNPACK_MESSAGE_DATE

  • UNPACK_MESSAGE_DATE在本地缓冲区中接收DATE类型的消息。

  • 通过PACK_MESSAGE在本地缓冲区中设置单位来接收消息。接收到的消息将从本地缓冲区中移除。

  • 返回值的数据类型是DATE。

  • 如果本地缓冲区中没有消息,则返回NULL值。

  • 对于数据类型,必须与PACK_MESSAGE设置的数据类型对齐。如果数据类型不同,则会出现以下错误。

        ERROR:  datatype mismatch
        DETAIL:  unpack unexpected type: xx
        

示例

        DECLARE
            g_Date   DATE;
        BEGIN
            g_Date := DBMS_PIPE.UNPACK_MESSAGE_DATE();
        

注意

如果在search_path中设置了“oracle”模式,则将使用orafce的DATE类型,因此接收数据时请使用UNPACK_MESSAGE_TIMESTAMP。UNPACK_MESSAGE_DATE是LightDB DATE类型的接口。

UNPACK_MESSAGE_NUMBER

  • UNPACK_MESSAGE_NUMBER在本地缓冲区中接收NUMERIC类型的消息。

  • 通过PACK_MESSAGE在本地缓冲区中设置单位来接收消息。接收到的消息将从本地缓冲区中移除。

  • 返回值的数据类型是NUMERIC。

  • 如果本地缓冲区中没有消息,则返回NULL值。

  • 对于数据类型,必须与PACK_MESSAGE设置的数据类型对齐。如果数据类型不同,则会出现以下错误。

        ERROR:  datatype mismatch
        DETAIL:  unpack unexpected type: xx
        

示例

        DECLARE
            g_Number   NUMERIC;
        BEGIN
            g_Number := DBMS_PIPE.UNPACK_MESSAGE_NUMBER();
        

UNPACK_MESSAGE_RECORD

  • UNPACK_MESSAGE_RECORD 接收本地缓冲区中的 RECORD 类型消息。

  • 消息由 PACK_MESSAGE 在本地缓冲区中按照设定的单元接收。接收到的消息将从本地缓冲区中移除。

  • 返回值的数据类型是 RECORD

  • 如果本地缓冲区中没有消息,则返回 NULL 值。

  • 对于数据类型,需要与 PACK_MESSAGE 设置的数据类型保持一致。如果数据类型不同,则会出现以下错误:

        ERROR:  datatype mismatch
        DETAIL:  unpack unexpected type: xx
        

示例

        DECLARE
            msg1     TEXT;
            status   NUMERIC;
        BEGIN
            SELECT col1, col2 INTO msg1, status FROM DBMS_PIPE.UNPACK_MESSAGE_RECORD();
        

UNPACK_MESSAGE_TEXT

  • UNPACK_MESSAGE_TEXT 接收本地缓冲区中的 TEXT 类型消息。

  • 消息由 PACK_MESSAGE 在本地缓冲区中按照设定的单元接收。接收到的消息将从本地缓冲区中移除。

  • 返回值的数据类型是 TEXT

  • 如果本地缓冲区中没有消息,则返回 NULL 值。

  • 对于数据类型,需要与 PACK_MESSAGE 设置的数据类型保持一致。如果数据类型不同,则会出现以下错误。

        ERROR:  datatype mismatch
        DETAIL:  unpack unexpected type: xx
        

示例

        DECLARE
            g_Text   TEXT;
        BEGIN
            g_Text := DBMS_PIPE.UNPACK_MESSAGE_TEXT();
        

UNPACK_MESSAGE_TIMESTAMP

  • UNPACK_MESSAGE_TIMESTAMP 接收本地缓冲区中的 TIMESTAMP WITH TIME ZONE 类型消息。

  • 消息由 PACK_MESSAGE 在本地缓冲区中按照设定的单元接收。接收到的消息将从本地缓冲区中移除。

  • 返回值的数据类型是 TIMESTAMP WITH TIME ZONE

  • 如果本地缓冲区中没有消息,则返回 NULL 值。

  • 对于数据类型,需要与 PACK_MESSAGE 设置的数据类型保持一致。如果数据类型不同,则会出现以下错误。

        ERROR:  datatype mismatch
        DETAIL:  unpack unexpected type: xx
        

示例

        DECLARE
            g_Timestamptz   TIMESTAMP WITH TIME ZONE;
        BEGIN
            g_Timestamptz := DBMS_PIPE.UNPACK_MESSAGE_TIMESTAMP();
        
41.11.6.6.2. 使用示例

下面是使用 DBMS_PIPE 处理流程的示例:

DBMS_PIPE 的流程

注意

  • 当使用 CREATE_PIPE 明确创建管道时,确保使用 REMOVE_PIPE 命令删除管道。如果未明确删除管道,则一旦创建,它将一直存在,直到实例停止。

  • 在流程图中,创建管道和删除管道是在接收方描述的,但是,这些也可以在发送方执行。为了保持一致性,建议在一个方向上创建和删除管道。

  • 如果同名管道已经存在,CREATE_PIPE 将会出现错误。 隐式创建的管道也可以成为 SEND_MESSAGE 和 RECEIVE_MESSAGE 的目标,因此在执行 CREATE_PIPE 时,确保不要先调用 SEND_MESSAGE 和 RECEIVE_MESSAGE。

  • DBMS_ALERT 和 DBMS_PIPE 使用相同的内存环境。因此,当检测到 DBMS_ALERT 的内存不足时,也可能会检测到 DBMS_PIPE 的内存不足。

信息

正在使用中的管道信息可以在DBMS_PIPE.DB_PIPES视图中查看。

        SELECT * from dbms_pipe.db_pipes;
          name | items | size | limit | private | owner
        ------+-------+------+-------+---------+-------
          P01  |     1 |   18 |   100 | f       |
        (1 row)
        

使用示例

  • 发送方

        CREATE FUNCTION send_dbms_pipe_exe(IN pipe_mess text) RETURNS void AS $$
        DECLARE
          pipe_name text := 'sample_pipe';
          pipe_time timestamp := current_timestamp;
          pipe_stat int;
        BEGIN
          PERFORM DBMS_PIPE.RESET_BUFFER();
          PERFORM DBMS_PIPE.PACK_MESSAGE(pipe_mess);
          PERFORM DBMS_PIPE.PACK_MESSAGE(pipe_time);
          pipe_stat := DBMS_PIPE.SEND_MESSAGE(pipe_name);
          RAISE NOTICE 'PIPE_NAME: % SEND Return Value =%', pipe_name, pipe_stat;
        END;
        $$ LANGUAGE plpgsql;

        SELECT send_dbms_pipe_exe('Sample Message.');
        DROP FUNCTION send_dbms_pipe_exe(text);
        
  • 接收方

        CREATE FUNCTION receive_dbms_pipe_exe() RETURNS void AS $$
        DECLARE
          pipe_name text := 'sample_pipe';
          pipe_text text;
          pipe_nume numeric;
          pipe_date date;
          pipe_time timestamp with time zone;
          pipe_byte bytea;
          pipe_reco record;
          pipe_item int;
          pipe_stat int;
        BEGIN
          pipe_stat := DBMS_PIPE.RECEIVE_MESSAGE(pipe_name,300);
          RAISE NOTICE 'Return Value = %', pipe_stat;
            LOOP
            pipe_item := DBMS_PIPE.NEXT_ITEM_TYPE();
            RAISE NOTICE 'Next Item : %', pipe_item;
            IF (pipe_item = 9) THEN
                pipe_nume := DBMS_PIPE.UNPACK_MESSAGE_NUMBER();
                RAISE NOTICE 'Get Message : %' ,pipe_nume;
            ELSIF (pipe_item =11) THEN
                pipe_text := DBMS_PIPE.UNPACK_MESSAGE_TEXT();
                RAISE NOTICE 'Get Message : %' ,pipe_text;
            ELSIF (pipe_item = 12) THEN
                pipe_date := DBMS_PIPE.UNPACK_MESSAGE_DATE();
                RAISE NOTICE 'Get Message : %' ,pipe_date;
            ELSIF (pipe_item = 13) THEN
                pipe_time := DBMS_PIPE.UNPACK_MESSAGE_TIMESTAMP();
                RAISE NOTICE 'Get Message : %' ,pipe_time;
            ELSIF (pipe_item = 23) THEN
                pipe_byte := DBMS_PIPE.UNPACK_MESSAGE_BYTEA();
                RAISE NOTICE 'Get Message : %' ,pipe_byte;
            ELSIF (pipe_item = 24) THEN
                pipe_reco := DBMS_PIPE.UNPACK_MESSAGE_RECORD();
                RAISE NOTICE 'Get Message : %' ,pipe_reco;
            ELSE
                EXIT;
            END IF;
            END LOOP;
            PERFORM DBMS_PIPE.REMOVE_PIPE(pipe_name);
        END;
        $$ LANGUAGE plpgsql;

        SELECT receive_dbms_pipe_exe();
        DROP FUNCTION receive_dbms_pipe_exe();
        

41.11.6.7. DBMS_RANDOM

概述

生成在PL/pgSQL中的随机数。

Table 41.10. DBMS_RANDOM功能

功能描述
INITIALIZE初始化生成随机数。
NORMAL返回正态分布的随机数。
RANDOM生成随机数。
SEED重置种子值。
STRING生成一个随机字符串。
TERMINATE终止随机数生成。
VALUE生成一个介于0和1之间的随机十进制数,或介于指定值之间的随机十进制数。

语法

41.11.6.7.1. 功能说明

本节介绍DBMS_RANDOM的每个功能。

INITIALIZE

  • INITIALIZE使用指定的种子值初始化随机数生成。

  • 对于seedVal,请指定SMALLINT或INTEGER类型。

示例

        PERFORM DBMS_RANDOM.INITIALIZE(999);
        

NORMAL

  • NORMAL生成并返回一个正态分布的随机数。

  • 返回值类型为DOUBLE PRECISION。

示例

        DECLARE
            d_RunNum   DOUBLE PRECISION;
        BEGIN
            d_RunNum := DBMS_RANDOM.NORMAL();
        

RANDOM

  • RANDOM生成并返回一个随机数。

  • 返回值的数据类型为INTEGER。

示例

        DECLARE
            d_RunInt   INTEGER;
        BEGIN
            d_RunInt := DBMS_RANDOM.RANDOM();
        

SEED

  • SEED使用指定的种子值或种子字符串初始化随机数生成。

  • 对于seedVal,请指定SMALLINT或INTEGER类型。

  • 种子字符串可以指定为任何字符串。

示例

        PERFORM DBMS_RANDOM.SEED('123');
        

STRING

  • STRING根据指定的显示格式和字符串长度生成并返回一个随机字符串。

  • 对于显示格式fmt,请指定以下任何值。如果指定了其他任何值,则会出现错误。

Table 41.11. 可指定的显示格式值

设置值生成的字符串
'u', 'U'仅大写字母
'l', 'L'仅小写字母
'a', 'A'大写字母和小写字母的混合
'x', 'X'大写字母和数字
'p', 'P'任何可显示字符

  • 指定要生成的字符串的长度。请指定SMALLINT或INTEGER类型。

  • 返回值的数据类型为TEXT。

示例

        DECLARE
            d_RunStr   TEXT;
        BEGIN
            d_RunStr := DBMS_RANDOM.STRING('a', 20);
        

TERMINATE

  • 调用TERMINATE以终止随机数生成。

信息

TERMINATE不执行任何操作,但已包含以与Oracle数据库兼容。

示例

        PERFORM DBMS_RANDOM.TERMINATE();
        

VALUE

  • VALUE生成并返回指定范围内的随机数。

  • 对于minmax, 请指定数字数据类型。将生成介于最小值和最大值之间(包括最小值和最大值)的随机数。

  • 如果省略了最小值和最大值,则将生成介于0和1之间的随机十进制数。

  • 返回值的数据类型为DOUBLE PRECISION。

示例

        DECLARE
            d_RunDbl   DOUBLE PRECISION;
        BEGIN
            d_RunDbl := DBMS_RANDOM.VALUE();
        
41.11.6.7.2. 使用示例

下面是DBMS_RANDOM的使用示例。

        CREATE FUNCTION dbms_random_exe() RETURNS VOID AS $$
        DECLARE
            w_rkey VARCHAR(10) := 'rnd111';
            i_rkey INTEGER := 97310;
        BEGIN
            PERFORM DBMS_RANDOM.INITIALIZE(i_rkey);
            RAISE NOTICE 'RANDOM -> NORMAL : %', DBMS_RANDOM.NORMAL();
            RAISE NOTICE 'RANDOM -> RANDOM : %', DBMS_RANDOM.RANDOM();
            RAISE NOTICE 'RANDOM -> STRING : %', DBMS_RANDOM.STRING('a',10);
            RAISE NOTICE 'RANDOM -> VALUE  : %', DBMS_RANDOM.VALUE();
            PERFORM DBMS_RANDOM.SEED(w_rkey);
            RAISE NOTICE 'RANDOM -> NORMAL : %', DBMS_RANDOM.NORMAL();
            RAISE NOTICE 'RANDOM -> RANDOM : %', DBMS_RANDOM.RANDOM();
            RAISE NOTICE 'RANDOM -> STRING : %', DBMS_RANDOM.STRING('p',10);
            RAISE NOTICE 'RANDOM -> VALUE  : %', DBMS_RANDOM.VALUE(1,100);
            PERFORM DBMS_RANDOM.TERMINATE();
        END;
        $$ LANGUAGE plpgsql;
        SELECT dbms_random_exe();
        DROP FUNCTION dbms_random_exe();
        

41.11.6.8. DBMS_UTILITY

概述

提供PL/pgSQL的实用工具。

Table 41.12. DBMS_UTILITY功能

功能描述
FORMAT_CALL_STACK返回当前调用堆栈。
GET_HASH_VALUE基于输入字符串的哈希值。
CANONICALIZE将给定字符串进行规范化。
COMMA_TO_TABLE将以逗号分隔的名称列表转换为PL/SQL名称表。
TABLE_TO_COMMA将PL/SQL名称表转换为以逗号分隔的名称列表。
DB_VERSION返回数据库的版本信息。
EXEC_DDL_STATEMENT在parse_string中执行DDL语句。
GET_TIME以百分之一秒为单位查找当前时间。

语法

        FORMAT_CALL_STACK(fmt text);
        FORMAT_CALL_STACK();
        GET_HASH_VALUE(name VARCHAR2,base INTEGER,hash_size INTEGER)
        CANONICALIZE(name TEXT,canon_name TEXT,canon_len INT4)
        COMMA_TO_TABLE(list TEXT,tablen INT4,tab TEXT[])
        TABLE_TO_COMMA(tab TEXT[],tablen INT4,list TEXT)
        DB_VERSION(version TEXT,compatibility TEXT)
        EXEC_DDL_STATEMENT(parse_string TEXT)
      
41.11.6.8.1. 功能描述

本节介绍了DBMS_UTILITY的每个功能。

FORMAT_CALL_STACK

  • FORMAT_CALL_STACK返回PL/pgSQL的当前调用堆栈。

  • 对于显示格式fmt,请指定以下任何值。如果指定了其他任何值,则会出现错误。

Table 41.13. 可指定的显示格式值

设置值显示的内容
'o'标准格式的调用堆栈显示(带标题)
's'标准格式的调用堆栈显示(不带标题)
'p'逗号分隔的调用堆栈显示(不带标题)

  • 如果省略了显示格式,则使用显示格式“o”。

  • 返回值的数据类型为TEXT。

示例

        DECLARE
            s_StackTrace   TEXT
        BEGIN
            s_StackTrace := DBMS_UTILITY.FORMAT_CALL_STACK();
        

注意

如果指定了英语以外的语言环境作为消息语言环境,则可能无法正确检索调用堆栈结果。为了正确检索调用堆栈结果,请将英语指定为消息语言环境。

GET_HASH_VALUE

  • 基于输入字符串的哈希值,哈希值应在base和base + hash_size -1之间。

示例

        PERFORM DBMS_UTILITY.GET_HASH_VALUE('abcdef',0,10000);
        

CANONICALIZE

  • 此过程处理单个保留字或关键字(例如“table”),并为单个标识符删除空格,以便'table'变成TABLE。

示例

    declare
        l_result        text := '';
    begin
        dbms_output.serveroutput(True);
        dbms_utility.canonicalize('taBle', l_result, 100);
        dbms_output.put_line(l_result);
    end;
    /
        

COMMA_TO_TABLE

  • 这些过程将以逗号分隔的名称列表转换为PL/SQL名称表。

  • 列表必须是非空的逗号分隔列表:除逗号分隔列表之外的任何内容都会被拒绝。双引号内的逗号不算。

示例

    declare
        tablen          int4;
        tab             text[];
    begin
        dbms_output.serveroutput(True);
        dbms_utility.comma_to_table('table, "Table","Table,122324" , Tablesd', tablen, tab);
        dbms_output.put_line(tablen);
        dbms_output.put_line(array_to_string(tab,','));
    end;
    /
        

TABLE_TO_COMMA

  • 此过程将PL/SQL名称表转换为逗号分隔的名称列表。

示例

    declare
        tablen          int4;
        l_str             text;
    begin
        dbms_output.serveroutput(True);

        dbms_utility.table_to_comma('{table," \"table\"","\"table.1234567890\" "," tablezx",NULL}'::text[], tablen, l_str);
        dbms_output.put_line(tablen);
        dbms_output.put_line(l_str);

    end;
    /
        

DB_VERSION

  • 此过程返回数据库的版本信息。

示例

    declare
        lt_version        text;
        compatibility     text;
    begin
        dbms_output.serveroutput(True);
        dbms_utility.db_version(lt_version, compatibility);
        dbms_output.put_line(lt_version);
        dbms_output.put_line(oracle.nvl(compatibility,'NULL'));
    end;
    /
        

EXEC_DDL_STATEMENT

  • 此过程在parse_string中执行DDL语句。

示例

    declare
        l_result        text := '';
    begin
        dbms_output.serveroutput(True);
        dbms_utility.exec_ddl_statement('create table if not exists public.test_exec_ddl_stmt (id int, name text);');
    end;
    /
        

GET_TIME

  • 此函数返回当前时间的百分之一秒。两次调用返回时间之间的差异可测量两个时间点之间经过的总时间(不仅仅是CPU处理时间)

示例

        DO $$
        DECLARE
            start_time integer;
            end_time integer;
        BEGIN
            start_time := DBMS_UTILITY.GET_TIME();
            PERFORM pg_sleep(2);
            end_time := DBMS_UTILITY.GET_TIME();
            -- clamp long runtime on slow build machines to the 2s the testsuite is expecting
            IF end_time BETWEEN start_time + 300 AND start_time + 1000 THEN end_time := start_time + 250; END IF;
                RAISE NOTICE 'Execution time: % seconds', trunc((end_time - start_time)::numeric/100);
            END
        $$;
        
41.11.6.8.2. 使用示例

下面是DBMS_UTILITY的一个使用示例。

    CREATE FUNCTION dbms_utility1_exe() RETURNS VOID AS $$
    DECLARE
        s_StackTrace TEXT;
        v_hashvalue  numeric(38,0);
    BEGIN
        s_StackTrace := DBMS_UTILITY.FORMAT_CALL_STACK();
        RAISE NOTICE '%', s_StackTrace;
        v_hashvalue := DBMS_UTILITY.GET_HASH_VALUE('abcdef',0,10000);
        RAISE NOTICE 'v_hashvalue=%', v_hashvalue;
    END;
    $$ LANGUAGE plpgsql;

    CREATE FUNCTION dbms_utility2_exe() RETURNS VOID AS $$
    BEGIN
        PERFORM dbms_utility1_exe();
    END;
    $$ LANGUAGE plpgsql;

    SELECT dbms_utility2_exe();
    DROP FUNCTION dbms_utility2_exe();
    DROP FUNCTION dbms_utility1_exe();

    declare
        l_result        text := '';
    begin
        dbms_output.serveroutput(True);
        dbms_utility.exec_ddl_statement('create table if not exists public.test_exec_ddl_stmt (id int, name text);');
        l_result := dbms_metadata.get_ddl('table', 'test_exec_ddl_stmt');
        dbms_output.put_line(l_result);
        dbms_utility.exec_ddl_statement(' truncate table public.test_exec_ddl_stmt');
        dbms_output.put_line('truncate SUCCESS');
        dbms_utility.exec_ddl_statement('drop table if exists public.test_exec_ddl_stmt ; ');
        dbms_output.put_line('drop SUCCESS');
    end;
    /
        

41.11.6.9. DBMS_JOB

概述

在lt_cron中安排和管理作业。

Table 41.14. DBMS_JOB功能

功能描述
BROKEN禁用作业执行。(无效)
CHANGE更改与作业关联的任何用户定义参数。
INSTANCE将作业分配给实例运行。(无效)
INTERVAL更改指定作业的执行间隔。
NEXT_DATE更改指定作业的下一个执行时间。(无效)
REMOVE从作业队列中删除指定的作业。
RUN强制指定的作业运行。(无效)
SUBMIT向作业队列提交新作业。
USER_EXPORT为导出重新创建一个给定的作业。
WHAT更改指定作业的作业描述。

语法

        CHANGE(job INT8,what TEXT,next_date TIMESTAMP,interval TEXT,instance INT4 default null,force BOOL default 'false')
        INTERVAL(job INT8,interval TEXT)
        REMOVE(job INT8)
        SUBMIT(job INT8,what TEXT,next_date TIMESTAMP default sysdate,interval TEXT default 'null',no_parse BOOL default 'false',instance INT4 default null,force BOOL default 'false')
        USER_EXPORT(job INT8,mycall TEXT)
        WHAT(job INT8,what TEXT)
      
41.11.6.9.1. 功能描述

本节解释了dbms_job的每个功能。

CHANGE

  • 此过程更改用户可以在作业中设置的任何字段。

示例

    dbms_job.change(l_job_id, 'select 3', sysdate, '0 11 * * *');
        

INTERVAL

  • 此过程更改作业运行的频率。

  • interval参数格式是lt_cron的格式。

示例

    dbms_job.interval(l_job_id, '0 11 * * *');
        

REMOVE

  • 此过程从作业队列中删除现有作业。

示例

    dbms_job.remove(2);
        

SUBMIT

  • 此过程提交新作业。

  • 此过程提交的作业将没有名称。 建议使用“select cron.Schedule(name,xxx)”提交。

示例

    dbms_job.submit(l_job_id, 'select 1',sysdate, '0 10 * * *');
        

USER_EXPORT

  • 生成重新创建给定作业的调用文本。

示例

    dbms_job.user_export(2, l_result);
        

WHAT

  • 此过程更改现有作业的操作。

示例

        dbms_job.what(2, 'select 2');
        
41.11.6.9.2. 使用示例

下面是DBMS_JOB的一个使用示例。

    declare
        l_job_id   int8;
        l_result        text := '';
    begin
        dbms_output.serveroutput(true);

        -- use dbms_job.submit will not have jobname
        dbms_job.submit(l_job_id, 'select 1',sysdate, '0 10 * * *');
        dbms_output.put_line('submit job, job id:'||l_job_id);

        dbms_job.user_export(l_job_id, l_result);
        dbms_output.put_line('user_export(job id'||l_job_id||'):'||l_result);

        -- update can't be used for job without name
        dbms_job.what(l_job_id, 'select 2');
        dbms_job.user_export(l_job_id, l_result);
        dbms_output.put_line('after dbms_job.what user_export(job id:'||l_job_id||'):'||l_result);

        dbms_job.interval(l_job_id, '0 11 * * *');
        dbms_job.user_export(l_job_id, l_result);
        dbms_output.put_line('after dbms_job.interval user_export(job id:'||l_job_id||'):'||l_result);

        dbms_job.change(l_job_id, 'select 3', sysdate, '0 11 * * *');
        dbms_job.user_export(l_job_id, l_result);
        dbms_output.put_line('after dbms_job.change user_export(job id:'||l_job_id||'):'||l_result);


        dbms_job.next_date(l_job_id, sysdate);
        dbms_job.broken(l_job_id, True);
        dbms_job.instance(l_job_id, 10);
        dbms_job.run(l_job_id);

        dbms_job.remove(l_job_id);

    end;
    /
        

41.11.6.10. DBMS_LOCK

概述

提供锁管理服务的接口。

Table 41.15. DBMS_LOCK功能

功能描述
sleep将一个会话置于休眠状态,等待特定时间。

语法

        SLEEP(pi_seconds FLOAT8)
      
41.11.6.10.1. 功能描述

本节解释了dbms_job的每个功能。

SLEEP

  • 此过程将暂停会话一段指定的时间。

  • 暂停会话的时间以秒为单位。

示例

    dbms_lock.sleep(0.1);
        

41.11.6.11. DBMS_METADATA

概述

为您提供了一种从数据库字典中检索元数据的方式。

Table 41.16. DBMS_METADATA 功能

功能描述
get_ddl允许您获取对象的元数据。

语法

        GET_DDL(object_type VARCHAR,name VARCHAR,schema VARCHAR DEFAULT current_schema(),VARCHAR DEFAULT 'COMPATIBLE',VARCHAR DEFAULT  'ORACLE',VARCHAR DEFAULT  'DDL',BOOL DEFAULT  'false') RETURNS TEXT
      
41.11.6.11.1. 功能描述

本节介绍了 dbms_job 的每个功能。

GET_DDL

  • 允许您获取对象的元数据。

示例

    select dbms_metadata.get_ddl('constraint', 'key1_check') from dual;
        

41.11.6.12. DBMS_OBFUSCATION_TOOLKIT

概述

启用应用程序使用数据加密标准(DES)或三重DES算法加密数据。

Table 41.17. DBMS_OBFUSCATION_TOOLKIT 功能特性

功能描述
md5生成数据的 MD5 哈希值。

语法

        MD5(input_string TEXT) RETURNS RAW
      
41.11.6.12.1. 功能描述

本节介绍 dbms_job 的每个功能。

MD5

  • 生成数据的 MD5 哈希值。

示例

    select dbms_obfuscation_toolkit.md5(input_string => '测试')::text from dual;
        

41.11.6.13. DBMS_SNAPSHOT

概述

启用您刷新快照(MVIEW)。

Table 41.18. DBMS_SNAPSHOT 功能特性

功能描述
refresh刷新快照列表。

语法

        REFRESH(list TEXT,method TEXT default 'C')
      
41.11.6.13.1. 功能描述

本节介绍 dbms_job 的每个功能。

REFRESH

  • 此过程刷新快照(MVIEW)列表。

示例

    select dbms_snapshot.refresh('mv_test_dbms_snapshot,mv_test_dbms_snapshot1') from dual;
        

41.11.6.14. DBMS_SQL

概述

在存储过程或匿名块中提供了一种执行动态sql的方法。

Table 41.19. DBMS_SQL 功能特性

功能描述
OPEN_CURSOR返回一个游标句柄。
PARSE解析给定的SQL语句。
EXECUTE执行游标对应的SQL语句。
CLOSE_CURSOR关闭游标并释放内存。

语法

        FUNCTION OPEN_CURSOR() RETURN INT;

        PROCEDURE PARSE(C INT, STMT VARCHAR2);

        PROCEDURE PARSE(C INT, STMT DBMS_SQL.VARCHAR2A, LB INT, UB INT, LFFLG BOOL, LANGUAGE_FLAG INT);

        FUNCTION EXECUTE(C INT) RETURN BIGINT;

        PROCEDURE CLOSE_CURSOR(C INT);
      
41.11.6.14.1. 功能描述

本节介绍 DBMS_SQL 的每个功能。

OPEN_CURSOR

  • 返回一个游标句柄。

Example

    cursor_sql integer;
    cursor_sql := dbms_sql.open_cursor;
        

PARSE

  • 解析给定的SQL语句。

Example

    vs_sql varchar2(200);
    vs_sql:='create or replace function f1(v int) RETURN int AS begin return v + 1; end;';
    dbms_sql.parse(cursor_sql,vs_sql);

    vc_prosql dbms_sql.varchar2a;
    iIndex integer;
    iIndex := 1;
    vc_prosql(iIndex) := 'create or replace function f1(v int) RETURN int AS ';
    iIndex := iIndex + 1;
    vc_prosql(iIndex) := 'begin';
    iIndex := iIndex + 1;
    vc_prosql(iIndex) := '  return v + 1;';
    iIndex := iIndex + 1;
    vc_prosql(iIndex) := 'end;';
    dbms_sql.parse(cursor_sql, vc_prosql, vc_prosql.first, vc_prosql.last, false, dbms_sql.native);
        

EXECUTE

  • 执行游标对应的SQL语句。

Example

    vn_ret int;
    vn_ret := dbms_sql.execute(cursor_sql);
        

CLOSE_CURSOR

  • 关闭游标并释放内存。

Example

    dbms_sql.close_cursor(cursor_sql);
        
41.11.6.14.2. 使用案例

以下是使用DBMS_SQL的一个完整案例。

    DECLARE
      vc_prosql dbms_sql.varchar2a;
      cursor_sql integer;
      iIndex integer;
      vn_ret integer;
    BEGIN
      FOR i IN 1..2 LOOP
        cursor_sql := dbms_sql.open_cursor;
        vc_prosql.DELETE;
        iIndex := 1;
        vc_prosql(iIndex) := 'create or replace function f' || i || '(v int) RETURN int AS ';
        iIndex := iIndex + 1;
        vc_prosql(iIndex) := 'begin';
        iIndex := iIndex + 1;
        vc_prosql(iIndex) := '  return v + ' || i || ';';
        iIndex := iIndex + 1;
        vc_prosql(iIndex) := 'end;';
        for j in 1..vc_prosql.last loop
          raise notice '%',vc_prosql(j);
        end loop;
        raise notice '';
        dbms_sql.parse(cursor_sql, vc_prosql, vc_prosql.first, vc_prosql.last, false, dbms_sql.native);
        vn_ret := dbms_sql.execute(cursor_sql);
        dbms_sql.close_cursor(cursor_sql);
      END LOOP;
    END;
    /
        

41.11.6.15. DBMS_STATS

概述

允许您收集优化器统计信息。

Table 41.20. DBMS_STATS 功能

功能描述
gather_table_stats收集表、列和索引统计信息。

语法

        GATHER_TABLE_STATS(
            ownname          TEXT,
            tabname          TEXT,
            partname         TEXT    DEFAULT NULL,
            estimate_percent NUMERIC DEFAULT NULL,
            block_sample     BOOLEAN DEFAULT FALSE,
            method_opt       TEXT    DEFAULT NULL,
            degree           NUMERIC DEFAULT NULL,
            granularity      TEXT    DEFAULT NULL,
            cascade          BOOLEAN DEFAULT NULL,
            stattab          TEXT    DEFAULT NULL,
            statid           TEXT    DEFAULT NULL,
            statown          TEXT    DEFAULT NULL,
            no_invalidate    BOOLEAN DEFAULT NULL,
            stattype         TEXT    DEFAULT NULL,
            force            BOOLEAN DEFAULT FALSE,
            context          TEXT    DEFAULT NULL,
            options          TEXT    DEFAULT NULL
        )
      
41.11.6.15.1. 功能描述

本节介绍 dbms_stats 的每个功能。

GATHER_TABLE_STATS

  • 此过程调用 ANALYZE 语句以收集表统计信息。

  • 'ownname' 和 'tabname' 参数不能为空;它们是必需的。

  • 目前,除了 'ownname'、'tabname' 和 'partname' 参数具有实际功能之外,其余参数均为了与 Oracle 兼容而设置,并没有实际功能。

  • 当您成功执行了 GATHER_TABLE_STATS 之后,可通过 pg_statistic, pg_stat_all_tables, dba_tab_statistics 等视图来查询统计结果。

示例

    begin
        DBMS_STATS.GATHER_TABLE_STATS(
            ownname => 'dbms_gather_test',
            tabname => 'dbms_stats_gather_test_1',
            degree => 4
        );
    end;
    /
        

41.11.6.16. UTL_FILE

概述

PL/pgSQL 可以写入和读取文本文件。

要执行这些文件操作,操作目标的目录必须预先在 UTL_FILE.UTL_FILE_DIR 表中注册。 作为数据库管理员或具有 INSERT 权限的用户,使用 INSERT 语句来注册目录。 此外,如果目录不再需要,请从相同的表中删除它。 有关如何注册和删除目录的信息,请参阅“注册和删除目录”。

在 PL/pgSQL 中,如下声明之后将解释的文件处理程序:

        DECLARE f UTL_FILE.FILE_TYPE;
      

Table 41.21. UTL_FILE 功能特性

功能描述
FCLOSE关闭文件。
FCLOSE_ALL关闭会话中打开的所有文件。
FCOPY复制整个文件或其连续部分。
FFLUSH刷新缓冲区。
FGETATTR检索文件的属性。
FOPEN打开文件。
FREMOVE删除文件。
FRENAME重命名文件。
FSEEK向前或向后按字节调整文件指针位置
GET_LINE从文本文件中读取一行。
IS_OPEN检查文件是否已打开。
NEW_LINE写入换行符。
PUT写入字符串。
PUT_LINE将换行符附加到字符串并将该字符串写入。
PUTF写入格式化字符串。

语法

        FCLOSE(file utl_file.file_type)
        FCLOSE_ALL()
        FCOPY(srcDir text, srcFileName text, destDir text, destFileName text)
        FCOPY(srcDir text, srcFileName text, destDir text, destFileName text, startLine integer)
        FCOPY(srcDir text, srcFileName text, destDir text, destFileName text, startLine integer, endLine integer)
        FFLUSH(file utl_file.file_type)
        FGETATTR(dir text, fileName text, OUT fexists boolean, OUT file_length bigint, OUT blocksize integer)
        FOPEN(dir, fileName text, openMode text)   return utl_file.file_type
        FOPEN(dir, fileName text, openMode text, maxLineSize integer)  return utl_file.file_type
        FOPEN(dir, fileName text, openMode text, maxLineSize integer, encoding name)  return utl_file.file_type
        FREMOVE(dir text, fileName text);
        FRENAME(srcDir text, srcFileName text,destDir text, destFileName text)
        FRENAME(srcDir text, srcFileName text,destDir text, destFileName text, overwrite boolean)
        FSEEK(file utl_file.file_type, absolute_offset bigint default null, relative_offset bigint default null)
        GET_LINE(file utl_file.file_type, OUT buffer text)
        GET_LINE(file utl_file.file_type, OUT buffer text, len integer)
        IS_OPEN(file utl_file.file_type) return boolean
        NEW_LINE(file utl_file.file_type)  return boolean
        NEW_LINE(file utl_file.file_type,lines integer) return boolean
        PUT(file utl_file.file_type,str text)  return boolean
        PUT(file utl_file.file_type,str anyelement)  return boolean
        PUT_LINE(file utl_file.file_type, str text)
        PUT_LINE(file utl_file.file_type, str text, autoflush boolean)
        PUT_LINE(file utl_file.file_type, str anyelement)
        PUT_LINE(file utl_file.file_type, str anyelement, autoflush boolean)
        PUTF(file utl_file.file_type, fmt ) return boolean
        PUTF(file utl_file.file_type, fmt, arguments1 ) return boolean
        PUTF(file utl_file.file_type, fmt, arguments1, arguments2) return boolean
        PUTF(file utl_file.file_type, fmt, arguments1, arguments2, arguments3) return boolean
        PUTF(file utl_file.file_type, fmt, arguments1, arguments2, arguments3, arguments4) return boolean
        PUTF(file utl_file.file_type, fmt, arguments1, arguments2, arguments3, arguments4, arguments5) return boolean
      
41.11.6.16.1. 注册和删除目录

注册目录

1. 检查目录是否已经注册(如果已经注册,则不需要执行第2步)。

        SELECT * FROM UTL_FILE.UTL_FILE_DIR WHERE dir='/home/pgsql';
        

2. 注册目录。

        INSERT INTO UTL_FILE.UTL_FILE_DIR VALUES('/home/pgsql');
        

删除目录

        DELETE FROM UTL_FILE.UTL_FILE_DIR WHERE dir='/home/lightdb';
        
41.11.6.16.2. 描述

本节介绍 UTL_FILE 的每个功能。

FCLOSE

  • FCLOSE 用于关闭打开的文件。

  • 指定一个打开的文件句柄。

示例

        UTL_FILE.FCLOSE(f);
        

FCLOSE_ALL

  • FCLOSE_ALL 关闭会话中所有打开的文件。

  • 使用 FCLOSE_ALL 关闭的文件将无法再进行读写操作。

示例

        PERFORM UTL_FILE.FCLOSE_ALL();
        

FCOPY

  • FCOPY 可以复制整个文件或其连续部分。如果没有指定 startLineendLine,则会复制整个文件。

  • 指定源文件的目录位置。

  • 指定源文件。

  • 指定创建目标文件的目录。

  • 指定目标文件的名称。

  • 指定开始复制的行号。请指定大于0的值。如果没有指定,则使用1。

  • 指定复制结束的行号。如果没有指定,则使用文件的最后一行。

示例

        PERFORM UTL_FILE.FCOPY('/home/lightdb', 'regress_ltsql.txt', '/home/lightdb', 'regress_ltsql2.txt');
        

FFLUSH

  • FFLUSH 强制将缓冲数据写入文件。

  • 指定一个打开的文件句柄。

示例

        PERFORM UTL_FILE.FFLUSH(f);
        

FGETATTR

  • FGETATTR 用于检索文件属性: 文件是否存在, 文件大小以及有关文件块大小的信息。

  • 指定文件所在的目录。

  • 指定相关文件名。

  • 表示文件是否存在的boolean值。如果文件存在,则将“fexists”设置为TRUE。如果文件不存在,则将“fexists”设置为FALSE。fexists的数据类型为BOOLEAN。

  • 以字节为单位存储文件的长度。如果文件不存在,则为NULL。file_length的数据类型为INTEGER。

  • 以字节为单位存储文件的块大小。如果文件不存在,则为NULL。blocksize的数据类型为INTEGER。

示例

    eclare
        f utl_file.file_type;
        fexists boolean;
        file_length integer;
        blocksize integer;
    begin
        utl_file.fgetattr('DATA','LT_VERSION',fexists, file_length, blocksize);
        IF fexists then
          DBMS_OUTPUT.PUT_LINE('fexists IS: true');
        ELSE
          DBMS_OUTPUT.PUT_LINE('fexists IS: false');
        END IF;
        DBMS_OUTPUT.PUT_LINE('file_length IS:'||nvl(to_char(file_length),'[NULL]'));
        DBMS_OUTPUT.PUT_LINE('blocksize IS:'||nvl(to_char(blocksize),'[NULL]'));
        EXCEPTION
            WHEN OTHERS THEN
            DBMS_OUTPUT.PUT_LINE('SQLCODE IS:'||SQLCODE);
            DBMS_OUTPUT.PUT_LINE('SQLERRM IS:'||SQLERRM);
    end;
    /
        

FOPEN

  • FOPEN打开一个文件。

  • 指定文件所在的目录。

  • 指定文件名。

  • 指定打开文件的模式:

r:读取模式

w: 写入

a: 添加

  • 指定可以在一次操作中处理的最大字符串长度(以字节为单位)。 如果省略,默认值为1024。指定1到32767之间的值。

  • 每次会话最多可以同时打开50个文件。

示例

        f := UTL_FILE.FOPEN('/home/pgsql','regress_pgsql.txt','r',1024);
        

FREMOVE

  • FREMOVE用于删除一个文件。

  • 指定文件所在的目录。

  • 指定文件名。

示例

        PERFORM UTL_FILE.FREMOVE('/home/lightdb', 'regress_ltsql.txt');
        

FRENAME

  • FRENAME用于重命名文件。

  • 指定源文件所在的目录位置。

  • 指定要重命名的源文件。

  • 指定要创建重命名文件的目录。

  • 指定文件的新名称。

  • 指定是否覆盖与重命名文件同名并位于同一位置的文件。如果指定为TRUE,则会覆盖现有文件。如果指定为FALSE,则会发生错误。如果省略,则设置为FALSE。

参见

请参考LightDB文档中的“SQL语言” > “数据类型” > “布尔类型”以获取关于布尔类型(TRUE/FALSE)值的信息。

示例

        UTL_FILE.FRENAME('DATA', 'regress_ltsql.txt', 'DATA', 'regress_ltsql2.txt', TRUE);
        

FSEEK

  • FSEEK在文件中将文件指针向前或向后调整指定字节。

  • 指定一个文件句柄。

  • 指定移动的绝对值; 默认值为NULL.

  • 指定向前或向后移动的相对偏移; 正数向前移动, 负数向后移动, 0,移动到当前位置,默认值为NULL

  • 如果在指定的字节数之前到达文件的开头,则 文件指针放在文件的开头。如果在指定的字节数之前到达文件末尾,则会引发INVALID_OFFSET错误。

  • 如果absolute_offset被指定,则过程寻址到以字节为单位的绝对位置。

See

Example

        UTL_FILE.fseek(filehandle, 0);
        

GET_LINE

  • GET_LINE用于从文件中读取一行。

  • 指定以r(读取)模式返回的FOPEN文件句柄。

  • 指定从文件中读取的字节数。如果未指定,则将使用FOPEN中指定的最大字符串长度。

  • 指定用于接收读取一行数据的缓冲区。

  • 换行符不会被加载到缓冲区中。

  • 如果加载的是空行,则返回NULL。

  • 指定要读取的数据的最大长度(以字节为单位)。指定1到32767之间的值。如果未指定,则设置为FOPEN中指定的最大字符串长度。如果在FOPEN中未指定最大字符串长度,则设置为1024。

  • 如果行长度大于要读取的指定字节数,则剩余部分将在下一次调用中读取。

  • 当尝试读取最后一行之后的内容时,将会发生NO_DATA_FOUND异常。

示例

        UTL_FILE.GET_LINE(f, buff);
        

IS_OPEN

  • IS_OPEN用于检查文件是否已经打开。

  • 指定文件句柄。

  • 返回值是BOOLEAN类型。TRUE表示打开状态,FALSE表示关闭状态。

参见

请参考LightDB文档中的“SQL语言” > “数据类型” > “布尔类型”以获取关于布尔类型(TRUE/FALSE)值的信息。

示例

        IF UTL_FILE.IS_OPEN(f) THEN
            UTL_FILE.FCLOSE(f);
        END IF;
        

NEW_LINE

  • NEW_LINE用于写入一个或多个换行符。

  • 指定一个打开的文件句柄。

  • 指定要写入文件的换行符数量。如果省略,则使用“1”。

示例

        PERFORM UTL_FILE.NEW_LINE(f, 2);
        

PUT

  • PUT用于将字符串写入文件。

  • 指定使用w(写入)或a(追加)打开的FOPEN文件句柄。

  • 指定要写入文件的字符串。

  • 要写入的字符串的最大长度(以字节为单位)是在FOPEN中指定的最大字符串长度。

  • PUT不会追加换行符。如果要追加换行符,请使用NEW_LINE命令。

示例

        PERFORM UTL_FILE.PUT(f, 'ABC');
        

PUT_LINE

  • PUT_LINE将一个换行符追加到字符串末尾,并将字符串写入文件。

  • 指定使用w(写入)或a(追加)打开的FOPEN文件句柄。

  • 指定是否强制写入文件。如果指定为TRUE,则会强制写入文件。如果指定为FALSE,则文件写入是异步的。如果省略,则设置为FALSE。

  • 字符串的最大长度(以字节为单位)是在FOPEN中指定的最大字符串长度。

示例

        UTL_FILE.PUT_LINE(f, 'ABC', TRUE);
        

PUTF

  • PUTF用于写入格式化的字符串。

  • 指定使用w(写入)或a(追加)打开的FOPEN文件句柄。

  • 指定格式,格式字符串中包含格式化字符 \n 和 %s。

  • 格式字符串中的 \n 表示换行符。

  • 输入值的数量必须与格式字符串中 %s 的数量相同。最多可以指定五个输入值。格式字符串中的 %s 将被相应的输入字符替换。如果没有指定与 %s 相应的输入值,则它将被替换为空字符串。

示例

        PERFORM UTL_FILE.PUTF(f, '[1=%s, 2=%s, 3=%s, 4=%s, 5=%s]\n', '1', '2', '3', '4', '5');
        
41.11.6.16.3. 使用示例

在使用 UTL_FILE 时的流程和使用示例如下所示。

1. 准备

在开始使用 UTL_FILE 的新作业之前,请在 UTL_FILE.UTL_FILE_DIR 表中注册目录。

有关如何注册目录的信息,请参见“注册和删除目录”。

2. 执行作业

执行使用 UTL_FILE 的作业。以下是示例。

          CREATE OR REPLACE procedure gen_file(mydir TEXT, infile TEXT, outfile TEXT, copyfile TEXT) as
          v1 VARCHAR(32767);
          inf UTL_FILE.FILE_TYPE;
          otf UTL_FILE.FILE_TYPE;
        BEGIN
          inf := UTL_FILE.FOPEN(mydir, infile,'r',256);
          otf := UTL_FILE.FOPEN(mydir, outfile,'w');
          UTL_FILE.GET_LINE(inf, v1, 256);
          UTL_FILE.PUT_LINE(otf,v1,TRUE);
          UTL_FILE.GET_LINE(inf, v1, 256);
          PERFORM UTL_FILE.PUTF(otf,'%s\n',v1);
          UTL_FILE.GET_LINE(inf, v1, 256);
          PERFORM UTL_FILE.PUT(otf,v1);
          PERFORM UTL_FILE.NEW_LINE(otf);
          PERFORM UTL_FILE.FFLUSH(otf);

          UTL_FILE.FCLOSE(inf);
          UTL_FILE.FCLOSE(otf);

          PERFORM UTL_FILE.FCOPY(mydir, outfile, mydir, copyfile, 2, 3);
          UTL_FILE.FRENAME(mydir, outfile, mydir, 'rename.txt');

        END;
        /

        BEGIN
          gen_file('DATA', 'input.txt', 'output.txt', 'copyfile.txt');
        END;
        /
        

3. 后处理

如果你移除使用UTL_FILE的一个作业,需要从UTL_FILE.UTL_FILE_DIR表中删除该目录的信息。 确保在删除之前该目录的信息不再被其他作业使用。

参考"注册和删除目录"以获取有关如何删除该目录的信息。

41.11.6.17. UTL_RAW

概述

提供用于操作RAW数据类型的SQL函数。

Table 41.22. UTL_RAW 特性

特性描述
BIT_AND对RAW r1和RAW r2中的值执行按位逻辑“与”操作,并返回“与”结果RAW。
BIT_COMPLEMENT对RAW r中的值执行按位逻辑“补码”操作,并返回“补码”结果RAW。
BIT_OR对RAW r1和RAW r2中的值执行按位逻辑“或”操作,并返回“或”结果RAW。
BIT_XOR对RAW r1和RAW r2中的值执行按位逻辑“异或”操作,并返回“异或”结果RAW。
CAST_FROM_BINARY_INTEGER返回BINARY_INTEGER值的RAW二进制表示。
CAST_FROM_NUMBER返回一个数字值的原始二进制表示。
CAST_TO_BINARY_INTEGER将一个BINARY_INTEGER的原始二进制表示转换为BINARY_INTEGER。
CAST_TO_NUMBER将一个数字的原始二进制表示转换为数字。
CAST_TO_RAW将一个文本值转换为一个RAW值。
CAST_TO_VARCHAR2将一个RAW值转换为文本值。
COMPARE比较RAW r1和RAW r2。
CONCAT将最多12个RAW连接成一个RAW。
CONVERT将RAW r从字符集from_charset转换为字符集to_charset,返回结果RAW。
COPIES返回n个连接在一起的r的副本。
LENGTH返回RAW r的字节长度。
OVERLAY从目标RAW的字节位置pos开始,使用覆盖RAW覆盖目标RAW的指定部分,覆盖长度为len个字节。
REVERSE反转RAW r中的字节序列。
TRANSLITERATE根据从集合RAW from_set和集合RAW to_set中的字节,翻译输入RAW r中的字节。
TRANSLATE根据从集合RAW from_set和集合RAW to_set中的字节,转换输入RAW r中的字节。
XRANGE创建一系列RAW值,从start到end,步长为step。
XRANGE返回一个包含所有连续有效1字节编码的RAW,从start_byte开始,到end_byte结束。

语法

    CAST_TO_VARCHAR2(r raw)  RETURNS TEXT
    CAST_TO_RAW(c TEXT)  RETURNS RAW
    CONCATr1 RAW,r2 RAW,r3 RAW,r4 RAW,r5 RAW,r6 RAW,r7 RAW,r8 RAW,r9 RAW,r10 RAW,r11 RAW,r12 RAW)  RETURNS RAW
    LENGTH(r RAW) RETURNS INT4
    SUBSTR(r RAW,pos INT4,len INT4 DEFAULT null)  RETURNS RAW
    TRANSLITERATE(r RAW,to_set RAW DEFAULT ''::raw ,from_set RAW DEFAULT ''::raw,pad RAW DEFAULT '00'::raw)  RETURNS RAW
    TRANSLATE(r RAW,from_set RAW,to_set RAW) RETURNS RAW
    COPIES(r RAW,n INT8) RETURNS RAW
    OVERLAY(overlay_str RAW,target RAW,pos INT4 DEFAULT 1,len INT4 DEFAULT NULL,pad RAW DEFAULT '00'::raw) RETURNS RAW
    XRANGE(start_byte RAW,end_byte RAW) RETURNS RAW
    REVERSE(r RAW) RETURNS RAW
    COMPARE(r1 RAW,r2 RAW,pad RAW)  RETURNS INT4
    CONVERT(r RAW,to_charset TEXT,from_charset TEXT) RETURNS RAW
    BIT_AND(r1 RAW,r2 RAW) RETURNS RAW
    BIT_OR(r1 RAW,r2 RAW) RETURNS RAW
    BIT_XOR(r1 RAW,r2 RAW) RETURNS RAW
    BIT_COMPLEMENT(r RAW) RETURNS RAW
    CAST_TO_NUMBER(r RAW)RETURNS NUMERIC
    CAST_FROM_NUMBER(n NUMERIC) RETURNS RAW
    CAST_TO_BINARY_INTEGER(r RAW,endianess INT)RETURNS INT4
    CAST_FROM_BINARY_INTEGER(n INT4,endianess INT) RETURNS RAW
      
41.11.6.17.1. 功能描述

本节介绍dbms_job的每个功能。

CAST_TO_VARCHAR2

  • 这个函数将一个使用一些数据字节表示的RAW值转换为一个具有相同数量数据字节的文本值。

示例

    select utl_raw.cast_to_varchar2('43616D65726F6E') from dual;
        

CAST_TO_RAW

  • 这个函数将一个使用一些数据字节表示的文本值转换为一个具有相同数量数据字节的RAW值。数据本身不做任何修改,但其数据类型被重新转换为RAW数据类型。

示例

    select utl_raw.cast_to_raw('测试') from dual;
        

CONCAT

  • 这个函数将最多12个RAW连接成一个RAW。

示例

    select  utl_raw.concat( '1', '0102', 'f', '1a2b' ) from dual;
        

LENGTH

  • 这个函数返回RAW r的字节长度。

示例

    select  UTL_RAW.length('FFFF'::raw) from dual;
        

SUBSTR

  • 如果pos为正数,则SUBSTR从r的开头开始计数以找到第一个字节。如果pos为负数,则SUBSTR从r的末尾开始向后计数。pos的值可以为0。

示例

    select utl_raw.substr( '0102030405', 3, 2 ) from dual;
        

TRANSLITERATE

  • 这个函数根据从集合RAW from_set和集合RAW to_set中的字节,转换输入RAW r中的字节。 r中的连续字节被查找from_set,在查找不到时,未更改地复制到结果RAW中。 如果找到,则它们将被对应的to_set中的字节或填充字节替换为结果RAW中,当没有对应关系时。

示例

    select utl_raw.transliterate( '010203040502', '0709', '01020304', 'ff' ) from dual;
        

TRANSLATE

  • 这个函数根据从集合RAW from_set和集合RAW to_set中的字节,转换输入RAW r中的字节。 如果r中的一个字节在from_set中有一个匹配字节,则它将被相应位置to_set中的字节替换,或删除。

示例

    select utl_raw.translate( '0102030405', '0304', '09' ) from dual;
        

COPIES

  • 这个函数返回n个r的副本,按顺序连接在一起。

示例

    select utl_raw.copies( '010203', 3 ) from dual;
        

OVERLAY

  • OVERLAY函数将目标RAW的指定部分用overlay_str RAW替换,从目标的字节位置pos开始,继续len个字节。

  • 如果overlay_str少于len个字节,则使用填充字节将其扩展到len个字节。如果overlay_str超过len个字节,则忽略overlay_str中的额外字节。 如果从目标的位置pos开始的len个字节超过了目标的长度,则目标被扩展以包含整个overlay_str的长度。

示例

    select utl_raw.overlay( 'aabb', '010203', 5, 1, 'FF' ) from dual;
        

XRANGE

  • 此函数返回一个RAW值,其中包含以指定字节代码开头和结尾的一字节编码的连续。

  • 如果start_byte的值大于end_byte的值,则结果字节的连续开始于start_byte,通过x'FF'回到x'00',然后以end_byte结束。

示例

    select utl_raw.xrange( 'FA', '01' ) from dual;
        

REVERSE

  • 此函数将RAW r的字节序列从末尾到开头进行反转。例如,x'0102F3'将被反转为x'F30201',而'xyz'将被反转为'zyx'。 结果长度与输入RAW长度相同。

示例

    select utl_raw.reverse( '010203040506070809' ) from dual;
        

COMPARE

  • 此函数比较两个RAW值。如果它们的长度不同,则根据可选的填充参数在右侧扩展较短的值。

示例

    select utl_raw.compare( '010203', '01020304', '04' ) from dual;
        

转换

  • 此函数将RAW r从字符集from_charset转换为字符集to_charset,并返回转换后的RAW。

  • from_charset和to_charset必须是LightDB服务器定义的支持字符集。

示例

    select utl_raw.convert(rawout('测试'::BYTEA)::text::raw,'GBK','UTF8') from dual;
        

BIT_AND

  • 此函数对RAW r1和RAW r2中的值执行位逻辑“与”操作,并返回“与”结果RAW。 它是一个严格函数。

  • 如果r1和r2长度不同,则两个RAW中长度较短的一个将通过添加'00'来扩展到相同的长度(这与Oracle不同)。

示例

    select utl_raw.bit_and('1234ffdd','fff1234f') from dual;
        

BIT_OR

  • 此函数对RAW r1和RAW r2中的值执行位逻辑“或”操作,并返回“或”结果RAW。 它是一个严格函数。

  • 如果r1和r2长度不同,则两个RAW中长度较短的一个将通过添加'00'来扩展到相同的长度(这与Oracle不同)。

示例

    select utl_raw.bit_or('1234ffdd','fff1234f') from dual;
        

BIT_XOR

  • 此函数对RAW r1和RAW r2中的值执行位逻辑“异或”操作,并返回“异或”结果RAW。 它是一个严格函数。

  • 如果r1和r2长度不同,则两个RAW中长度较短的一个将通过添加'00'来扩展到相同的长度(这与Oracle不同)。

示例

    select utl_raw.bit_xor('1234ffdd','1234ffee') from dual;
        

BIT_COMPLEMENT

  • 此函数对RAW r中的值执行位逻辑“补码”操作,并返回补码结果RAW。结果长度等于输入RAW r的长度。 它是一个严格函数。

示例

    select UTL_raw.bit_complement('1122FF') from dual;
        

CAST_TO_NUMBER

  • 此函数将NUMBER的RAW二进制表示转换为NUMBER。

示例

    select utl_raw.cast_TO_number('C10215') from dual;
        

CAST_FROM_NUMBER

  • 此函数返回NUMBER值的RAW二进制表示。

示例

    select UTL_raw.cast_from_number(1.2) from dual;
        

CAST_TO_BINARY_INTEGER

  • 此函数将整数的RAW二进制表示转换为整数。(Oracle中为BINARY_INTEGER)

示例

    select utl_raw.cast_to_binary_integer('FF00') from dual;
        

CAST_FROM_BINARY_INTEGER

  • 此函数返回整数值的RAW二进制表示。(Oracle中为BINARY_INTEGER)

示例

    select utl_raw.cast_from_binary_integer(65280) from dual;
        

41.11.6.18. UTL_URL

概述

有两个函数提供对URL字符进行转义和反转义的机制。

Table 41.23. UTL_URL Features

特性描述
ESCAPE返回一个URL,其中的非法字符(可选保留字符)使用%2-digit-hex-code格式进行转义。
UNESCAPE将URL中的转义字符序列恢复为其原始形式。将%XX转义字符序列转换为原始字符。

语法

    ESCAPE(url TEXT,escape_reserved_chars BOOL DEFAULT FALSE,url_charset TEXT DEFAULT 'UTF8')  RETURNS TEXT
    UNESCAPE(url TEXT,url_charset TEXT DEFAULT 'UTF8') RETURNS TEXT
      
41.11.6.18.1. 特性描述

本节介绍dbms_job的每个特性。

ESCAPE

  • 此函数返回一个URL,其中的非法字符(可选保留字符)使用%2-digit-hex-code格式进行转义。

示例

    select utl_url.escape('http://新年好.com') from dual;
        

UNESCAPE

  • 此函数将URL中的转义字符序列恢复为其原始形式,将%XX转义字符序列转换为原始字符。

示例

    select utl_url.unescape('http%3A%2F%2F%E6%96%B0%E5%B9%B4%E5%A5%BD.com', 'utf8') from dual;
        

41.11.6.19. UTL_ENCODE

概述

提供将原始数据编码为标准编码格式的函数。

Table 41.24. UTL_ENCODE 特性

特性描述
BASE64_DECODE读取 base64 编码的原始输入字符串,并将其解码为其原始的原始字符串值。
BASE64_ENCODE将原始值的二进制表示编码为 base 64 元素,并以原始字符串形式返回它。
MIMEHEADER_DECODE从 MIME 标头格式解码字符串。
MIMEHEADER_ENCODE将字符串编码为 MIME 标头格式。
QUOTED_PRINTABLE_DECODE读取文本 quoted printable 格式的输入字符串,并将其解码为相应的原始字符串。
QUOTED_PRINTABLE_ENCODE读取原始输入字符串并将其编码为相应的 quoted printable 格式字符串。
TEXT_DECODE解码一个字符集敏感的文本字符串。
TEXT_ENCODE编码一个字符集敏感的文本字符串。
UUDECODE读取原始 uuencode 格式的输入字符串,并将其解码为相应的原始字符串。
UUDECODE读取原始输入字符串并将其编码为相应的 uuencode 格式字符串。

语法

    BASE64_DECODE(r RAW) RETURNS RAW
    BASE64_ENCODE(r RAW) RETURNS RAW
    MIMEHEADER_DECODE(buf TEXT) RETURNS TEXT
    MIMEHEADER_ENCODE(buf TEXT,encode_charset TEXT default 'UTF8'::text,encoding INT4 default 2::int4) RETURNS TEXT
    QUOTED_PRINTABLE_DECODE(r RAW)  RETURNS RAW
    QUOTED_PRINTABLE_ENCODE(r RAW) RETURNS RAW
    TEXT_DECODE(buf TEXT,encode_charset TEXT default 'UTF8'::text,encoding INT4 default 2::int4) RETURNS TEXT
    TEXT_ENCODE(buf TEXT,encode_charset TEXT default 'UTF8'::text,encoding INT4 default 2::int4) RETURNS TEXT
    UUDECODE(r RAW) RETURNS RAW
    UUENCODE(r RAW,type INT default 1::int,filename TEXT default 'uuencode.txt',permission TEXT default '0') RETURNS RAW
      
41.11.6.19.1. 特性描述

本节介绍 dbms_job 的每个特性。

BASE64_DECODE

  • 此函数读取 base64 编码的原始输入字符串,并将其解码为其原始的原始字符串值。

示例

    select utl_encode.base64_decode('3572574C364B2B56') from dual;
        

BASE64_ENCODE

  • 此函数将原始值的二进制表示编码为 base 64 元素,并以原始字符串形式返回它。

示例

    select utl_encode.base64_encode(rawtohex('测试')::raw) from dual;
        

MIMEHEADER_DECODE

  • 从 MIME 标头格式('=?<charset> ?<encoding> ?<encoded text>?= ')解码字符串。

示例

    select UTL_ENCODE.mimeheader_decode('=?UTF-8?Q?What=20is=20the=20date=20=E7=8E=8B=20=3D20=20/=20\=3F?=') from dual;
        

MIMEHEADER_ENCODE

  • 此函数生成一个形式为('=?<charset> ?<encoding> ?<encoded text>?= ')的“编码单词”作为输出。

  • ENCODING 输入参数接受 UTL_ENCODE.QUOTED_PRINTABLE 或 UTL_ENCODE.BASE64 或 NULL 作为有效值。如果为 NULL,则选择 quoted-printable 编码作为默认值。

  • <charset> 值作为输入参数 encode_charset 指定。

示例

    select utl_encode.MIMEHEADER_ENCODE('What is the date 王 =20 / \?', encode_charset =>'UTF8', encoding => 1 ) from dual;
        

QUOTED_PRINTABLE_DECODE

  • 该函数读取原始的 quoted printable 格式的输入字符串,并将其解码为相应的原始字符串。

示例

    select utl_encode.quoted_printable_decode('3D45353D42453D3830313233345C61732064663D33444142') from dual;
        

QUOTED_PRINTABLE_ENCODE

  • 此函数将读取原始输入字符串并将其编码为相应的Quoted-Printable格式字符串。

示例

    select utl_encode.quoted_printable_decode('3D45353D42453D3830313233345C61732064663D33444142') from dual;
        

TEXT_DECODE

  • 此函数将把输入的文本转换为目标字符集,该字符集由encode_charset参数指定,如果encode_charset参数不为NULL。编码后的文本将被转换为数据库的基本字符集。

  • 您可以根据每个编码参数选择解码Quoted-Printable或Base64格式。 1表示Base64编码,2表示Quoted-Printable编码,默认为Quoted-Printable格式。

示例

    select utl_encode.text_decode('=CD=F91234\as df=3DAB',encode_charset => 'GBK',encoding => 2) from dual;
        

TEXT_ENCODE

  • 此函数将把输入的文本转换为目标字符集,该字符集由encode_charset参数指定,如果encode_charset参数不为NULL。文本将根据encoding参数指定的格式编码为Base64或Quoted-Printable格式。

示例

    select utl_encode.text_encode('往12\as df=AB',encode_charset => 'GBK', encoding => 1) from dual;
        

UUDECODE

  • 此函数将读取RAW Uuencode格式的输入字符串并将其解码为相应的RAW字符串。

示例

    select UTL_ENCODE.uudecode(rawtohex(',6[C9&5FA$R,S0`')::raw) from dual;
        

UUENCODE

  • 此函数将读取原始输入字符串并将其编码为相应的Uuencode格式字符串。

示例

    select UTL_ENCODE.uuencode('5BB8D91959A113233340'::raw) from dual;