SQL 在Oracle中把整数转换成二进制,在 Oracle 数据库中,你想把一个整数转换为二进制形式。例如,你希望返回 EMP
表里的所有工资,以二进制形式显示的工资也要作为结果集的一部分被返回。
SQL 在Oracle中把整数转换成二进制 问题描述
在 Oracle 数据库中,你想把一个整数转换为二进制形式。例如,你希望返回 EMP
表里的所有工资,以二进制形式显示的工资也要作为结果集的一部分被返回,如下所示。
SQL 在Oracle中把整数转换成二进制 解决方案
本解决方案会用到 MODEL
子句,因此需要运行在 Oracle Database 10g 或更新的版本上。MODEL
具有迭代和以数组形式访问行值的能力,选择它来解决本问题是顺理成章的做法。(此处假设我们必须使用 SQL 解决本问题,如果能以函数的形式存在则更加适合。)就像本书的其他实例一样,或许你一时看不到那些解决方案的实际应用场景,但是我建议你重点关注其中展示的技术和技巧。关于 MODEL
子句,我们需要认识到它具有面向过程编程的能力,同时又没有丢掉 SQL 原有的面向集合编程的能力。因此,你可能会说:“我绝对不会用 SQL 做这些事。”这也没有关系。实际上,我不会建议你应该这样做或者不应该那样做。
我只是提醒你把注意力放在本解决方案展示的技术和技巧上,这样今后遇到更适当的场景时,它自然而然就会派上用场。
下面给出的解决方案从 EMP
表中取出了全部 ENAME
和 SAL
,同时又以标量子查询的形式调用了 MODEL
子句。(该标量子查询的作用类似于一个独立存在的函数,接受输入,启动处理过程,最后返回一个值,非常像一个函数做的事。)
SQL 在Oracle中把整数转换成二进制 扩展知识
我在前面的“解决方案”部分中提到过,上述解决方案最好能以函数形式存在。事实上,本实例的灵感确实来自一个函数。我把一个名为 TO_BASE
的函数做了些改编从而写出了本实例,该函数的作者是 Oracle 公司的 Tom Kyte。就像你不会在实际工作中用到本书的其他许多实例一样,本实例的代码也可能对你没有什么实用价值,但不可否认它很好地展示了 MODEL
子句的部分功能,例如迭代和以数组形式访问行值的能力。
为了便于解释,我对上述包含 MODEL
子句的子查询做了一点轻微的改动。下面的代码基本上完全等同于上述解决方案里的那个子查询,但是我让它仅返回数字 2 的二进制形式。
下面的查询输出了上述 RULES
迭代一次的返回值。
START_VAL
代表我们希望把它变成二进制形式的整数,本例中为 2。BIN
的值是针对 0123456789ABCDEF
(别名为 HEX
)执行子字符串操作的结果。NUM
值是为了测试何时退出循环。
如上述结果集所示,第一次循环的运算结果 BIN
等于 0,NUM
等于 1。由于 NUM
不满足小于或等于 0 的条件,因而会再循环一次。下面的 SQL 语句展示了下一次迭代的结果。
下一次循环运算,针对 HEX
执行的子字符串操作结果返回了 1,它后面要接上前一次的 BIN
值 0。测试用的 NUM
现在等于 0,因此这会是最后一次迭代,而返回值 10
是数字 2 的二进制表示。如果你能理解截止目前的代码,则不妨去掉 MODEL
子句里的迭代语法,从而可以一步一步地理解最终结果是如何计算出来,如下所示。