Oracle Apex:ORA-24344 成功但出现编译错误

Oracle Apex: ORA-24344 Success with compilation error

我目前正在 APEX 中开发 Oracle 数据库。

首先,我无法使用任何工具。我只能使用 apex.oracle.com 中提供的内容,并且我在将脚本上传到那里之前在 NotePad++ 中编写脚本。这是一项学校作业,所以我不允许使用任何其他工具,即使有一些东西可以使事情变得更容易。

我正在创建一个长脚本,它在数据库中创建一堆 table,在每个 table 中创建一堆记录,并创建所有约束。这部分工作正常。现在我必须在同一个脚本中创建多个函数和过程,然后再创建其他内容。

每次我尝试创建一个时,我都会得到这个:ORA-24344:成功但有编译错误

此外,此错误后脚本中的其他指令未执行。错误之前的一切工作正常。

以下是造成此错误的函数之一:

CREATE OR REPLACE FUNCTION SP_03Recherche (titre_art VARCHAR2, nom_aut VARCHAR2, type_art VARCHAR2)
RETURN CURSOR
IS
    CURSOR articles (p_titre_art VARCHAR2, p_nom_aut VARCHAR2, p_type_art VARCHAR2) IS
    SELECT * FROM BI_Articles INNER JOIN (BI_ArticlesAuteurs INNER JOIN BI_Auteurs ON BI_ArticlesAuteurs.AuteurID = BI_Auteurs.AuteurID) ON BI_Articles.ISBN = BI_ArticlesAuteurs.ISBN
    WHERE (Titre LIKE p_titre_art) AND ((Nom LIKE p_nom_aut) OR (Prenom LIKE p_nom_aut)) AND TypeArticle LIKE type_art;
BEGIN
    RETURN articles(titre_art, nom_aut, type_art);
END;

sys_refcursor 是您看似想要 return 的数据类型。这是弱引用游标的通用类型。我猜你想要像

这样的东西
CREATE OR REPLACE FUNCTION SP_03Recherche (
  p_titre_art VARCHAR2, 
  p_nom_aut VARCHAR2, 
  p_type_art VARCHAR2
)
  RETURN sys_refcursor;
IS
  l_rc sys_refcursor;
BEGIN
  OPEN l_rc
   FOR select *
         from bi_articles art
              inner join BI_ArticlesAuteurs art_auth
                 on (art.isbn = art_auth.isbn)
              inner join BI_Auteurs auth
                 on (art_auth.auteurID = auth.auteurID)
        where titre LIKE p_titre_art
          and (nom LIKE p_nom_auth or
               prenum LIKE p_nom_auth)
          and typearticle LIKE type_art;

  RETURN l_rc;
END;

现在,提几点建议

  • select * 几乎总是一个坏主意。特别是当您加入多个 table 时。每次有人向三个 table 中的任何一个添加附加列时,您真的真的希望结果集的结构发生变化吗?这似乎不太可能。
  • 到处使用别名。看代码,完全不知道table titre是怎么来的。或者 nomprenumtypearticle。使用别名来标识列来自哪个 table。这使您的代码更清晰,并在将来添加可能具有相同列名的其他 table 或列时变得更加健壮(例如,多个实体可能有一个 nom 列)。