在游标 where 子句和游标行类型中使用函数参数

Posted

技术标签:

【中文标题】在游标 where 子句和游标行类型中使用函数参数【英文标题】:Use parameter from function in cursor where clause and cursor rowtype 【发布时间】:2014-08-18 20:27:49 【问题描述】:

我正在尝试创建一个接受值的 pl/sql 函数。游标在 where 子句中使用该值,并且该函数应返回游标的第一行。

这就是我想要开始的工作。

create or replace package pkg_test_slot as

cursor c_test_slotis 
select * from (select person_uid, test.test, rownum r from test)
pivot(max(test) test_code for r in (1,2,3,4,5));

function f_test_getter (p_entity_uid number) return c_test_slot%rowtype;

end;

【问题讨论】:

【参考方案1】:

像这样的

create or replace package body p_test is
  function get_rows(pll_limit in number) return sys_refcursor is
    lcur_rec sys_refcursor;
  begin
    open lcur_rec for
      select rownum rw, dum
        from (select 1 dum from dual group by cube(1, 2, 3, 4, 5))
       where rownum < pll_limit;

    return lcur_rec;
  end get_rows;

  procedure prc_get_data is
    lcur sys_refcursor;
  begin
    lcur := get_rows(10);
  end prc_get_data;
end p_test;

【讨论】:

【参考方案2】:

您可以将F_TEST_GETTER 实现为:

CREATE OR REPLACE PACKAGE PKG_TEST_SLOT AS
  CURSOR C_TEST_SLOT(pEUID IN NUMBER) IS 
    SELECT PERSON_UID, TEST.TEST, ROWNUM R
              FROM TEST t
              WHERE t.ENTITY_UID = pEUID;

  FUNCTION F_TEST_GETTER (P_ENTITY_UID NUMBER)
    RETURN PKG_TEST_SLOT.C_TEST_SLOT%ROWTYPE;
END PKT_TEST_SLOT;

CREATE OR REPLACE PACKAGE BODY PKG_TEST_SLOT AS
  FUNCTION F_TEST_GETTER(P_ENTITY_UID NUMBER)
    RETURN PKG_TEST_SLOT.C_TEST_SLOT%ROWTYPE
  AS
    aRow PKG_TEST_SLOT.C_TEST_SLOT%ROWTYPE;
  BEGIN
    OPEN C_TEST_SLOT(P_ENTITY_UID);

    FETCH C_TEST_SLOT INTO aRow;

    CLOSE C_TEST_SLOT;

    RETURN aRow;
  END PKG_TEST_SLOT;
END PKG_TEST_SLOT;

请注意,我稍微简化了 C_TEST_SLOT 的定义,添加了参数,并展示了它在函数中的使用方式。希望这能给你一些想法。分享和享受。

【讨论】:

以上是关于在游标 where 子句和游标行类型中使用函数参数的主要内容,如果未能解决你的问题,请参考以下文章

SQL 游标

SQL 语句调优 where 条件 数据类型 临时表 索引

[转载]oracle游标概念讲解

MS SQL语句declare游标的求助

python使用游标访问数据

将 IN() 用于数组的 PL/SQL where 子句