【问题标题】:Returning the value from the cursor in function in oracle sql?从oracle sql中的函数中的游标返回值?
【发布时间】:2020-05-13 21:07:39
【问题描述】:

我编写了一个函数,其中包含一个返回 True / False 值的游标。下面的代码是否正确?在这种情况下,输出会显示为“真”吗?我没有使用任何循环/结束循环。

FUNCTION get_fruit_value(pn_code in NUMBER)
RETURN VARCHAR2;
AS

nvalue     varchar2;
vfru_name  varchar2(100);

CURSOR C1
IS
SELECT fruit_name from grocery where grocery_code = pn_code;
-- here output has 4 values :  **fruit_name = Apple, Orange, Banana, Kivi**

BEGIN
 OPEN C1;
 FETCH C1 into vfru_name;

   if vfru_name = 'Apple' then
    nvalue ='True';
   else 
    nvalue ='False';
  end if;

CLOSE C1;

RETURN nvalue;

END get_fruit_value;

或者有没有其他方法可以做到这一点?

【问题讨论】:

  • 看起来好像您只期望从游标返回 1 行。那么为什么要使用游标呢?为什么不是一个 SELECT?你说“在这种情况下输出会显示为‘真’吗?”。当你为自己测试它时发生了什么? “请做需要” 什么是“需要”? SO 不是代码编写服务。
  • 谢谢 EdStevens..我得到了答案。这意味着需要循环来获取多个值。我无法自己测试它,因为我失去了 sql developer tool 连接。
  • 是的,游标的全部目的是抓取多行,然后循环遍历它们,一次获取一个,以便依次对每一行进行进一步处理。函数的全部目的是返回单个值。
  • 您也缺少一些冒号。 "nvalue = 'True'" 不会编译。你需要 ":="

标签: oracle function return cursor


【解决方案1】:

我推荐使用 FOR LOOP 语句(更多信息:https://www.oracletutorial.com/plsql-tutorial/plsql-cursor-for-loop/)

用你的例子:

FUNCTION get_fruit_value(pn_code in NUMBER)
RETURN VARCHAR2;
AS

nvalue     varchar2;
vfru_name  varchar2(100);

CURSOR C1
IS
SELECT fruit_name from grocery where grocery_code = pn_code;
-- here output has 4 values :  **fruit_name = Apple, Orange, Banana, Kivi**

BEGIN

 FOR record IN C1
 LOOP

   if record.fruit_name = 'Apple' then
    nvalue ='True';
   else 
    nvalue ='False';
  end if;

END LOOP;     

RETURN nvalue;

END get_fruit_value;

希望对你有所帮助。

【讨论】:

    【解决方案2】:

    根据所说,SELECT 将只返回一行,因此不需要LOOP。实际上,也不需要CURSOR。我想你用它来避免NO_DATA_FOUND,在我看来这是错误的,因为它只会引起混乱。 SELECT 和 EXCEPTION 处理程序就可以了。

    这就是我的意思:首先是示例表:

    SQL> select * From grocery;
    
    GROCERY_CODE FRUIT_
    ------------ ------
               1 Orange
               2 Banana
               3 Apple
               4 Kivi
    

    功能:它的目的(根据你写的)是找出某个grocery_code是否代表苹果。

    SQL> create or replace function f_is_apple (par_grocery_code in grocery.grocery_code%type)
      2    return varchar2
      3  is
      4    retval varchar2(10) := 'False';
      5  begin
      6    select 'True'
      7      into retval
      8      from grocery g
      9      where g.grocery_code = par_grocery_code
     10        and g.fruit_name = 'Apple';
     11
     12    return retval;
     13  exception
     14    when no_data_found then
     15      return retval;
     16  end f_is_apple;
     17  /
    
    Function created.
    

    测试:

    SQL> select level as grocery_code,
      2         f_is_apple(level) result
      3  from dual
      4  connect by level <= 4;
    
    GROCERY_CODE RESULT
    ------------ ----------
               1 False
               2 False
               3 True            --> only code 3 is "apple"
               4 False
    
    SQL>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-07
      相关资源
      最近更新 更多