动态魔术使用DBMS_SQL

2024-04-30 12:18

本文主要是介绍动态魔术使用DBMS_SQL,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

动态SQL / PLSQL被认为是Oracle PL / SQL中最高级的主题之一。尽管它根本不是一个新主题,但它仍然是消化和掌握最具挑战性的概念之一。

动态SQL只是SQL代码的任何部分,在编译之前未明确写入。因此,例如,如果您不知道SQL查询中的“WHERE”谓词,则必须使用动态SQL。Oracle为我们提供了两种不同的方法来构建动态SQL / plsql代码,第一种是NativeDynamic SQL(NDS)。使用优雅,易于使用EXECUTE IMMEDIATEOPEN.. FOR 语句,这种方法是在场景中超过90%绰绰有余。但剩下的10%呢?这是它变得更复杂的地方。

当面对动态SQL方法四,你需要你的代码执行包含不同数量的绑定变量的动态SQL语句时,NDS是不够的,因为使用NDS,你需要知道列数和数据类型你要检索它们(列类型)。Oracle提供了一种替代(实际上更老)的方法来处理代码需要超级动态的最极端情况,那就是DBMS_SQL包。

DBMS_SQL能够处理您可能遇到的所有未知数。使用DBMS_SQL时,使用DBMS_SQL游标时只使用特殊的游标类型(不是我们知道的常规游标,并且总是使用它),并且只获取唯一的游标ID。然后,我们获得完整的表描述,包括列的类型和属性。使用所有这些信息,我们可以将数据提取到正确类型的变量中。该过程通常如下进行:

  1. 定义一个游标; 只是一个ID
  2. 建立你的查询; 您将要执行的查询
  3. 使用您的查询解析光标并检查查询中的任何错误。
  4. 绑定变量(如果有)。
  5. 获取表格描述; 列数和类型信息。
  6. 定义列并将它们链接到正确的变量。
  7. 执行游标和查询。
  8. 从列中获取实际数据。
  9. 欣赏你的代码!

现在,让我们谈谈我们想象中的情景。出于某种原因,我们需要创建一个可用作“数据库”的表来存储来自任何其他表的任何类型的数据,并将其保存为加密形式。我们必须这样做,只有将数据删除到“保险库”的人才能解密并检索它。

为此,我们需要许多部分,例如一些自定义数据类型和对象,但更重要的是,我们必须构建一个能够从任何表中收集数据并加密然后存储在Vault中的函数。

请注意,该函数的编写方式使得可以在不知道任何表的情况下处理任何表,那么我们唯一的工具是什么呢?很简单,这是DBMS_SQL包!

使用Data Vault虚构函数,我将尝试演示和解释依赖于DBMS_SQL的基于动态SQL的函数的最重要,实用的组件。

最后一点,这是一个教程,旨在演示如何使用DBMS_SQL,因此它不是100%生产就绪,许多东西可以增强,甚至可以用其他方式完成。还有一些安全问题,但同样,它是关于DBMS_SQL的。

安装程序

1.我构建了一个原始类型的嵌套表来存储将存储在Vault中的加密数据。

CREAT OR REPLACE TYPE raw_tab AS NESTED TABLE OF RAW(2000)

2.为了存储列信息,我创建了一个模仿DBMS_SQL_DESC类型的对象,我还创建了一个该对象的嵌套表来保存有关所有表列的信息。

 艾哈迈德创建 替换 类型“COL_INFO_OBJ”   对象
    column_type NUMBER
    column_name VARCHAR232),
    column_name_len NUMBER
    column_schema_name VARCHAR232),
    column_precision NUMBER
    column_scale NUMBER
);
/

CREATE OR REPLACE TYPE COL_INFO_OBJ_T AS TABLE OF col_info_obj;

/

我选择创建两张桌子; 一个是将要存储加密数据的保险库本身,另一个是保存有关插入操作的信息的主记录,在构建恢复/解密功能或过程时非常重要。为了演示NDS与DBMS_SQL一起使用,如果其中任何一个表不存在,该函数将创建所需的表。

功能 dynamic_vault_ins(table_name IN  VARCHAR2,cond IN  VARCHAR2  DEFAULT'1  = 1'
                enc_key IN  VARCHAR2  DEFAULT  NULL,del_flag VARCHAR2  DEFAULT  '否'
            返回 号码 
 
    encrypt_typ       NUMBER:= DBMS_CRYPTO.encrypt_aes256 + DBMS_CRYPTO.chain_cbc + DBMS_CRYPTO.pad_pkcs5;
    enc_key_var       VARCHAR2256);
    raw_col_v         RAW2000);
    encrypted_col_v   RAW2000);
    encr_row raw_tab:= raw_tab();
    sql_query         VARCHAR22000);
    col_count         NUMBER ;
    col_desc DBMS_SQL.desc_tab:= DBMS_SQL.desc_tab();
    cur_id   

这篇关于动态魔术使用DBMS_SQL的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/948835

相关文章

MySQL 多表连接操作方法(INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN)

《MySQL多表连接操作方法(INNERJOIN、LEFTJOIN、RIGHTJOIN、FULLOUTERJOIN)》多表连接是一种将两个或多个表中的数据组合在一起的SQL操作,通过连接,... 目录一、 什么是多表连接?二、 mysql 支持的连接类型三、 多表连接的语法四、实战示例 数据准备五、连接的性

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

MySQL中的分组和多表连接详解

《MySQL中的分组和多表连接详解》:本文主要介绍MySQL中的分组和多表连接的相关操作,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录mysql中的分组和多表连接一、MySQL的分组(group javascriptby )二、多表连接(表连接会产生大量的数据垃圾)MySQL中的

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

使用Python和Pyecharts创建交互式地图

《使用Python和Pyecharts创建交互式地图》在数据可视化领域,创建交互式地图是一种强大的方式,可以使受众能够以引人入胜且信息丰富的方式探索地理数据,下面我们看看如何使用Python和Pyec... 目录简介Pyecharts 简介创建上海地图代码说明运行结果总结简介在数据可视化领域,创建交互式地

Java Stream流使用案例深入详解

《JavaStream流使用案例深入详解》:本文主要介绍JavaStream流使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录前言1. Lambda1.1 语法1.2 没参数只有一条语句或者多条语句1.3 一个参数只有一条语句或者多

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式