Конкатенация с нулем не происходит должным образом в коде? - PullRequest
1 голос
/ 04 апреля 2010

Я пытался изменить номер в 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;

Ответы [ 5 ]

4 голосов
/ 04 апреля 2010

Попробуйте изменить тип переменной «r» на varchar2. Поскольку он объявлен как число, ведущие нули отбрасываются.

2 голосов
/ 04 апреля 2010

«Изменение числа» по сути является строковой операцией, а не числовой. Численно обратные значения 10, 100, 1000 и т. Д. Равны 1 - ведущие нули в результате не учитываются. И поэтому операция не является обратимой; все числа с одинаковыми начальными (значащими) цифрами и с нулем или более завершающими нулями при обращении выдают одинаковый результат.

Итак, вам нужно пересмотреть код, чтобы сгенерировать символьную строку, а не число.

1 голос
/ 04 апреля 2010

Нельзя сохранить начальные нули с числами; Вы должны использовать строки (varchar2). Попробуйте что-то вроде этого, чтобы увидеть:

DECLARE 
    r varchar2(9); 
    num varchars(9):=&p_num; 
BEGIN 
    r := REVERSE(num);
    dbms_output.put_line(r); 
END; 
0 голосов
/ 04 апреля 2010

Проблема в том, что вы имеете дело со значением 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>
0 голосов
/ 04 апреля 2010

Я не уверен, что не так в вашем коде 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;

Редактировать : Или, как правильно говорит Гейб, просто используйте функцию REVERSE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...