Simply put, I’d like to be able to convert any string to an integer, preferably being able to restrict the size of the integer and ensure that the result is always identical. In other words is there a hashing function, supported by Oracle, that returns a numeric value and can that value have a maximum?
To provide some context if needed, I have two tables that have the following, simplified, format:
Table 1 Table 2 id | sequence_number id | sequence_number -------------------- ------------- 1 | 1 1 | 2QD44561 1 | 2 1 | 6HH00244 2 | 1 2 | 5DH08133 3 | 1 3 | 7RD03098 4 | 2 4 | 8BF02466
The column sequence_number is number(3) in Table 1 and varchar2(11) in Table 2; it is part of the primary key in both tables.
The data is externally provided and cannot be changed; in Table 1 it is, I believe, created by a simple sequence but in Table 2 has a meaning. The data is made up but representative.
Someone has promised that we would output a number(3) field. While this is fine for the column in the first table, it causes problems for the second.
I would like to be able to both convert sequence_number to an integer (easy), that is less than 1000 (harder) and if at all possible is constant (seemingly impossible). This means that I would like '2QD44561' to always return 586. It does not matter, much, if two strings return the same number.
Simply converting to an integer I can use utl_raw.cast_to_number():
select utl_raw.cast_to_number((utl_raw.cast_to_raw('2QD44561'))) from dual;
UTL_RAW.CAST_TO_NUMBER((UTL_RAW.CAST_TO_RAW('2QD44561')))
---------------------------------------------------------
-2.033E+25
But as you can see this isn’t less than 1000
I’ve also been playing around with dbms_crypto and utl_encode to see if I could come up with something but I’ve not managed to get a small integer. Is there a way?
How about
ora_hash?… will produce a maximum of 3 digits. You could also seed it with the
idI suppose, but not sure that adds much with so few values, and I’m not sure you’d want that anyway.