动态魔术使用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

相关文章

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

在MySQL执行UPDATE语句时遇到的错误1175的解决方案

《在MySQL执行UPDATE语句时遇到的错误1175的解决方案》MySQL安全更新模式(SafeUpdateMode)限制了UPDATE和DELETE操作,要求使用WHERE子句时必须基于主键或索引... mysql 中遇到的 Error Code: 1175 是由于启用了 安全更新模式(Safe Upd

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

Java数字转换工具类NumberUtil的使用

《Java数字转换工具类NumberUtil的使用》NumberUtil是一个功能强大的Java工具类,用于处理数字的各种操作,包括数值运算、格式化、随机数生成和数值判断,下面就来介绍一下Number... 目录一、NumberUtil类概述二、主要功能介绍1. 数值运算2. 格式化3. 数值判断4. 随机

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri

Springboot 中使用Sentinel的详细步骤

《Springboot中使用Sentinel的详细步骤》文章介绍了如何在SpringBoot中使用Sentinel进行限流和熔断降级,首先添加依赖,配置Sentinel控制台地址,定义受保护的资源,... 目录步骤 1: 添加 Sentinel 依赖步骤 2: 配置 Sentinel步骤 3: 定义受保护的

Python中Markdown库的使用示例详解

《Python中Markdown库的使用示例详解》Markdown库是一个用于处理Markdown文本的Python工具,这篇文章主要为大家详细介绍了Markdown库的具体使用,感兴趣的... 目录一、背景二、什么是 Markdown 库三、如何安装这个库四、库函数使用方法1. markdown.mark

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多