PLS-00653 空行错误(PL/SQL 范围内不允许聚合/表函数)

Posted

技术标签:

【中文标题】PLS-00653 空行错误(PL/SQL 范围内不允许聚合/表函数)【英文标题】:PLS-00653 Error on an empty line (Aggregate/table functions are not allowed in PL/SQL scope) 【发布时间】:2018-07-16 14:04:16 【问题描述】:

我正在尝试运行我制作的 PL/SQL 脚本,但出现错误:PLS-00653: aggregate/table functions are not allowed in PL/SQL scope

这里的问题不是错误本身,而是错误所在的行。 这是我的引发此错误的 PL/SQL 块:

DECLARE
    TYPE l_code_arr_typ IS VARRAY(3) OF VARCHAR2(100);
    l_code_arr l_code_arr_typ;
    l_objet    objet_interface_pkg.objet_interface_typ;
    l_resultat CLOB;
    l_valeur   valeur_pkg.valeur_typ;
    l_liens    lien_objet_interface_pkg.lien_objet_interface_tab;
    l_rows NUMBER;
BEGIN
    l_code_arr := l_code_arr_typ('champ.fonctions.dossier.particulier',
                                 'champ.fonctions.region.admin',
                                 'champ.fonctions.ministere.organisme');
    l_resultat := '';

    FOR l_idx IN 1 .. l_code_arr.count LOOP
        l_objet    := objet_interface_pkg.obtenir_fnc(p_code      => l_code_arr(l_idx),
                                                      p_acron_sys => :acronyme);
        l_resultat := l_resultat || '"' || l_objet.code || '":[';

        l_liens := lien_objet_interface_pkg.obtenir_par_objet_fnc(p_id_objet => l_objet.id_obj);
        FOR l_lien IN (SELECT * FROM TABLE(l_liens)) LOOP
            l_valeur   := valeur_pkg.obtenir_fnc(p_id => l_lien.id_valeur);
            l_resultat := l_resultat || '"' || l_valeur.valeur || '"';

            FOR l_enfant IN (SELECT *
                               FROM TABLE(valeur_pkg.obtenir_enfants_fnc(p_id_parent => l_lien.id_valeur,
                                                                         p_code      => l_valeur.valeur))) LOOP
                l_resultat := l_resultat || ',"' || l_enfant.valeur || '"';
            END LOOP;
        END LOOP;

        l_resultat := l_resultat || '],';
    END LOOP;
    <<<<<<<<<< ERROR THROWN HERE (EMPTY LINE)
    l_resultat := substr(l_resultat, 1, length(l_resultat) - 1) || '';
    dbms_output.put_line(l_resultat);
END;

错误在 34:17 (line:column) 抛出,这是从代码块末尾算起的第四行。如您所见,真正的 问题是这一行是空行。此外,该空行附近的任何行都不包含对聚合函数的调用。 那么 aggregate/table 函数的调用在哪里呢?

我想知道问题是否真的来自我的代码,或者我的PL/SQL Developer 是否损坏。

我希望有人可以帮助我...

【问题讨论】:

【参考方案1】:

我找到了解决办法!

问题是函数lien_objet_interface_pkg.obtenir_par_objetPIPELINED 并且流水线返回不能存储在变量中。

所以这两行...

    l_liens := lien_objet_interface_pkg.obtenir_par_objet_fnc(p_id_objet => l_objet.id_obj);
    FOR l_lien IN (SELECT * FROM TABLE(l_liens)) LOOP

...需要像这样合并成一行:

    FOR l_lien IN (SELECT * FROM TABLE(lien_objet_interface_pkg.obtenir_par_objet_fnc(p_id_objet => l_objet.id_obj))) LOOP

但是,我仍然不知道为什么 PL\SQL Developer 说我的错误来自第 34 行,而且它可能仍然是个谜。如果有人对这个谜团有答案,请随时告诉我。

【讨论】:

以上是关于PLS-00653 空行错误(PL/SQL 范围内不允许聚合/表函数)的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL:在由开始和结束定义的重叠日期范围内查找孤岛

避免在 PL/SQL 命令行上的选择结果之间出现空行

PL/SQL数据开发那点事

pl/SQL 过程从不同表中的值生成一个表中的值

如何在pl-sql中修复此功能

违反约束时显示自定义消息 PL/SQL