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 中使用的主要内容,如果未能解决你的问题,请参考以下文章