'XXXXXX'对TO_NUMBER的第二个参数意味着什么? Oracle SQL

时间:2017-05-20 10:51:51

标签: oracle

CREATE OR REPLACE TRIGGER fund_BIU   
BEFORE INSERT OR UPDATE ON fund  
FOR EACH ROW   
BEGIN
IF INSERTING AND :new.fundid IS NULL THEN   
    :new.fundid := TO_NUMBER(SYS_GUID(), 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');   
    END IF;   
END;
/  

我对IF声明感兴趣。这是什么意思 :new.fundid := to_number(sys_guid(),'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');。准确地说sys_guid(), 'xxxxxxxx'部分。

TY

2 个答案:

答案 0 :(得分:2)

想想数字33.关注这意味着什么 - 它是一个数字,它没有数字。它可以表示为3 * 10 + 3 * 1,这就是为什么它在基数10中有两个数字,两个数字都等于3.但你也可以将它表示为33.00。字符串! 33'和! 33.00'明显不同(一个有两个字,另一个有五个);但如果您想将它们视为代表数字,它们代表相同的数字 - 整数33.类似地,+ 33和+33.00表示相同的数字。

如果您输入的字符串类似于! 33'或者' + 33.00'但是你想得到一个数字,然后你使用函数TO_NUMBER()。例如:' + 33.00'是一个字符串,但TO_NUMBER('+33.00')是一个数字,数字33。

TO_NUMBER()允许您提供格式模型,以便Oracle了解如何将其接收的字符串解释为输入。

例如,如果您输入字符串' 1101' - 这是数字一千一百,还是数字13,用二进制表示法给出?

类似地,数字33具有字符串表示' 21'十六进制(" HEX") TO_NUMBER('21')将输出数字21;但是你可以通过提供格式模型' XX'来告诉Oracle你的十六进制数字。两个数字有两个X,X通常用于表示" hex"。因此TO_NUMBER('21', 'XX')将输出数字33,而不是数字21。

SYS_GUID()输出非常大数字的十六进制表示。输出是一个字符串。将TO_NUMBER()应用于它,使用格式模型指示它应被解释为十六进制数字,将其转换为实际数字(而不是十六进制数字的字符串)。

答案 1 :(得分:1)

SYS_GUID()做的是生成唯一的16字节标识符或密钥。应用TO_NUMBER()函数时,您将获得该密钥的32位数表示。它基本上是一种在Oracle中生成唯一数字的方法。

请参阅Oracle文档中的SYS_GUID()https://docs.oracle.com/cd/B12037_01/server.101/b10759/functions153.htm