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

时间:2015-11-01 18:23:23

标签: sql oracle oracle-apex

我目前正在APEX工作oracle数据库。

首先,我无法访问任何工具。我只能使用apex.oracle.com中提供的内容,然后我在NotePad ++中编写脚本,然后再将其上传到那里。这是一项学校作业,因此我不允许使用任何其他工具,即使有些东西会让事情变得更容易。

我正在创建一个长脚本,在数据库中创建一堆表,在每个表中创建一堆记录,并创建所有约束。这部分工作正常。现在我必须在同一个脚本中创建几个函数和过程,而不是其他东西。

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

此外,不执行此错误后脚本中的其他指令。错误之前的所有内容都可以正常工作。

http://i.imgur.com/lHIjfcE.png

以下是创建此错误的函数之一:

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;

1 个答案:

答案 0 :(得分:0)

sys_refcursor是您似乎想要返回的数据类型。这是弱引用游标的泛型类型。我猜你想要像

这样的东西
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 *几乎总是一个坏主意。特别是当你加入多个表时。您是否真的希望每次有人在三个表中的任何一个表中添加其他列时,结果集的结构会发生变化?这似乎不太可能。
  • 到处使用别名。查看代码,我不知道表titre来自哪个表。或nomprenumtypearticle。使用别名来标识列来自哪个表。这使得您的代码更加清晰,并且在将来添加可能具有相同列名的其他表或列时更加健壮(例如,多个实体可能具有nom列。)