2010-04-04 30 views
1

我试图在PL/SQL中反转一个数字。它工作正常,但是当我的号码包含任何0时,输出是意外的。例如:在代码中没有正确地发生零连接?

1234 output 4321 
1000 output 1 
1203 ouput 3021 
10001 output 1 


DECLARE 
r number(9); 
num number(9):=&p_num; 
BEGIN 
    WHILE num>=1 LOOP 
     IF mod(num,10)=0 THEN -- extracting last digit of a number . 
      r:=r||0; --if end digit is 0 then concat r with 0 
     ELSE 
      r:=r||mod(num,10);--if mod is not 0 then it would be last digit. 
     END IF; 
      num:=trunc(num/10);--Removing last digit from number 
    END LOOP; 
dbms_output.put_line(r); 
END; 
+0

您可以查看您的10001结果呢?我用Perl模拟了上面的代码,并得到了10001而不是1,并且我没有看到1203如何生成3021而没有10001也生成了10001. – 2010-04-04 16:09:23

回答

4

尝试将变量“r”的类型更改为varchar2。 由于它被声明为数字,所以前导零被丢弃。

0

我不确定你的代码Vineet中出了什么问题,但也许这会起作用。

DECLARE 
    newStr varchar2(9) = ""; 
    numStr varchar2(9) := to_char(&p_num); 
    i   number; 
BEGIN 
    i = length(numStr); 
    WHILE i>0 LOOP 
     newStr := newStr || substr(numStr, i, i + 1); 
     i = i - 1; 
    END LOOP; 
    dbms_output.put_line(r); 
END; 

编辑:或者为加布正确地指出,只要使用反向功能。

+0

Adrian它不适用于像100,1000等数字。 – Vineet 2010-04-04 15:42:58

+0

对不起Vineet。正如Jonathan Leffler指出的那样,这本质上是一个字符串操作。它现在应该工作。 – Adrian 2010-04-04 16:16:23

2

'反转数字'基本上是一个字符串操作,而不是数字。在数值上,10,100,1000等的全部都是1 - 结果中的前导零不计数。因此,该操作不是可逆的;所有具有相同前导(重要)数字以及零或更多尾随零的数字在反转时产生相同的输出。

所以,你需要修改你的代码来生成一个字符串,而不是一个数字。

1

你不能用数字保留前导零;你必须使用字符串(varchar2)。尝试这样的看看:

DECLARE 
    r varchar2(9); 
    num varchars(9):=&p_num; 
BEGIN 
    r := REVERSE(num); 
    dbms_output.put_line(r); 
END; 
0

问题是你正在处理NUMBER值。当你扭转1000,你会得到0001,当其输出格式化为1

你真正需要的是一个类似于:

CREATE OR REPLACE FUNCTION rev(p_num NUMBER) 
RETURN VARCHAR2 IS 
    v_chr VARCHAR2(50); 
BEGIN 
    v_chr := p_num; 
    IF LENGTH(v_chr) > 1 THEN 
    RETURN SUBSTR(v_chr, -1, 1)||rev(SUBSTR(v_chr, 1, LENGTH(v_chr)-1)); 
    END IF; 
    RETURN v_chr; 
EXCEPTION 
    WHEN OTHERS THEN 
    RETURN 'Bad Input'; 
END; 
/

Function created 

SQL> SELECT rev(100000) FROM dual; 

REV(100000) 
-------------------------------------------------------------------------------- 
000001 

SQL>