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;
4

5 に答える 5

4

変数 "r" の型を varchar2 に変更してみてください。数値として宣言されているため、先頭のゼロは破棄されます。

于 2010-04-04T15:54:29.103 に答える
2

「数値の反転」は基本的に文字列操作であり、数値操作ではありません。数値的には、10、100、1000 などの逆数はすべて 1 です。結果の先行ゼロはカウントされません。したがって、操作は可逆ではありません。先頭 (有効) 桁が同じで、末尾に 0 個以上のゼロがあるすべての数値は、反転すると同じ出力を生成します。

そのため、数値ではなく文字列を生成するようにコードを修正する必要があります。

于 2010-04-04T15:56:53.577 に答える
1

数値の先頭のゼロを保持することはできません。文字列 (varchar2) を使用する必要があります。次のようにしてみてください。

DECLARE 
    r varchar2(9); 
    num varchars(9):=&p_num; 
BEGIN 
    r := REVERSE(num);
    dbms_output.put_line(r); 
END; 
于 2010-04-04T16:04:49.207 に答える
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;

編集:またはgabeが正しく指摘しているように、REVERSE関数を使用するだけです。

于 2010-04-04T15:20:40.963 に答える
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>
于 2010-04-04T16:32:48.130 に答える