小编典典

PLSQL过程逻辑

sql

如何编写一个PL / SQL函数:

  1. 仅使用数字数据类型和函数-不使用VARCHAR2,CHAR,CLOB,XML等。“换句话说,解决方案中将不使用字符串/字符串函数,例如REVERSE,SUBSTR等。
  2. 接受PLS_INTEGER参数
  3. 如果提供的值小于或等于零,则会引发应用程序错误-20001并提供正确的错误消息
  4. 返回一个PLS_INTEGER值,该值具有与输入参数相反的数字。如果输入值以一个或多个零结尾,那么这些零将不会出现在返回的数值中,因为它们将是前导零。

到目前为止,这是我写的内容:

create or replace function test_reverse
    (p_input in pls_integer) 
    return pls_integer 
is
    p_num pls_integer := 0; 
    p_in_num pls_integer := 0; 
    p_out_num pls_integer := 0; 
begin 
    p_num := p_input; 
    loop 
        exit when p_num p_in_num := mod(p_num,10); 
        p_out_num := (p_out_num * 10) + p_in_num;
        p_num := trunc(p_num / 10); 
    end loop; 
    return p_out_num; 
end;

阅读 203

收藏
2021-05-16

共1个答案

小编典典

问题是将1234变成4321。string-
y解决方案(必须使用未公开的内置文件)本身就是简单性:to_number(reverse(to_char(1234)))。坚持数字数据类型比较麻烦。我的解决方案非常程序化:毫无疑问,存在更优雅的解决方案。

无论如何,要将1234变成4321,我们需要生成1 + 20 + 300
+4000。我的解决方案依次隔离每个值,然后乘以适当的10的幂。为了隔离使用trunc()负值的值。这会将数字四舍五入到小数点左边。因此,trunc(1234,-3)产生1000。要将其转换为所需值,我们将乘以10乘以负三的幂。这样1000 * 10(-3) = 1

该函数遍历数字。将1000转换为1后,我们计算出余数1234 - 1000 = 234。因此,现在我们需要隔离200并将其转换为20。那是trunc(234, -2)power(200, -1)。因此我们可以将偏移量trunc()递减1,将指数递减 power()2。

这是一个工作功能(非常松散地基于您发布的功能):

create or replace function test_reverse
    (p_input in pls_integer) 
    return pls_integer 
is
    p_out_num pls_integer := 0;
    offset    pls_integer;
    tgt       pls_integer;
    rmdr      pls_integer;
    exp       pls_integer;
begin 
    rmdr := p_input;
    offset := length(p_input)-1;
    exp := -offset;
    loop 
        tgt := trunc(rmdr, -offset);
        p_out_num := p_out_num + (tgt * power(10, exp));
        exp := exp + 2;
        rmdr := rmdr - tgt;
        exit when offset = 0;
        offset := offset-1;
    end loop; 
    return p_out_num; 
end test_reverse; 
/

这是一个LiveSQL演示(a需要免费的Oracle
Technet帐户)
。这没有参数验证的功能,但是很简单:

create or replace function test_reverse
    (p_input in pls_integer) 
    return pls_integer 
is
    p_out_num pls_integer := 0;
    offset    pls_integer;
    tgt       pls_integer;
    rmdr      pls_integer;
    exp       pls_integer;
begin 
    if p_input <= 0 then
         raise_application_error(-20001
              'invalid input: ' || || ' must be greater than zero.'
         );
    end if; 
    rmdr := p_input;
    ....
2021-05-16