Pan*_*tea 5 oracle oracle-11g plsql
我正在尝试编写一个函数来接收一个数字并返回其二进制格式。这是我迄今为止开发的内容,它可以用于输入:4,8,16 但它不会为其他数字返回正确的二进制格式。我找不到问题,我想知道你是否能找到问题?
create or replace function Show_Binary(i_Number in Number) Return Varchar2
AS
V_Binary varchar2(50) := '';
i_Number2 Number := i_Number;
Begin
While i_Number2>=2 LOOP
V_Binary := V_Binary || Remainder(i_Number2, 2);
i_Number2 := i_Number2 / 2;
End LOOP;
V_Binary := V_Binary || TO_CHAR(i_Number2);
select reverse (V_Binary) into V_Binary from dual;
return (V_Binary);
End;
Run Code Online (Sandbox Code Playgroud)
Bal*_*app 14
这不是 Oracle 或 PL/SQL 问题,而是实现正确算法的问题。
下面是一个例子:
https://www.orafaq.com/wiki/Binary
CREATE OR REPLACE FUNCTION dec2bin (N in number) RETURN varchar2 IS
binval varchar2(64);
N2 number := N;
BEGIN
while ( N2 > 0 ) loop
binval := mod(N2, 2) || binval;
N2 := trunc( N2 / 2 );
end loop;
return binval;
END dec2bin;
/
SQL> SELECT dec2bin(22) FROM dual;
DEC2BIN(22)
----------------
10110
Run Code Online (Sandbox Code Playgroud)
LISTAGG + 分层查询 + 其他 SQL 函数的开销比简单的 PL/SQL 函数的开销要大。
SQL> with g as (select * from dual connect by level <= 1000) select count(distinct dec2bin(rownum)) as bincd from g,g;
BINCD
----------
1000000
Elapsed: 00:00:13.75
with g as (select * from dual connect by level <= 1000),
g2 as (select rownum as r from g, g)
select count(distinct bin) as bincd from (
select (SELECT LISTAGG(SIGN(BITAND(r, POWER(2,LEVEL-1))),'')
WITHIN GROUP(ORDER BY LEVEL DESC) bin
FROM dual
CONNECT BY POWER(2, LEVEL-1)<=r
) as bin
from g2
);
BINCD
----------
1000000
Elapsed: 00:00:35.53
Run Code Online (Sandbox Code Playgroud)
这是没有UDF Pragma 的。在 12c 及更高版本上,添加PRAGMA_UDF.
CREATE OR REPLACE FUNCTION dec2bin (N in number) RETURN varchar2 IS
PRAGMA UDF; -- <==================================================== MAGIC
binval varchar2(64);
N2 number := N;
BEGIN
while ( N2 > 0 ) loop
binval := mod(N2, 2) || binval;
N2 := trunc( N2 / 2 );
end loop;
return binval;
END dec2bin;
/
SQL> with g as (select * from dual connect by level <= 1000) select count(distinct dec2bin(rownum)) as bincd from g,g;
BINCD
----------
1000000
Elapsed: 00:00:12.01
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2456 次 |
| 最近记录: |