Как отладить эти ошибки в хранимой процедуре Oracle? - PullRequest
0 голосов
/ 11 июня 2018

Я делаю хранимую процедуру, и она дает мне следующие ошибки, я не понимаю, как я могу их решить

CREATE SEQUENCE SEQ_ERROR;
/

CREATE SEQUENCE SEQ_VENTA_MEN;    
/

CREATE OR REPLACE PROCEDURE sp_ventas
--(P_FECHA DATE , P_CONTADOR NUMBER , P_TOTAL NUMBER)
IS
   CURSOR vent_cur
   IS
      SELECT * FROM vendedor;

   v_fecha         DATE := TO_CHAR (022018, 'MM/YYYY');

   v_contador      NUMBER := 0;

   v_total_men     NUMBER := 0;

   v_boleta        NUMBER (9);

   v_total         NUMBER (9);

   v_men_errores   VARCHAR2 (200);
BEGIN
   FOR reg_vent IN vent_cur
   LOOP
      SELECT v.id_vendedor,
             b.fecha_boleta,
             b.nro_boleta,
             v.sueldo_base
        INTO v_boleta, v_total
        FROM vendedor v JOIN boleta b ON (v.id_vendedor = b.id_vendedor)
       WHERE v.id_vendedor = reg_vent.id_vendedor;

      BEGIN
         INSERT INTO ventas_mensuales
              VALUES (seq_venta_men.NEXTVAL,
                      reg_vent.id_vendedor,
                      v_fecha,
                      v_boleta,
                      reg_vent.sueldo_base);
      EXCEPTION
         WHEN OTHERS
         THEN
            v_men_errores := slerrm;

            INSERT INTO reg_errores
                 VALUES (seq_error.NEXTVAL, 'SP_VENTAS', v_men_errores);
      END;
   END LOOP;
END;

Ошибки:

Error(39,1): PL/SQL: SQL Statement ignored
Error(40,25): PL/SQL: ORA-00947: not enough values
Error(48,1): PL/SQL: SQL Statement ignored
Error(48,13): PL/SQL: ORA-00913: too many values
Error(55,1): PL/SQL: Statement ignored
Error(55,18): PLS-00201: identifier 'SLERRM' must be declared

1 Ответ

0 голосов
/ 11 июня 2018
  • Первая ошибка : в списке SELECT есть 4 элемента, в то время как INTO имеет 2 (должно быть 4)
  • Вторая ошибка : этоКажется, таблица VENTAS_MENSUALES имеет менее 5 столбцов
  • Третья ошибка : не SLERRM , а SQLERRM .

Более того, это назначение V_FECHA DATE := TO_CHAR(022018 , 'MM/YYYY'); проблематично, например:

V_FECHA VARCHAR2(7) := TO_CHAR(sysdate , 'MM/YYYY');

или V_FECHA VARCHAR2(7) := '02/2018';

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...