PLSQL - 游标不能在动态 sql 中使用

Posted

技术标签:

【中文标题】PLSQL - 游标不能在动态 sql 中使用【英文标题】:PLSQL - Cursor cannot be used in dynamic sql 【发布时间】:2016-03-27 07:41:46 【问题描述】:

我有一个动态 SQL 查询,它是在一个字符串中构造的。 该过程应返回“REF CURSOR”。

当我尝试打开查询的游标时收到错误 PLS-00455

光标定义

  CURSOR cu_SiteList IS
  SELECT SEC_NN.SRV_ID
        ,SEC_NN.SRV_NAME
        ,SEC_NN.SRV_COMTYP_CODE
    FROM SEC_NN
        ,COM_SITE_STATE_T
   WHERE SEC_NN.SRV_COMTYP_CODE <> 1
     AND SEC_NN.SRV_ID = 2;

  TYPE SITE_LIST_TYP IS REF CURSOR RETURN cu_SiteList%ROWTYPE;

这里是查询:

p_SiteList  SITE_LIST_TYP;
        lv_QueryStr := ' SELECT SEC_NN.SRV_ID ' ||
                       ' ,SEC_NN.SRV_NAME ' ||
                       ' ,SEC_NN.SRV_COMTYP_CODE ' ||
                  ' FROM SEC_NN_, ' ||
                               ' COM_SITE_STATE_T ' ||
                             ' WHERE SEC_NN.SRV_COMTYP_CODE <> 1 ' || 
                               '  AND SEC_NN.SRV_MODE_CODE = 2' ||
                               '  AND SEC_NN.SRV_ID = COM_SITE_STATE_T.SRV_ID';

OPEN p_SiteList FOR lv_QueryStr;

如您所见,我只使用 SEC_NN 表中的 3 列,因此创建一个作为整个表的 ROWTYPE 的游标对我来说不起作用。 如何克服这一点? 提前致谢。

【问题讨论】:

'当我尝试打开光标时出现错误'。 什么错误?请编辑您的代码以包含打开光标的代码以及您收到的错误消息。 Why can't we use strong ref cursor with dynamic SQL Statement?的可能重复 @LukeWoodward,我不这么认为,我之前看到那个帖子,我的光标就是这样配置的。更新了原始帖子。 任何使用 ref 游标的东西都可以使用“弱”的 ref 游标吗? (尝试声明SYS_REFCURSOR 类型的p_SiteList 而不是SITE_LIST_TYP。)如果是,那么这就是您的解决方案。如果没有,那么你可能会被卡住。 我想我能做到。 【参考方案1】:

在 cmets 中,解决方法是将光标声明为“弱”引用光标,方法是替换行

    p_SiteList  SITE_LIST_TYP;

    p_SiteList  SYS_REFCURSOR;

【讨论】:

以上是关于PLSQL - 游标不能在动态 sql 中使用的主要内容,如果未能解决你的问题,请参考以下文章

PLSQL中怎样获取未知结构的动态游标的字段名

游标 PLSQL 中的动态列名

在 Oracle PLSQL 中使用游标的动态列名

PL SQL - 使用动态 SQL 生成删除语句

在plsql中使用游标更新多条记录

如何在 PLSQL 中释放游标?