我需要一个比较两个数字的SQL / Oracle函数 如果数字甚至像(22,10,4,12,6 ..)那样 如果是奇数(3,7,13,5 ......)假。
CREATE OR REPLACE FUNCTION is_even(num_in NUMBER) RETURN BOOLEAN IS
BEGIN
IF MOD(num_in, 2) = 0 THEN
RETURN TRUE;
END IF;
EXCEPTION
WHEN OTHERS THEN
RETURN FALSE;
END is_even;
/
CREATE OR REPLACE FUNCTION is_odd(num_in NUMBER) RETURN BOOLEAN IS
BEGIN
RETURN MOD(num_in, 2) = 1;
EXCEPTION
WHEN OTHERS THEN
RETURN FALSE;
END is_odd;
答案 0 :(得分:1)
我在评论中已经提到的另一个答案中没有提到的一点,你似乎没有注意到布尔值只能用于PL / SQL代码,而不能用在Oracle SQL中。
这限制了您通过最常用的方法调用函数 - 在sql语句中使用它。如果您尝试使用您的函数运行此查询,则会失败。
select is_even(10) FROM DUAL;
ORA-06552:PL / SQL:忽略语句
ORA-06553:PLS-382:表达式为 错误的类型
您可以调用此函数来设置布尔PL / SQL变量,但在一般情况下它不是很有用。
DECLARE
v_even_odd BOOLEAN := is_even(3);
或者,你可以返回一个数字或一个字符串(“TRUE”/“FALSE”)。
CREATE OR REPLACE FUNCTION is_even (num_in NUMBER)
RETURN VARCHAR2
IS
BEGIN
IF MOD (num_in, 2) = 0
THEN
RETURN 'TRUE';
ELSE
RETURN 'FALSE';
END IF;
END is_even;
/
从sql调用时工作正常。
select is_even(10) FROM DUAL;
IS_EVEN(10)
----------------
TRUE
答案 1 :(得分:0)
我准备不明白这里有什么困难,因为你自己提供了以上两个函数的代码......
无论如何,你去了:
CREATE OR REPLACE FUNCTION is_even(num_in NUMBER) RETURN BOOLEAN IS
BEGIN
IF MOD(num_in, 2) = 0 THEN
RETURN TRUE;
else
RETURN FALSE;
END IF;
END is_even;
/