尝试打开游标时忽略 SQL 语句

Posted

技术标签:

【中文标题】尝试打开游标时忽略 SQL 语句【英文标题】:SQL statement ignore when attempted to open cursor 【发布时间】:2015-07-02 01:18:28 【问题描述】:

当我在 PL/SQL 中创建包数据库的规范和主体时,出现错误“SQL 语句被忽略”。

我写了这段代码:

PROCEDURE Get_All_Link_Recent_Result
    ( pi_userid        IN  TLMS_CM_RESULT.USERID%TYPE,
      pi_email         IN  TLMS_CM_RESULT.EMAIL%TYPE,
      pi_testid        IN  TLMS_CM_RESULT.TESTID%TYPE,
      po_ret_code      OUT VARCHAR2,
      po_ret_message   OUT VARCHAR2,
      po_ref_cursor    OUT type_cm_result_refcur
    ) IS
    l_userid           TLMS_CM_RESULT.USERID%TYPE;
    l_testid           TLMS_CM_RESULT.TESTID%TYPE;
    BEGIN
      l_userid   :=    pi_userid || 0;
      l_testid   :=    pi_testid || 0;
    OPEN po_ref_cursor

    FOR SELECT * FROM
      TLMS_CM_RESULT WHERE
      USERID LIKE l_userid AND
      TESTID LIKE l_testid AND
      EMAIL = pi_email
     ORDER BY
      USERID;

  po_ret_code := c_err_msg_other;
  EXCEPTION
    WHEN OTHERS THEN
      po_ret_code := c_err_msg_other;
      po_ret_message := SQLERRM;
  END Get_All_Link_Recent_Result;

带有“PL/SQL : SQL Statement ignore”错误的特定行是行

OPEN po_ref_cursor

那么,后面的语句,以FOR SELECT * FROM开头也会报错。

【问题讨论】:

【参考方案1】:

OPEN CURSOR 是一个独立的完整语句。也就是说,它应该以分号结尾。在您的情况下,缺少分号。

我不确定你想用你的代码实现什么,我无法测试它。但我不清楚你为什么打开游标而不明确关闭它。另一件事是您似乎试图用FOR LOOP 隐式打开另一个游标。这不是这样做的方法。

例如,我会重写你的部分代码如下::

OPEN po_ref_cursor;  --add semi-colon

FOR I IN (SELECT * FROM
  TLMS_CM_RESULT WHERE
  USERID LIKE l_userid AND
  TESTID LIKE l_testid AND
  EMAIL = pi_email
 ORDER BY
  USERID)

LOOP

 po_ret_code := I.c_err_msg_other;

END LOOP;

假设 c_err_msg_other 是您的 SELECT 查询的一部分。

【讨论】:

以上是关于尝试打开游标时忽略 SQL 语句的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL编程_游标

Oracle游标sql语句代码块的优化

如何使用Oracle的游标?

求一条sql循环语句

Oracle 游标简介

oracle游标的使用