如何编写一个PL / SQL函数:
到目前为止,这是我写的内容:
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;
问题是将1234变成4321。string- y解决方案(必须使用未公开的内置文件)本身就是简单性:to_number(reverse(to_char(1234)))。坚持数字数据类型比较麻烦。我的解决方案非常程序化:毫无疑问,存在更优雅的解决方案。
to_number(reverse(to_char(1234)))
无论如何,要将1234变成4321,我们需要生成1 + 20 + 300 +4000。我的解决方案依次隔离每个值,然后乘以适当的10的幂。为了隔离使用trunc()负值的值。这会将数字四舍五入到小数点左边。因此,trunc(1234,-3)产生1000。要将其转换为所需值,我们将乘以10乘以负三的幂。这样1000 * 10(-3) = 1。
trunc()
trunc(1234,-3)
1000
1000 * 10(-3) = 1
该函数遍历数字。将1000转换为1后,我们计算出余数1234 - 1000 = 234。因此,现在我们需要隔离200并将其转换为20。那是trunc(234, -2)和power(200, -1)。因此我们可以将偏移量trunc()递减1,将指数递减 power()2。
1234 - 1000 = 234
trunc(234, -2)
power(200, -1)
power()
这是一个工作功能(非常松散地基于您发布的功能):
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; ....