SYS_OP_MAP_NONNULL NULL的等值比较

无意在数据库中发现了这个操作SYS_OP_MAP_NONNULL。

 

 

SYS_OP_MAP_NONNULL应该不是数据库中的对象,因为在DBA_OBJECTS中根本找不到它,而在STANDARD和DBMS_STANDARD包中也找不到函数说明。

SQL> SELECT *
  2  FROM DBA_OBJECTS
  3  WHERE OBJECT_NAME = 'SYS_OP_MAP_NONNULL';

未选定行

SQL> SELECT *
  2  FROM DBA_SOURCE
  3  WHERE UPPER(TEXT) LIKE '%SYS_OP_MAP_NONNULL%';

未选定行

SYS_OP_MAP_NONNULL又可以跟参数,它不符合伪列的特性,因此暂且认为这是一个操作。不过文档中并没有这个操作的任何相关记录。

其实这个操作实现的就是DUMP函数的功能:

SQL> SELECT SYS_OP_MAP_NONNULL(5) FROM DUAL;

SYS_OP
------
C10600

SQL> SELECT SYS_OP_MAP_NONNULL('A') FROM DUAL;

SYS_
----
4100

SQL> SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS'), SYS_OP_MAP_NONNULL(SYSDATE) FROM DUAL;

TO_CHAR(SYSDATE,'YY SYS_OP_MAP_NONNU
------------------- ----------------
2010-08-06 02:19:47 786E080603143000

SQL> SELECT SYS_OP_MAP_NONNULL(NULL) FROM DUAL;

SY
--
FF

和DUMP的区别在于NULL的处理上,DUMP的参数如果是NULL,返回结果也是NULL,而SYS_OP_MAP_NONNULL返回的是FF,而这正是NULL存储在数据块中的编码。

SQL> SELECT DUMP(NULL) FROM DUAL;

DUMP
----
NULL

可以认为SYS_OP_MAP_NONNULL返回的就是这个数据类型存储的编码:

SQL> CREATE TABLE T_TEST          
  2  (ID NUMBER,
  3  C1 LONG,
  4  C2 CLOB);

表已创建。

SQL> INSERT INTO T_TEST
  2  VALUES (1, 'ABC', 'DEF');

已创建 1 行。

SQL> SELECT DUMP(C1) FROM T_TEST;
SELECT DUMP(C1) FROM T_TEST
            *
第 1 行出现错误:
ORA-00997: 非法使用 LONG 数据类型


SQL> SELECT DUMP(C2) FROM T_TEST;
SELECT DUMP(C2) FROM T_TEST
            *
第 1 行出现错误:
ORA-00932: 数据类型不一致: 应为 -, 但却获得 CLOB


SQL> SELECT SYS_OP_MAP_NONNULL(C1) FROM T_TEST;

SYS_OP_MAP_NONNULL(C1)
--------------------------------------------------------------------------------------------
01000186000000D104000000820100012A9013002A90130008003F00E83F000000000000000000000000D7D103003200030000000000000060000000909500D1030100000000000000000000000000000000000000000000000000000000000000000000080000005496D7D10301000004002A009E0900004400C0006C0E150


SQL> SELECT SYS_OP_MAP_NONNULL(C2) FROM T_TEST;

SYS_OP_MAP_NONNULL(C2)
-------------------------------------------------------------------------------------------
006A0001020C8800000200000001000000AB8D630013902B0013902A000300030354000100440045004600000000000000000000D1D7965701030004002A0000099E00C000440E6C150000000013902A0100018600000016090000000000000600000000000100440045004600

二者还有一个很重要的区别就是DUMP不支持LONG以及大对象,而SYS_OP_MAP_NONNULL则支持任意的数据类型。

利用Oracle的这个功能,可以更方便的检查数据的存储格式。

---------------null比较

Oracle的Null真是个麻烦的东西。

不能与其他变量进行比较,甚至不能和NULL进行比较。

仅仅能用IS (NOT) NULL。

来看这个实验,看看能不能知道执行的结果。

先准备数据:

执行一个查询,来猜猜结果

执行结果如下,是你的预期吗?

从结果来看,两行null被合并了。

问题来了,知道null和null是绝对不相等的,为什么会合并掉呢?

经查证,这里ORACLE内部用了个未公开的函数sys_op_map_nonnull

我们来测试一下这个函数

对于NULL

对于非NULL

我们看sys_op_map_nonnull(null)=FF,而FF这正是NULL存储在数据块中的编码。

利用该函数对两个NULL进行比较。

但是不要走火入魔,这种非公开函数不要在项目中使用,因为Oracle不会对它出现的问题负责哦。

项目中如果需要对可为NULL的变量进行比较操作,还是老老实实前面加是否为NULL的判断,再比较吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/781.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言---函数和数组实践:扫雷游戏

函数和数组实践:扫雷游戏 在这次的实践项目中,需要编写一个可以在在控制台运行的经典的扫雷游戏。 一、游戏要求 游戏有菜单,可以通过菜单实现继续玩或者退出游戏游戏要求棋盘9*9,雷(10个)要求随机布置可…

Web开发中页面出现乱码的解决(Java Web学习笔记:需在编译时用 -encoding utf-8)

目录 1 引言2 乱码表现、原因分析及解决2.1 乱码表现2.2 原因分析2.3 解决 3 总结 1 引言 Web开发的页面出现了乱码,一直不愿写出来,因为网上的解决方案太多了。但本文的所说的页面乱码问题,则是与网上的大多数解决方案不一样,使…

HarmonyOS:@LocalBuilder装饰器: 维持组件父子关系

一、前言 当开发者使用Builder做引用数据传递时,会考虑组件的父子关系,使用了bind(this)之后,组件的父子关系和状态管理的父子关系并不一致。为了解决组件的父子关系和状态管理的父子关系保持一致的问题,引入LocalBuilder装饰器。…

初学stm32 --- DAC输出三角波和正弦波

输出三角波实验简要: 1,功能描述 通过DAC1通道1(PA4)输出三角波,然后通过DS100示波器查看波形 2,关闭通道1触发(即自动) TEN1位置0 3,关闭输出缓冲 BOFF1位置1 4,使用12位右对齐模式 将数字量写入DAC_…

【opencv】第7章 图像变换

7.1 基 于OpenCV 的 边 缘 检 测 本节中,我们将一起学习OpenCV 中边缘检测的各种算子和滤波器——Canny 算子、Sobel 算 子 、Laplacian 算子以及Scharr 滤波器。 7.1.1 边缘检测的一般步骤 在具体介绍之前,先来一起看看边缘检测的一般步骤。 1.【第…

【Python】Python与C的区别

文章目录 语句结束符代码块表示变量声明函数定义注释格式Python的标识符数据输入input()函数数据输出print()函数 语句结束符 C 语言 C 语言中每条语句必须以分号;结束。例如,int a 10;、printf("Hello, World!");。分号是语句的一部分,用于…

web-app uniapp监测屏幕大小的变化对数组一行展示数据作相应处理

web-app uniapp监测屏幕大小的变化对数组一行展示数据作相应处理 1.uni.getSystemInfoSync().screenWidth; 获取屏幕宽度 2.uni.onWindowResize() 实时监测屏幕宽度变化 3.根据宽度的大小拿到每行要展示的数量itemsPerRow 4.为了确保样式能够根据 items…

Idea-离线安装SonarLint插件地址

地址: SonarQube for IDE - IntelliJ IDEs Plugin | Marketplace 选择Install Plugin from Disk..,选中下载好的插件,然后重启idea

数据结构与算法之二叉树: LeetCode 637. 二叉树的层平均值 (Ts版)

二叉树的层平均值 https://leetcode.cn/problems/average-of-levels-in-binary-tree/description/ 描述 给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值与实际答案相差 1 0 − 5 10^{-5} 10−5 以内的答案可以被接受 示例 1 输入:root…

MySQL表的增删改查(基础)-下篇

修改 真正在改硬盘了,这样的修改是“持久有效”。一定要确保,update的修改是改对了,改出问题来就麻烦。指定update的时候,如果当前不指定任何条件,就会针对所有的行都能生效! (把整个表都给改了)。 案例 --…

项目开发实践——基于SpringBoot+Vue3实现的在线考试系统(五)

文章目录 一、学生管理模块功能实现1、添加学生功能实现1.1 页面设计1.2 前端功能实现1.3 后端功能实现1.4 效果展示2、学生管理功能实现2.1 页面设计2.2 前端功能实现2.3 后端功能实现2.3.1 后端查询接口实现2.3.2 后端编辑接口实现2.3.3 后端删除接口实现2.4 效果展示二、代码…

使用 WPF 和 C# 绘制图形

绘图困难 此示例展示了如何在 WPF 和 C# 中绘制图形。绘制图形总是很棘手,因为您通常需要在至少两个不同的坐标系中工作。首先,您要为图形使用世界坐标。例如,您可能希望 X 值的范围为 2000 年至 2020 年,Y 值的范围为 10,000 美元…

3D滤波器处理遥感tif图像

import cv2 import numpy as np from osgeo import gdal# 定义 Gabor 滤波器的参数 kSize 31 # 滤波器核的大小 g_sigma 3.0 # 高斯包络的标准差 g_theta np.pi / 4 # Gabor 函数的方向 g_lambda 10.0 # 正弦波的波长 g_gamma 0.5 # 空间纵横比 g_psi np.pi / 2 # …

JuiceFS 2024:开源与商业并进,迈向 AI 原生时代

即将过去的 2024 年,是 JuiceFS 开源版本推出的第 4 年,企业版的第 8 个年头。回顾过去这一年,JuiceFS 社区版依旧保持着快速成长的势头,GitHub 星标突破 11.1K,各项使用指标增长均超过 100%,其中文件系统总…

高可用虚拟IP-keepalived

个人觉得华为云这个文档十分详细:使用虚拟IP和Keepalived搭建高可用Web集群_弹性云服务器 ECS_华为云 应用场景:虚拟IP技术。虚拟IP,就是一个未分配给真实主机的IP,也就是说对外提供数据库服务器的主机除了有一个真实IP外还有一个…

支付宝租赁小程序提升租赁行业效率与用户体验

内容概要 在当今数字化的世界里,支付宝租赁小程序的出现构建了一种新的租赁模式,使得用户在使用过程中体验更加流畅。想象一下,你在寻找租赁服务时,不再需要繁琐的流程和冗长的等待,只需通过手机轻松点击几下&#xf…

python异常机制

异常是什么? 软件程序在运行过程中,非常可能遇到刚刚提到的这些问题,我们称之为异常,英文是Exception,意思是例外。遇到这些例外情况,或者交异常,我们怎么让写的程序做出合理的处理&#xff0c…

Git撤销指定commit并更新远端仓库

Git撤销指定commit并更新远端仓库 一、撤销指定commit 1.首先执行git log 命令,查看git历史提交以及commit信息: 由于需要脱敏,所以截图可能看得马赛克比较多,需要关注的就是上面的commit后跟的id,以及HEAD当前指定…

【opencv】第8章 图像轮廓与图像分割修复

8.1 查找并绘制轮廓 一个轮廓一般对应一系列的点,也就是图像中的一条曲线。其表示方法可能 根据不同的情况而有所不同。在OpenCV 中,可以用findContours()函数从二值图 像中查找轮廓 8.1.1 寻找轮廓: findContours() 函数 findContours) 函…

.NET Core NPOI 导出图片到Excel指定单元格并自适应宽度

NPOI:支持xlsx,.xls,版本>2.5.3 XLS:HSSFWorkbook,主要前缀HSS, XLSX:XSSFWorkbook,主要前缀XSS,using NPOI.XSSF.UserModel; 1、导出Excel添加图片效果&#xff0…