2017-08-10 41 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

我已經添加了它。謝謝 –