2017-08-10 197 views
0

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

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 
); 
+0

没有ü已经尝试只是说... GROUP BY HIRE_DATE – psj01

+0

没有FORALL并插入,它在我尝试过的环境中编译得很好。在你的最后应该有一些与数据有关的问题。 –

回答

1

井的Oracle 11gR2中,当我做以下,我看不出有什么问题。检查如果你正在做相同的:

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

PROC

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 
+0

感谢您的回复。该守则完全相同。除了value_1列的类型是Number。我正在使用Oracle 12c R2 –

+0

@SergioSánchezSánchez您可以发布表格的DDL,然后模拟问题并为您提供帮助。此外,它也会工作,我把'valor_1'列改为'Number'。 – XING

+0

我已经添加了它。谢谢 –