Oracle / sql比较两个数字

时间:2018-03-15 10:16:48

标签: sql oracle

我需要一个比较两个数字的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;

2 个答案:

答案 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;
/