【问题标题】:"not a GROUP BY expression" on BULK COLLECT SELECTBULK COLLECT SELECT 上的“不是 GROUP BY 表达式”
【发布时间】:2017-08-10 23:06:34
【问题描述】:

我开发了一个匿名 PL / SQL 块,它列出了一周中每一天雇用的员工总数。然后将结果插入表中。为了优化流程并避免 PL / SQL 引擎和 SQL 引擎之间重复的上下文更改,我使用了 BULK COLLECT AND FORALL 实用程序。

DECLARE 

    TYPE R_EMLEADOS_DIAS_SEMANA IS RECORD(
        totalEmpleados INTEGER,
        dayOfWeek VARCHAR2(10)
    );

    TYPE t_empleados IS TABLE OF R_EMLEADOS_DIAS_SEMANA;

    v_empleados t_empleados;
BEGIN

    SELECT COUNT(*) AS TOTAL , TO_CHAR(HIRE_DATE,'DAY') AS DAY_OF_WEEK
    BULK COLLECT INTO v_empleados
    FROM EMPLOYEES GROUP BY TO_CHAR(HIRE_DATE,'DAY');

    FORALL v_index IN 1 .. v_empleados.COUNT SAVE EXCEPTIONS
        INSERT INTO EJERCICIOS (EJERCICIO, VALOR_1, VALOR_2)
        VALUES (2, v_empleados(v_index).totalEmpleados, v_empleados(v_index).totalEmpleados || ' EMPLEADOS DADOS DE ALTA EL ' || v_empleados(v_index).dayOfWeek);
    COMMIT WORK;
    EXCEPTION
       WHEN OTHERS THEN
            IF SQLCODE = -24381 THEN
                FOR v_index IN 1 .. SQL%BULK_EXCEPTIONS.COUNT LOOP
                    DBMS_OUTPUT.PUT_LINE (
                          SQL%BULK_EXCEPTIONS (v_index).ERROR_INDEX
                           || ':'
                           || SQL%BULK_EXCEPTIONS (v_index).ERROR_CODE);
                END LOOP;
            ELSE
                RAISE;
            END IF;
END;
/

当我运行这个块时,我得到以下编译错误:

ORA-00979: Is not a GROUP BY expression
ORA-06512: en línea 31
ORA-06512: en línea 13
00979. 00000 -  "not a GROUP BY expression"

我不明白为什么查询不起作用。如果我正常运行它,它会完美运行。

有人知道怎么解决吗?提前致谢。

练习使用的表格:

CREATE TABLE EJERCICIOS (
  EJERCICIO NUMBER(3) NOT NULL,
  VALOR_1   NUMBER(4) NOT NULL,
  VALOR_2   VARCHAR2(100) NOT NULL
);

【问题讨论】:

  • 你是否已经尝试说...GROUP BY HIRE_DATE
  • 没有 forall 和 insert ,它在我尝试过的环境中编译得很好。你的数据应该有一些问题。

标签: sql plsql plsqldeveloper


【解决方案1】:

在 Oracle 11gR2 中,当我执行以下操作时,我没有发现任何问题。检查你是否也在做同样的事情:

create table EJERCICIOS(EJERCICIO number, VALOR_1 number, VALOR_2 varchar2(100));

过程

DECLARE
   TYPE R_EMLEADOS_DIAS_SEMANA IS RECORD
   (
      totalEmpleados   INTEGER,
      dayOfWeek        VARCHAR2 (10)
   );

   TYPE t_empleados IS TABLE OF R_EMLEADOS_DIAS_SEMANA;

   v_empleados   t_empleados;
BEGIN
     SELECT COUNT (*) AS TOTAL, TO_CHAR (HIRE_DATE, 'DAY') AS DAY_OF_WEEK
       BULK COLLECT INTO v_empleados
       FROM EMPLOYEE
   GROUP BY TO_CHAR (HIRE_DATE, 'DAY');

   FORALL v_index IN 1 .. v_empleados.COUNT SAVE EXCEPTIONS
      INSERT INTO EJERCICIOS (EJERCICIO, VALOR_1, VALOR_2)
              VALUES (
                        2,
                        v_empleados (v_index).totalEmpleados,
                           v_empleados (v_index).totalEmpleados
                        || ' EMPLEADOS DADOS DE ALTA EL '
                        || v_empleados (v_index).dayOfWeek);

   COMMIT WORK;
EXCEPTION
   WHEN OTHERS
   THEN
      IF SQLCODE = -24381
      THEN
         FOR v_index IN 1 .. SQL%BULK_EXCEPTIONS.COUNT
         LOOP
            DBMS_OUTPUT.PUT_LINE (
                  SQL%BULK_EXCEPTIONS (v_index).ERROR_INDEX
               || ':'
               || SQL%BULK_EXCEPTIONS (v_index).ERROR_CODE);
         END LOOP;
      ELSE
         RAISE;
      END IF;
END;
/

输出:

  EJERCICIO VALOR_1                                                                                              VALOR_2
---------- ---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
         2 2                                                                                                    2 EMPLEADOS DADOS DE ALTA EL THURSDAY
         2 2                                                                                                    2 EMPLEADOS DADOS DE ALTA EL FRIDAY

【讨论】:

  • 感谢您的回复。代码完全相同。除了 value_1 列是 Number 类型。我正在使用 Oracle 12c R2
  • @SergioSánchezSánchez 您能否发布表格的 DDL,然后模拟问题并帮助您。如果我将valor_1 列更改为Number,它也可以工作。
  • @SergioSánchezSánchez。它和我一起工作。你肯定还有别的事情在做。即使我为你编辑了我的帖子。
  • 好的,谢谢。我会检查一下。以后再告诉你
  • 我无法在我的环境中运行您的解决方案。它告诉我 GROUP BY 表达式无效。我不得不将表达式 group by 更改为“group by HIRE_DATE”
猜你喜欢
  • 1970-01-01
  • 2017-09-21
  • 2011-08-14
  • 2014-12-28
  • 1970-01-01
  • 2011-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多