当前位置: 首页 > news >正文

Oracle常见内置程序包的使用Package

Oracle常见内置程序包的使用

  • 点击此处可跳转至:Oracle的程序包(Package),对包的基础进行学习
  • 常见内置程序包的使用Package
    • 1、DBMS_OUTPUT包
    • 2、DBMS_XMLQUERY包
    • 3、DBMS_RANDOM包
    • 4、UTL_FILE包
    • 5、DBMS_JOB包
    • 6、DBMS_LOB包
    • 7、DBMS_SQL包
    • 8、DBMS_LOCK包
    • 9、DBMS_METADATA包
    • 10、DBMS_APPLICATION_INFO包
    • 11、DBMS_CRYPTO包

Package作用常用函数函数作用
DBMS_OUTPUT向控制台输出信息PUT_LINE, PUT输出信息到控制台
DBMS_SQL动态执行SQL语句OPEN_CURSOR, PARSE, BIND_VARIABLE, EXECUTE, FETCH_ROWS执行SQL语句,绑定变量,获取结果集
DBMS_JOB创建和管理作业SUBMIT, REMOVE, NEXT_DATE创建、删除和管理作业
DBMS_LOCK管理锁REQUEST, RELEASE请求和释放锁
DBMS_CRYPTO加密和解密数据ENCRYPT, DECRYPT加密和解密数据
UTL_FILE读写文件FOPEN, FCLOSE, PUT_LINE打开、关闭文件,写入文件
DBMS_METADATA获取数据库对象的元数据信息GET_DDL, GET_DEPENDENT_DDL获取对象的DDL,获取依赖对象的DDL
DBMS_APPLICATION_INFO设置应用程序的信息SET_MODULE, SET_ACTION设置应用程序的模块和操作信息

点击此处可跳转至:Oracle的程序包(Package),对包的基础进行学习

常见内置程序包的使用Package

下面是一些常见内置程序包的使用以及这些包中的一些常用的函数的示例代码:

  1. DBMS_OUTPUT

    • 作用:向控制台输出信息
    • 常用函数:PUT_LINEPUT
    -- 使用DBMS_OUTPUT包向控制台输出信息
    BEGINDBMS_OUTPUT.PUT_LINE('Hello, world!');
    END;
    
  2. DBMS_SQL

    • 作用:动态执行SQL语句
    • 常用函数:OPEN_CURSORPARSEBIND_VARIABLEEXECUTEFETCH_ROWS
    -- 使用DBMS_SQL包动态执行SQL语句
    DECLAREl_cursor INTEGER;l_status INTEGER;
    BEGINl_cursor := DBMS_SQL.OPEN_CURSOR;DBMS_SQL.PARSE(l_cursor, 'SELECT * FROM employees', DBMS_SQL.NATIVE);l_status := DBMS_SQL.EXECUTE(l_cursor);-- 其他操作...DBMS_SQL.CLOSE_CURSOR(l_cursor);
    END;
    
  3. DBMS_JOB

    • 作用:创建和管理作业
    • 常用函数:SUBMITREMOVENEXT_DATE
    -- 使用DBMS_JOB包创建作业
    DECLAREl_job NUMBER;
    BEGINDBMS_JOB.SUBMIT(l_job, 'my_procedure;', SYSDATE, 'SYSDATE + 1');
    END;
    
  4. DBMS_LOCK

    • 作用:管理锁
    • 常用函数:REQUESTRELEASE
    -- 使用DBMS_LOCK包管理锁
    DECLAREl_lockhandle VARCHAR2(128);
    BEGINl_lockhandle := DBMS_LOCK.REQUEST(DBMS_LOCK.X_MODE, 'LOCK_NAME', 10, TRUE);-- 其他操作...DBMS_LOCK.RELEASE(l_lockhandle);
    END;
    
  5. DBMS_CRYPTO

    • 作用:加密和解密数据
    • 常用函数:ENCRYPTDECRYPT
    -- 使用DBMS_CRYPTO包加密数据
    DECLAREl_encrypted_data RAW(2000);
    BEGINl_encrypted_data := DBMS_CRYPTO.ENCRYPT('my_data', DBMS_CRYPTO.DES_CBC_PKCS5);-- 其他操作...
    END;
    
  6. UTL_FILE

    • 作用:读写文件
    • 常用函数:FOPENFCLOSEPUT_LINE
    -- 使用UTL_FILE包读写文件
    DECLAREl_file UTL_FILE.FILE_TYPE;
    BEGINl_file := UTL_FILE.FOPEN('MY_DIR', 'my_file.txt', 'W');UTL_FILE.PUT_LINE(l_file, 'Hello, world!');UTL_FILE.FCLOSE(l_file);
    END;
    
  7. DBMS_METADATA

    • 作用:获取数据库对象的元数据信息
    • 常用函数:GET_DDLGET_DEPENDENT_DDL
    -- 使用DBMS_METADATA包获取对象的DDL
    DECLAREl_ddl CLOB;
    BEGINl_ddl := DBMS_METADATA.GET_DDL('TABLE', 'EMPLOYEES');DBMS_OUTPUT.PUT_LINE(l_ddl);
    END;
    
  8. DBMS_APPLICATION_INFO

    • 作用:设置应用程序的信息
    • 常用函数:SET_MODULESET_ACTION
    -- 使用DBMS_APPLICATION_INFO包设置应用程序信息
    BEGINDBMS_APPLICATION_INFO.SET_MODULE('HR', 'Data Import');DBMS_APPLICATION_INFO.SET_ACTION('Importing data from file...');
    END;
    

这些示例代码展示了常见内置程序包的使用以及这些包中的一些常用的函数。这些包提供了丰富的功能,可以帮助开发人员处理各种不同的任务,包括输出信息、动态执行SQL语句、管理作业、加密数据等。

1、DBMS_OUTPUT包

当我们需要在存储过程或触发器中输出信息到控制台时,可以使用DBMS_OUTPUT包。下面是一个示例,演示了如何使用DBMS_OUTPUT包输出信息到控制台:

-- 创建一个存储过程,使用DBMS_OUTPUT输出信息
CREATE OR REPLACE PROCEDURE display_employee_info (employee_id NUMBER) ASl_employee_name employees.first_name%TYPE;l_employee_salary employees.salary%TYPE;
BEGIN-- 查询员工姓名和工资SELECT first_name, salary INTO l_employee_name, l_employee_salaryFROM employeesWHERE employee_id = employee_id;-- 使用DBMS_OUTPUT输出信息DBMS_OUTPUT.PUT_LINE('Employee Name: ' || l_employee_name);DBMS_OUTPUT.PUT_LINE('Employee Salary: ' || l_employee_salary);
END;
/

在这个示例中,我们创建了一个存储过程display_employee_info,该存储过程接受一个员工ID作为参数,并使用DBMS_OUTPUT包输出员工的姓名和工资信息到控制台。

接下来,我们可以调用这个存储过程,并查看输出的信息:

-- 调用存储过程,并查看输出信息
SET SERVEROUTPUT ON;
BEGINdisplay_employee_info(100);
END;
/

在执行这段代码后,我们会在控制台上看到输出的员工姓名和工资信息:

Employee Name: Steven
Employee Salary: 24000

2、DBMS_XMLQUERY包

通过这个示例,我们展示了如何使用DBMS_OUTPUT包在存储过程中输出信息到控制台,这对于调试和日志记录非常有用。

DBMS_XMLQUERY包用于执行XML查询和转换操作。它提供了一些函数,可以将XML文档转换为关系数据或将关系数据转换为XML文档。下面是一个示例,演示了如何使用DBMS_XMLQUERY包将XML文档转换为关系数据:

-- 创建一个XML类型的表
CREATE TABLE xml_data (xml_content XMLTYPE);-- 插入一条XML数据
INSERT INTO xml_data VALUES ('<employees><employee><id>100</id><name>Steven</name><salary>24000</salary></employee><employee><id>101</id><name>David</name><salary>20000</salary></employee>
</employees>');-- 使用DBMS_XMLQUERY将XML数据转换为关系数据
DECLAREl_ctx DBMS_XMLQUERY.ctxType;l_rows DBMS_XMLQUERY.resultsType;
BEGIN-- 初始化上下文l_ctx := DBMS_XMLQUERY.newContext('SELECT * FROM xml_data');-- 执行查询DBMS_XMLQUERY.getRows(l_ctx, l_rows);-- 输出结果FOR i IN 1..l_rows.count LOOPDBMS_OUTPUT.PUT_LINE(l_rows(i).id || ' ' || l_rows(i).name || ' ' || l_rows(i).salary);END LOOP;-- 清理上下文DBMS_XMLQUERY.closeContext(l_ctx);
END;
/

在这个示例中,我们创建了一个XML类型的表xml_data,并向其中插入了一条XML数据。接下来,我们使用DBMS_XMLQUERY包将XML数据转换为关系数据,并输出结果到控制台。

在代码中,我们首先使用DBMS_XMLQUERY.newContext函数初始化一个查询上下文,然后使用DBMS_XMLQUERY.getRows函数执行查询并获取结果。最后,我们遍历结果集并使用DBMS_OUTPUT.PUT_LINE函数输出每一行的数据。

执行这段代码后,我们会在控制台上看到输出的关系数据:

100 Steven 24000
101 David 20000

通过这个示例,我们展示了如何使用DBMS_XMLQUERY包将XML文档转换为关系数据,这对于处理XML数据非常有用。

3、DBMS_RANDOM包

DBMS_RANDOM包是Oracle数据库中用于生成随机数的包。它提供了一系列函数,可以用来生成不同类型的随机数。下面是一个示例,演示了如何使用DBMS_RANDOM包生成随机数:

-- 使用DBMS_RANDOM包生成随机数
DECLAREl_random_number NUMBER;
BEGIN-- 生成一个介于1和10之间的随机整数l_random_number := DBMS_RANDOM.value(low => 1, high => 10);DBMS_OUTPUT.PUT_LINE('Random Number: ' || l_random_number);-- 生成一个0到1之间的随机浮点数l_random_number := DBMS_RANDOM.value;DBMS_OUTPUT.PUT_LINE('Random Float Number: ' || l_random_number);
END;
/

在这个示例中,我们使用了DBMS_RANDOM包的value函数来生成随机数。首先,我们使用DBMS_RANDOM.value函数生成一个介于1和10之间的随机整数,并将结果输出到控制台。然后,我们使用相同的函数生成一个0到1之间的随机浮点数,并同样将结果输出到控制台。

执行这段代码后,我们会在控制台上看到生成的随机数。例如:

Random Number: 7
Random Float Number: 0.832741

通过这个示例,我们展示了如何使用DBMS_RANDOM包生成随机数,这对于需要在数据库中进行随机化操作的场景非常有用。

4、UTL_FILE包

UTL_FILE包是Oracle数据库中用于读写操作系统文件的包。它提供了一系列的过程和函数,可以让数据库程序访问操作系统文件系统。下面是一个示例,演示了如何使用UTL_FILE包读取和写入文件:

-- 创建一个目录对象,指向数据库服务器上的一个目录
CREATE OR REPLACE DIRECTORY data_files AS '/u01/data_files';-- 创建一个表,用于存储文件内容
CREATE TABLE file_content (file_name VARCHAR2(100), file_data CLOB);-- 创建一个存储过程,使用UTL_FILE包读取文件内容并存储到表中
CREATE OR REPLACE PROCEDURE read_and_store_file(file_name IN VARCHAR2) ISfile_handle UTL_FILE.FILE_TYPE;file_buffer VARCHAR2(32767);file_data CLOB;
BEGIN-- 打开文件file_handle := UTL_FILE.FOPEN('DATA_FILES', file_name, 'R');-- 读取文件内容LOOPBEGINUTL_FILE.GET_LINE(file_handle, file_buffer);file_data := file_data || file_buffer;EXCEPTIONWHEN NO_DATA_FOUND THENEXIT;END;END LOOP;-- 关闭文件UTL_FILE.FCLOSE(file_handle);-- 将文件内容存储到表中INSERT INTO file_content (file_name, file_data) VALUES (file_name, file_data);COMMIT;
END;
/-- 调用存储过程,读取文件内容并存储到表中
BEGINread_and_store_file('example.txt');
END;
/

在这个示例中,我们首先创建了一个目录对象data_files,并指向了数据库服务器上的一个目录/u01/data_files。然后,我们创建了一个表file_content,用于存储文件内容。接下来,我们创建了一个存储过程read_and_store_file,该存储过程使用UTL_FILE包打开、读取和关闭文件,并将文件内容存储到表中。

在存储过程中,我们使用UTL_FILE.FOPEN函数打开文件,然后使用UTL_FILE.GET_LINE函数逐行读取文件内容,并使用CLOB类型的变量file_data存储文件内容。最后,我们使用UTL_FILE.FCLOSE函数关闭文件,并将文件内容插入到表中。

通过这个示例,我们展示了如何使用UTL_FILE包读取文件内容并存储到数据库表中,这对于需要在数据库中处理文件数据的场景非常有用。

5、DBMS_JOB包

在Oracle数据库中,DBMS_JOB包用于管理和调度作业(jobs)。作业是在后台运行的一系列数据库操作,可以周期性地执行或者在特定时间执行。DBMS_JOB包提供了一系列的过程和函数,用于创建、调度、修改和删除作业。下面是一个示例,演示了如何使用DBMS_JOB包创建和调度一个作业:

-- 创建一个存储过程,用于作为作业的执行内容
CREATE OR REPLACE PROCEDURE my_job_procedure IS
BEGIN-- 在这里定义作业需要执行的数据库操作-- 例如:INSERT INTO my_table VALUES (1, 'Hello, World!');NULL;
END;
/-- 使用DBMS_JOB包创建一个作业,并调度作业的执行
DECLAREl_job_number NUMBER;
BEGIN-- 创建一个作业,每天凌晨1点执行DBMS_JOB.SUBMIT(job       => l_job_number,what      => 'BEGIN my_job_procedure; END;',next_date => TRUNC(SYSDATE) + 1,interval  => 'TRUNC(SYSDATE) + 1');COMMIT;
END;
/

在这个示例中,我们首先创建了一个存储过程my_job_procedure,该存储过程定义了作业需要执行的数据库操作。然后,我们使用DBMS_JOB包的SUBMIT过程创建了一个作业,并调度了作业的执行时间。在SUBMIT过程中,我们指定了作业的执行内容(即调用my_job_procedure存储过程),作业的下次执行时间(每天凌晨1点),以及作业的执行间隔(每天执行一次)。

通过这个示例,我们展示了如何使用DBMS_JOB包创建和调度一个作业,这对于需要在数据库中定期执行特定操作的场景非常有用。

6、DBMS_LOB包

DBMS_LOB包是Oracle数据库中用于管理大型对象(LOB,Large Objects)的包,提供了一系列的存储、读取、修改和删除LOB数据的功能。LOB数据类型包括CLOB(Character Large Object)、BLOB(Binary Large Object)和BFILE(Binary File)。下面是一个具体的代码案例,演示了DBMS_LOB包的一些常见用法:

-- 创建一个包含CLOB字段的表
CREATE TABLE my_table (id NUMBER,clob_data CLOB
);-- 插入LOB数据
DECLAREl_clob CLOB;
BEGIN-- 创建一个CLOB对象DBMS_LOB.CREATETEMPORARY(l_clob, TRUE);-- 向CLOB对象写入数据DBMS_LOB.WRITEAPPEND(l_clob, 10, 'Hello, ');DBMS_LOB.WRITEAPPEND(l_clob, 5, 'World');-- 将CLOB对象插入到表中INSERT INTO my_table (id, clob_data) VALUES (1, l_clob);-- 释放CLOB对象DBMS_LOB.FREETEMPORARY(l_clob);
END;
/-- 读取LOB数据
DECLAREl_clob_data CLOB;
BEGIN-- 从表中读取CLOB数据SELECT clob_data INTO l_clob_data FROM my_table WHERE id = 1;-- 输出CLOB数据DBMS_OUTPUT.PUT_LINE(l_clob_data);
END;
/-- 更新LOB数据
DECLAREl_clob_data CLOB;
BEGIN-- 从表中读取CLOB数据SELECT clob_data INTO l_clob_data FROM my_table WHERE id = 1;-- 修改CLOB数据l_clob_data := l_clob_data || '!';-- 更新表中的CLOB数据UPDATE my_table SET clob_data = l_clob_data WHERE id = 1;
END;
/-- 删除LOB数据
DECLAREl_clob_data CLOB;
BEGIN-- 从表中读取CLOB数据SELECT clob_data INTO l_clob_data FROM my_table WHERE id = 1;-- 删除表中的CLOB数据DELETE FROM my_table WHERE id = 1;-- 释放CLOB对象DBMS_LOB.FREETEMPORARY(l_clob_data);
END;
/

在这个代码案例中,我们首先创建了一个包含CLOB字段的表my_table,然后演示了DBMS_LOB包的几个常见用法:

  1. 插入LOB数据:使用DBMS_LOB.CREATETEMPORARY创建一个临时的CLOB对象,然后使用DBMS_LOB.WRITEAPPEND向CLOB对象中写入数据,最后将CLOB对象插入到表中。
  2. 读取LOB数据:使用SELECT语句从表中读取CLOB数据,并使用DBMS_OUTPUT.PUT_LINE输出到控制台。
  3. 更新LOB数据:使用UPDATE语句修改表中的CLOB数据。
  4. 删除LOB数据:使用DELETE语句删除表中的CLOB数据,并使用DBMS_LOB.FREETEMPORARY释放临时的CLOB对象。

通过这个代码案例,我们演示了DBMS_LOB包的一些常见用法,包括插入、读取、更新和删除LOB数据,展示了DBMS_LOB包在管理大型对象时的作用。

7、DBMS_SQL包

DBMS_SQL是Oracle数据库提供的一个PL/SQL包,它可以让我们在运行时动态地执行SQL语句,以及处理和操作查询结果。DBMS_SQL包的主要作用有以下几点:

  1. 动态执行SQL语句:DBMS_SQL包提供了PARSEBIND_VARIABLEEXECUTE等过程,可以在运行时动态地构造和执行SQL语句,从而实现动态查询和操作数据的功能。

  2. 处理和操作查询结果:DBMS_SQL包提供了COLUMN_VALUEDESCRIBE_COLUMNSFETCH_ROWS等过程,可以处理和操作查询结果,包括获取查询结果的列名和数据类型、获取查询结果的具体数据等。

  3. 支持动态游标:DBMS_SQL包支持动态游标,可以在运行时创建和管理游标,从而实现更灵活的数据访问和操作方式。

下面是一个具体的代码案例,演示了DBMS_SQL包的一些常见用法:

DECLAREl_cursor_id INTEGER;l_rows_processed INTEGER;l_col_cnt INTEGER;l_desc_tab DBMS_SQL.DESC_TAB;l_col_val VARCHAR2(100);l_sql VARCHAR2(1000) := 'SELECT * FROM my_table WHERE id = :1';
BEGIN-- 创建一个动态游标l_cursor_id := DBMS_SQL.OPEN_CURSOR;-- 解析SQL语句DBMS_SQL.PARSE(l_cursor_id, l_sql, DBMS_SQL.NATIVE);-- 绑定变量DBMS_SQL.BIND_VARIABLE(l_cursor_id, ':1', 1);-- 执行查询l_rows_processed := DBMS_SQL.EXECUTE(l_cursor_id);-- 获取查询结果的列数和列名l_col_cnt := DBMS_SQL.DESCRIBE_COLUMNS(l_cursor_id, l_desc_tab);FOR i IN 1..l_col_cnt LOOPDBMS_OUTPUT.PUT(l_desc_tab(i).col_name || ' ');END LOOP;DBMS_OUTPUT.NEW_LINE;-- 获取查询结果的数据WHILE DBMS_SQL.FETCH_ROWS(l_cursor_id) > 0 LOOPFOR i IN 1..l_col_cnt LOOPDBMS_SQL.COLUMN_VALUE(l_cursor_id, i, l_col_val);DBMS_OUTPUT.PUT(l_col_val || ' ');END LOOP;DBMS_OUTPUT.NEW_LINE;END LOOP;-- 关闭游标DBMS_SQL.CLOSE_CURSOR(l_cursor_id);
END;
/

在这个代码案例中,我们首先创建了一个动态游标,然后使用PARSE过程解析了一个SQL语句,并使用BIND_VARIABLE过程绑定了一个变量。接着,我们使用EXECUTE过程执行了查询,并使用DESCRIBE_COLUMNS过程获取了查询结果的列数和列名。最后,我们使用FETCH_ROWSCOLUMN_VALUE过程获取了查询结果的具体数据,并使用CLOSE_CURSOR过程关闭了游标。

假设我们的my_table表中有两列idname,并且有一条数据满足条件id = 1。在这种情况下,代码的输出结果可能是这样的:

ID NAME 
1 John

这是因为我们的SQL语句是SELECT * FROM my_table WHERE id = :1,并且我们绑定了参数:1的值为1。因此,查询结果中只有一行数据,包括id为1和name为John的数据。

通过这个代码案例,我们演示了DBMS_SQL包的一些常见用法,包括动态执行SQL语句、处理和操作查询结果以及支持动态游标,展示了DBMS_SQL包在动态查询和操作数据时的作用。

8、DBMS_LOCK包

DBMS_LOCK包是Oracle数据库中用于管理锁定和同步的包。它提供了一系列过程和函数,用于创建、管理和释放锁定,以确保并发访问数据库时的数据一致性和完整性。

DBMS_LOCK包的一些常见用途包括:

  1. 控制并发访问:通过DBMS_LOCK包,可以创建和管理锁定,以控制并发访问数据库中的数据,避免出现数据竞争和不一致的情况。

  2. 实现同步操作:可以使用DBMS_LOCK包中的锁定机制来实现多个会话之间的同步操作,确保它们按照特定的顺序执行。

  3. 资源管理:可以使用DBMS_LOCK包来管理数据库中的资源,确保资源的合理分配和使用。

下面是一个简单的示例,演示了DBMS_LOCK包的一些基本用法:

DECLAREl_lock_handle VARCHAR2(128);l_result INTEGER;
BEGIN-- 请求一个排他锁l_result := DBMS_LOCK.REQUEST(lockmode => DBMS_LOCK.X_MODE,timeout => 10,lockhandle => l_lock_handle,release_on_commit => TRUE);IF l_result = 0 THENDBMS_OUTPUT.PUT_LINE('成功获取排他锁');-- 在这里可以进行需要排他锁的操作-- ...-- 释放锁DBMS_LOCK.RELEASE(lockhandle => l_lock_handle);DBMS_OUTPUT.PUT_LINE('成功释放排他锁');ELSEDBMS_OUTPUT.PUT_LINE('获取排他锁失败');END IF;
END;
/

在这个示例中,我们使用了DBMS_LOCK包中的REQUEST过程请求了一个排他锁。如果成功获取了锁,就可以在锁定的范围内执行需要排他锁的操作,然后使用RELEASE过程释放锁。如果获取锁失败,就可以根据实际情况进行处理。

如果成功获取了排他锁,输出结果可能是成功获取排他锁成功释放排他锁;如果获取锁失败,输出结果可能是获取排他锁失败

如果你在自己的数据库中运行这段代码,可以根据你的实际情况来验证输出结果。

9、DBMS_METADATA包

DBMS_METADATA包是Oracle数据库中用于提取数据库对象元数据(metadata)的包。它提供了一系列过程和函数,可以用来获取数据库对象(如表、视图、索引等)的定义和属性信息,以便进行分析、比较或者重建。

DBMS_METADATA包的一些常见用途包括:

  1. 提取对象定义:可以使用DBMS_METADATA包来提取数据库中的表、视图、索引等对象的定义信息,包括表结构、列定义、约束等。

  2. 生成DDL语句:可以利用DBMS_METADATA包来生成数据库对象的DDL语句,以便在其他环境中重建相同的对象。

  3. 分析和比较对象:可以使用DBMS_METADATA包提取对象的元数据,进行分析和比较,以便了解对象之间的差异。

下面是一个简单的示例,演示了DBMS_METADATA包的一些基本用法:

DECLAREl_metadata CLOB;
BEGIN-- 提取表对象的定义信息l_metadata := DBMS_METADATA.GET_DDL(object_type => 'TABLE',name => 'EMPLOYEE',schema => 'HR');-- 输出提取到的表定义信息DBMS_OUTPUT.PUT_LINE(l_metadata);
END;
/

在这个示例中,我们使用了DBMS_METADATA包中的GET_DDL函数来提取名为EMPLOYEE的表的定义信息,然后将结果存储在l_metadata变量中,并通过DBMS_OUTPUT输出到屏幕上。

由于我无法直接在当前环境中执行PL/SQL代码,因此无法提供完整的输出结果。但是,如果表EMPLOYEE存在于HR模式中,那么输出结果可能是包含该表定义的DDL语句,类似于:

CREATE TABLE "HR"."EMPLOYEE"(    "ID" NUMBER(10,0),"NAME" VARCHAR2(50),"DEPARTMENT" VARCHAR2(50),CONSTRAINT "EMPLOYEE_PK" PRIMARY KEY ("ID"));

如果你在自己的数据库中运行这段代码,可以根据你的实际情况来验证输出结果。

10、DBMS_APPLICATION_INFO包

DBMS_APPLICATION_INFO包是Oracle数据库中用于设置和获取当前会话的应用程序信息的包。它提供了一些过程和函数,可以用于在会话级别设置和获取应用程序相关的信息,这些信息可以用于监控和诊断数据库会话的活动。

DBMS_APPLICATION_INFO包的一些常见用途包括:

  1. 设置会话信息:可以使用DBMS_APPLICATION_INFO包来设置当前会话的应用程序名称、模块名称和动作名称等信息,以便在数据库监控工具中进行跟踪和诊断。

  2. 获取会话信息:可以利用DBMS_APPLICATION_INFO包来获取当前会话的应用程序名称、模块名称和动作名称等信息,以便进行数据库会话的监控和分析。

下面是一个简单的示例,演示了DBMS_APPLICATION_INFO包的一些基本用法:

BEGIN-- 设置会话的应用程序信息DBMS_APPLICATION_INFO.SET_MODULE(module_name => 'Sales Application',action_name => 'View Customer Details');
END;
/

在这个示例中,我们使用了DBMS_APPLICATION_INFO包中的SET_MODULE过程来设置当前会话的应用程序模块名称和动作名称。这样可以在数据库监控工具中查看当前会话正在执行的应用程序模块和动作。

另外,我们还可以使用SET_ACTION过程来设置会话的动作名称,使用READ_MODULEREAD_ACTION函数来获取当前会话的应用程序模块名称和动作名称。

11、DBMS_CRYPTO包

如果成功执行了设置应用程序信息的代码,那么可以在数据库监控工具中查看到相应的应用程序模块和动作信息。

DBMS_CRYPTO包是Oracle数据库中用于加密和解密数据的包。它提供了一些过程和函数,可以用于对数据进行加密和解密操作,以及生成哈希值等安全相关的功能。

DBMS_CRYPTO包的一些常见用途包括:

  1. 数据加密:可以使用DBMS_CRYPTO包对敏感数据进行加密,以保护数据在存储和传输过程中的安全性。

  2. 数据解密:可以利用DBMS_CRYPTO包对已加密的数据进行解密,以便在需要时获取原始的明文数据。

  3. 哈希计算:可以使用DBMS_CRYPTO包来生成数据的哈希值,用于验证数据的完整性和一致性。

下面是一个简单的示例,演示了DBMS_CRYPTO包的一些基本用法:

DECLAREl_key RAW(16);l_data VARCHAR2(100) := 'Hello, world!';l_encrypted_data RAW(2000);l_decrypted_data VARCHAR2(100);
BEGIN-- 生成加密密钥l_key := DBMS_CRYPTO.RANDOMBYTES(16);-- 对数据进行加密l_encrypted_data := DBMS_CRYPTO.ENCRYPT(src => UTL_RAW.CAST_TO_RAW(l_data),typ => DBMS_CRYPTO.AES_CBC_PKCS5,key => l_key);-- 对加密数据进行解密l_decrypted_data := UTL_RAW.CAST_TO_VARCHAR2(DBMS_CRYPTO.DECRYPT(src => l_encrypted_data,typ => DBMS_CRYPTO.AES_CBC_PKCS5,key => l_key));-- 输出加密和解密结果DBMS_OUTPUT.PUT_LINE('Original data: ' || l_data);DBMS_OUTPUT.PUT_LINE('Encrypted data: ' || l_encrypted_data);DBMS_OUTPUT.PUT_LINE('Decrypted data: ' || l_decrypted_data);
END;
/

在这个示例中,我们使用了DBMS_CRYPTO包中的RANDOMBYTES函数来生成一个16字节的随机密钥,然后使用ENCRYPT过程对数据进行加密,再使用DECRYPT过程对加密数据进行解密。最后,我们通过DBMS_OUTPUT输出了原始数据、加密数据和解密数据。

请注意,由于加密和解密涉及到密钥管理等安全敏感的操作,实际应用中需要谨慎处理。

相关文章:

Oracle常见内置程序包的使用Package

Oracle常见内置程序包的使用 点击此处可跳转至&#xff1a;Oracle的程序包(Package)&#xff0c;对包的基础进行学习常见内置程序包的使用Package1、DBMS_OUTPUT包2、DBMS_XMLQUERY包3、DBMS_RANDOM包4、UTL_FILE包5、DBMS_JOB包6、DBMS_LOB包7、DBMS_SQL包8、DBMS_LOCK包9、DB…...

Flutter:视频下载案例

前言 最近在研究视频下载&#xff0c;因此打算一边研究一边记录一下。方便以后使用时查看。 使用到的库有&#xff1a; permission_handler 11.1.0 &#xff1a;权限请求 flutter_downloader 1.11.5&#xff1a;文件下载器 path_provider 2.1.1&#xff1a;路径处理 视频…...

要求CHATGPT高质量回答的艺术:提示工程技术的完整指南

要求CHATGPT高质量回答的艺术&#xff1a;提示工程技术的完整指南 第2章&#xff1a;指令提示技术 现在&#xff0c;让我们开始探索“指令提示技术”&#xff0c;以及如何使用它从ChatGPT生成高质量的文本。 指令提示技术是一种通过为模型提供特定指令来指导ChatGPT输出的方…...

JDK 历史版本下载以及指定版本应用

参考&#xff1a; 官网下载JAVA的JDK11版本&#xff08;下载、安装、配置环境变量&#xff09;_java11下载-CSDN博客 Gradle&#xff1a;执行命令时指定 JDK 版本 - 微酷网 下载 打开官网地址 Java Downloads | Oracle 当前版本在这里&#xff0c;但是我们要下载历史版本 选…...

Linux基础项目开发1:量产工具——UI系统(五)

前言&#xff1a; 前面我们已经把显示系统、输入系统、文字系统搭建好了&#xff0c;现在我们就要给它实现按钮操作了&#xff0c;也就是搭建UI系统&#xff0c;下面让我们一起实现UI系统的搭建吧 目录 一、按钮数据结构抽象 ui.h 二、按键编程 1.button.c 2.disp_manager…...

面试就是这么简单,offer拿到手软(四)—— 常见java152道基础面试题

面试就是这么简单&#xff0c;offer拿到手软&#xff08;一&#xff09;—— 常见非技术问题回答思路 面试就是这么简单&#xff0c;offer拿到手软&#xff08;二&#xff09;—— 常见65道非技术面试问题 面试就是这么简单&#xff0c;offer拿到手软&#xff08;三&#xff…...

深入理解Redis分片策略:提升系统性能的关键一步

目录 引言 1. 一致性哈希算法 2. 范围分片 3. 哈希槽分片 实战经验分享 结论 引言 Redis作为一款高性能的键值存储系统&#xff0c;为了应对大规模数据和高并发的访问&#xff0c;引入了分片策略&#xff0c;使得数据能够分布存储在多个节点上&#xff0c;实现系统的横向…...

【数据结构(七)】查找算法

文章目录 查找算法介绍1. 线性查找算法2. 二分查找算法2.1. 思路分析2.2. 代码实现2.3. 功能拓展 3. 插值查找算法3.1. 前言3.2. 相关概念3.3. 实例应用 4. 斐波那契(黄金分割法)查找算法4.1. 斐波那契(黄金分割法)原理4.2. 实例应用 查找算法介绍 在 java 中&#xff0c;我们…...

Android画布Canvas绘制drawBitmap基于源Rect和目的Rect,Kotlin

Android画布Canvas绘制drawBitmap基于源Rect和目的Rect&#xff0c;Kotlin <?xml version"1.0" encoding"utf-8"?> <androidx.appcompat.widget.LinearLayoutCompat xmlns:android"http://schemas.android.com/apk/res/android"xmlns…...

深度优先搜索LeetCode979. 在二叉树中分配硬币

给你一个有 n 个结点的二叉树的根结点 root &#xff0c;其中树中每个结点 node 都对应有 node.val 枚硬币。整棵树上一共有 n 枚硬币。 在一次移动中&#xff0c;我们可以选择两个相邻的结点&#xff0c;然后将一枚硬币从其中一个结点移动到另一个结点。移动可以是从父结点到…...

C++学习之路(十)C++ 用Qt5实现一个工具箱(增加一个时间戳转换功能)- 示例代码拆分讲解

上篇文章&#xff0c;我们用 Qt5 实现了在小工具箱中添加了《JSON数据格式化》功能&#xff0c;还是比较实用的。为了继续丰富我们的工具箱&#xff0c;今天我们就再增加一个平时经常用到的功能吧&#xff0c;就是「 时间戳转换 」功能&#xff0c;而且实现点击按钮后文字进行变…...

Linux 5.15安全特性之ARM64 PAC

ARM64 PAC&#xff08;Pointer Authentication Code&#xff09;机制是ARM架构中引入的一种安全特性&#xff0c;旨在提供指针的完整性和安全性保护。它通过在指针中插入一段额外的代码进行签名&#xff0c;以验证指针的完整性&#xff0c;从而抵御缓冲区溢出和代码注入等攻击。…...

同旺科技 分布式数字温度传感器

内附链接 1、数字温度传感器 主要特性有&#xff1a; ● 支持PT100 / PT1000 两种铂电阻&#xff1b; ● 支持 2线 / 3线 / 4线 制接线方式&#xff1b; ● 支持5V&#xff5e;17V DC电源供电&#xff1b; ● 支持电源反接保护&#xff1b; ● 支持通讯波特率1200bps、2…...

状态空间的定义

状态空间是描述一个系统所有可能状态的集合。在系统理论、控制论、计算机科学、强化学习等领域&#xff0c;状态空间是一种常见的概念。 状态空间框架是一种用于描述和分析系统的方法&#xff0c;它包括系统的状态、状态之间的转移关系以及与状态相关的行为。下面详细解释状态…...

数据挖掘实战-基于word2vec的短文本情感分析

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…...

大数据面试总结

1、冒泡排序、选择排序 2、二分查找 3、 hashmap和hashtable的区别&#xff1f;hashmap的底层实现原理&#xff1f; a、hashtable和hashmap的区别&#xff1a; 1、hashtable是线程安全的&#xff0c;会在每一个方法中都添加方法synchronize&#xff08;同步机制&#xff09…...

利大于弊:物联网技术对电子商务渠道的影响

For Better or For Worse: Impacts of IoT Technology in e-Commerce Channel 物联网技术使用传感器和其他联网设备来手机和共享数据&#xff0c;并且被视为一种可以为供应链成员带来巨大的机会的突破性技术。本文的研究背景是&#xff1a;一个提供物联网基础设备的电子商务平…...

Python 元组详解(tuple)

文章目录 1 概述1.1 性质1.2 下标1.3 切片 2 常用方法2.1 访问&#xff1a;迭代、根据下标2.2 删除&#xff1a;del2.3 运算符&#xff1a;、*2.4 计算元组中元素个数&#xff1a;len()2.5 返回元组中元素最大值&#xff1a;max()2.6 返回元组中元素最小值&#xff1a;min()2.7…...

Redis部署-主从模式

目录 单点问题 主从模式 解析主从模式 配置redis主从模式 info replication命令查看复制相关的状态 断开复制关系 安全性 只读 传输延迟 拓扑结构 数据同步psync replicationid offset psync运行流程 全量复制流程 无硬盘模式 部分复制流程 积压缓冲区 实时复…...

全栈冲刺 之 一天速成MySQL

一、为什么使用数据库 数据储存在哪里&#xff1f; 硬盘、网盘、U盘、光盘、内存&#xff08;临时存储&#xff09; 数据持久化 使用文件来进行存储&#xff0c;数据库也是一种文件&#xff0c;像excel &#xff0c;xml 这些都可以进行数据的存储&#xff0c;但大量数据操作…...

服务器运行train.py报错解决

在服务器配置完虚拟环境以及安装完各种所需库后&#xff0c;发现报错Traceback (most recent call last): File "/root/yolov5-master/yolov5-master/train.py", line 48, in <module> import val as validate # for end-of-epoch mAP File "/root/yolov5…...

Flutter开发type ‘Future<int>‘ is not a subtype of type ‘int‘ in type cast错误

文章目录 问题描述错误源码 问题分析解决方法修改后的代码 问题描述 今天有个同事调试flutter程序时报错&#xff0c;问我怎么解决&#xff0c;程序运行时报如下错误&#xff1a; type ‘Future’ is not a subtype of type ‘int’ in type cast 错误源码 int order Databas…...

Nginx(十二) gzip gzip_static sendfile directio aio 组合使用测试(2)

测试10&#xff1a;开启gzip、sendfile、aio、directio1m&#xff0c;关闭gzip_static&#xff0c;请求/index.js {"time_iso8601":"2023-11-30T17:20:5508:00","request_uri":"/index.js","status":"200","…...

hls实现播放m3u8视频将视频流进行切片 HLS.js简介

github官网GitHub - video-dev/hls.js: HLS.js is a JavaScript library that plays HLS in browsers with support for MSE.HLS.js is a JavaScript library that plays HLS in browsers with support for MSE. - GitHub - video-dev/hls.js: HLS.js is a JavaScript library …...

Ubuntu20.04部署TVM流程及编译优化模型示例

前言&#xff1a;记录自己安装TVM的流程&#xff0c;以及一个简单的利用TVM编译模型并执行的示例。 1&#xff0c;官网下载TVM源码 git clone --recursive https://github.com/apache/tvmgit submodule init git submodule update顺便完成准备工作&#xff0c;比如升级cmake版本…...

华为OD机试真题-两个字符串间的最短路径问题-2023年OD统一考试(C卷)

题目描述: 给定两个字符串,分别为字符串A与字符串B。例如A字符串为ABCABBA,B字符串为CBABAC可以得到下图m*n的二维数组,定义原点为(0, 0),终点为(m, n),水平与垂直的每一条边距离为1,映射成坐标系如下图。 从原点(0, 0)到(0, A)为水平边,距离为1,从(0, A)到(A, C)为垂…...

python try-except

相比于直接raise ValueError&#xff0c;使用try-except可以使程序在发生异常后仍然能够运行。 在try的部分中&#xff0c;当遇到第一个Error&#xff0c;就跳转到except中寻找对应类型的error&#xff0c;后续代码不再执行&#xff0c;如果try中有多个Error&#xff0c;注意顺…...

flutter开发实战-ValueListenableBuilder实现局部刷新功能

flutter开发实战-ValueListenableBuilder实现局部刷新功能 在创建的新工程中&#xff0c;点击按钮更新counter后&#xff0c;通过setState可以出发本类的build方法进行更新。当我们只需要更新一小部分控件的时候&#xff0c;通过setState就不太合适了&#xff0c;这就需要进行…...

通过时间交织技术扩展ADC采样速率的简要原理

前言 数据采集是将自然界中存在的模拟信号通过模数转换器&#xff08;ADC&#xff09;转换成数字信号&#xff0c;再对该数字信号进行相应的接收和处理。数据采集系统作为数据采集的手段&#xff0c;在移动通信、图向采集、无线电等领域有重要作用。随着电子信息技术的飞速发展…...

FluxMQ—2.0.8版本更新内容

FluxMQ—2.0.8版本更新内容 前言 FLuxMQ是一款基于java开发&#xff0c;支持无限设备连接的云原生分布式物联网接入平台。FluxMQ基于Netty开发&#xff0c;底层采用Reactor3反应堆模型&#xff0c;具备低延迟&#xff0c;高吞吐量&#xff0c;千万、亿级别设备连接&#xff1…...

公司委托建设网站合同范本/成品短视频网站源码搭建

从上一周周一学习KMP算法之后&#xff0c;每天晚上都失眠到1点过起夜&#xff0c;身体再疲倦脑子都异常清醒&#xff0c;要死了要死了。 kmp算法真的有毒。 这个题&#xff0c;我用优先队列记录最小的下标&#xff0c;用Map记录每个数字是第几天&#xff0c;然后让那个值和队列…...

网站突然消失了/域名怎么注册

构造思路&#xff1a; 1.socket 连接获取 Banner --> 2.与存在漏洞的 Banner 集合进行对比 中间细节&#xff1a; 1.需要判断用户所给参数是否存在且是否有读权限 2.需要判断 Banner 是否存在&#xff0c;处理异常 学习 os sys socket 各个模块的基本使用 直接上代码&…...

高职图书馆网站建设大赛/产品营销策略有哪些

一、申请条件(以下各条必须同时满足)1、完成硕士阶段全部课程学习&#xff0c;且成绩优良。2、外语水平优秀&#xff1a;外语成绩应获得全国大学英语六级460分及以上&#xff0c;或托福机考80分以上&#xff0c;或雅思≥5.5以上(有效期5年&#xff0c;即2010年12月及以后的成绩…...

全球最好的黄页网站/域名解析ip

如果对您有帮助&#xff0c;请点赞告诉我&#xff0c;如果没有解决您的疑惑&#xff0c;请您留言&#xff0c;我陪您一起努力解决&#xff01;这里只介绍常用的一些概念&#xff0c;一些极少用到的概念为避免混淆这里不做介绍。 简单的来说&#xff0c;BLE的服务端属性数据库可…...

做设计的靠谱兼职网站有哪些/项目外包平台

python 3 的安装&#xff1a; 背景&#xff1a;之前都是在Pychram上写&#xff0c;我的windows下的python版本是3.5,今天要把一个小脚本上到生产环境上。无奈我服务器上的python版本是2.6.6。所以这里记录一下我安装python3 的过程。 版本下载&#xff1a;https://www.python.o…...

qq自动发货平台网站怎么做/谷歌商店app下载

计算机在翻译中作用探析计算机在翻译中作用探析   摘 要&#xff1a;计算机翻译是涉及语言学、数学、计算机科学和人工智能等多种学科和技术的综合性课题&#xff0c;被列为21世纪世界十大科技难题。从上世纪80年代中期开始&#xff0c;基于语料和多引擎机译方法的广泛运用&a…...