我被要求创建一个函数,它循环遍历字母表A-Z(仅大写),并将其与TIMESTAMP的小数部分连接起来。该函数应始终生成唯一的字符串。
函数是否可以在生成值之前使用not EXISTS之类的东西,从而保证唯一性?我想保留字符串的alpha部分,并生成TIMESTAMP的新小数部分。基本上,函数中的重试逻辑?
最终结果应该会生成一个类似于下面的示例输出
A432635 B227541 C986435...... Z 885525回A A543422 B 008545
我超出了我的联盟,希望有人能帮助我。我下面的尝试是不正确的,因为它是增加字符串的alpha部分的大小,一旦我通过'Z'。
SELECT RPAD (SUBSTR ('ABCDEFGHIJKLMNOPQRSTUVWXYZ'
,DECODE (MOD ( ROWNUM, 26), 0, 26, MOD ( ROWNUM, 26))
,1)
,FLOOR ( (ROWNUM - 1) / 26) + 1
,SUBSTR ('ABCDEFGHIJKLMNOPQRSTUVWXYZ'
,DECODE (MOD ( ROWNUM, 26), 0, 26, MOD ( ROWNUM, 26))
,1))
FROM DUAL
CONNECT BY LEVEL <= 130;
2条答案
按热度按时间f3temu5u1#
我被要求创建一个函数,它循环遍历字母表A-Z(仅大写),并将其与TIMESTAMP的小数部分连接起来。
你可以把函数写成:
这个函数应该总是生成一个唯一的字符串。
不要将你的想法用于函数,因为它最终会产生重复的值。
或者只使用一个序列:
或使用GUID:
但是,在这两种情况下,您都不需要函数,可以直接使用
sequence_name.NEXTVAL
或CAST(SYS_GUID() AS VARCHAR2)
。如果你确实想要一个随机的UUID,那么你可以在数据库中使用Java(如果它被启用):
然后:
输出:
| SEQ|GUID|UUID|
| --------------|--------------|--------------|
| 1|F966F1759FD0956EE053182BA8C0A4A5|F16B2AF4-E5ED-4E13-932F-1F29CA3008CC|
| 二|F966F1759FD1956EE053182BA8C0A4A5|329DF39D-3FB8-4AEF-BF63-46BA51F7709D|
| 三|F966F1759FD2956EE053182BA8C0A4A5|E41DA8EB-2F1B-4488-8D83-0A6D8778C79B|
| 四|F966F1759FD3956EE053182BA8C0A4A5|CCD51797-7FF4-46A1-9AB4-1FBD9DCED447|
| 五|F966F1759FD4956EE053182BA8C0A4A5|73D8C9C9-2BE3-471E-8279-A8A756181B77|
| 六|F966F1759FD5956EE053182BA8C0A4A5|724B1CAC-99BF-4884-8640-0514D5A15D5C|
| 七|F966F1759FD6956EE053182BA8C0A4A5|FBE3B326-4544-4A24-A302-00BD360A52AB|
| 八|F966F1759FD7956EE053182BA8C0A4A5|CE8FCB97-34D3-455B-B628-2DB90951AC7C|
| 九|F966F1759FD8956EE053182BA8C0A4A5|0464268C-9119-4F98-A603-BAA3088FB946|
| 10个|F966F1759FD9956EE053182BA8C0A4A5|811A5197-1C12-4EC1-8704-DB15CBE7C254|
fiddle
0pizxfdo2#
你没有解释为什么要这么做,因为,如果是关于唯一性的,有比创建你自己的唯一字符串更简单的方法,而这个字符串迟早会失败,为了检测它,你必须做一些编程。
因此,我建议您:
如果上面的任何一个都不能接受,那么这里有一个你可以使用的选项;有一个表包含以前创建的唯一字符串。函数是一个自治事务,因此它可以插入和提交唯一字符串;它还检查是否存在新创建的字符串-不是通过潜在的缓慢选择,而是直接插入,这将在唯一索引上失败。在这种情况下,去获取另一个值。
功能:
测试:
结果: