Ошибка при возврате PLSQL ORACLE не работает - PullRequest
0 голосов
/ 23 ноября 2018

Этот код:

CREATE OR REPLACE
PROCEDURE Actualiza_Saldo(fecha_ini IN DATE, fecha_fin IN DATE) RETURN NUMBER
AS
  fechaTemp DATE;
  diasTotales NUMBER := fecha_fin- fecha_ini;diasLaborables NUMBER;
  sab VARCHAR2(10) := 'SÁBADO';dom VARCHAR2(10) := 'DOMINGO';diasTemp VARCHAR2(10);
BEGIN
  diasLaborables:= diastotales;

  FOR i IN 0..diasTotales LOOP
    fechaTemp := fecha_ini + i;
    DBMS_OUTPUT.PUT_LINE(to_char(fechaTemp));
    diasTemp := TO_CHAR(fechaTemp, 'DAY', 'NLS_DATE_LANGUAGE=SPANISH');
    IF (TRIM(diasTemp)=sab or TRIM(diasTemp)=dom) THEN
      diaslaborables := diaslaborables-1;
    END IF;
  END LOOP;
  dbms_output.put_line(diaslaborables);
  RETURN diasLaborables;
END Actualiza_Saldo;

Если я выполняю без возврата, оно работает, если я пытаюсь вернуть значение, которое не получается, я не знаю, что может произойти.

Ошибка оракула:

Warning: la ejecución ha terminado con advertencias
PROCEDURE Actualiza_Saldo(fecha_ini Compilado.

Error que empieza en la línea 1 del comando:
EXEC Actualiza_Saldo();
Informe de error:
ORA-06550: línea 1, columna 7:
PLS-00905: el objeto HR.ACTUALIZA_SALDO no es válido
ORA-06550: línea 1, columna 7:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

Код с постоянным значением:

CREATE OR REPLACE
PROCEDURE Actualiza_Saldo(fecha_ini IN DATE DEFAULT '10/08/2018', fecha_fin IN DATE DEFAULT '30/08/2018')
AS
  fechaTemp DATE;
  diasTotales NUMBER := fecha_fin- fecha_ini;diasLaborables NUMBER;
  sab VARCHAR2(10) := 'SÁBADO';dom VARCHAR2(10) := 'DOMINGO';diasTemp VARCHAR2(10);
BEGIN
  diasLaborables:= diastotales;

  FOR i IN 0..diasTotales LOOP
    fechaTemp := fecha_ini + i;
    DBMS_OUTPUT.PUT_LINE(to_char(fechaTemp));
    diasTemp := TO_CHAR(fechaTemp, 'DAY', 'NLS_DATE_LANGUAGE=SPANISH');
    IF (TRIM(diasTemp)=sab or TRIM(diasTemp)=dom) THEN
      diaslaborables := diaslaborables-1;
    END IF;
  END LOOP;
  dbms_output.put_line(diaslaborables);
END Actualiza_Saldo;

EXEC Actualiza_Saldo();

А выход кода без возвратов и тестовых значений - это маршрут от началадата и окончательная дата вычитания дней субботы и воскресенья.

PROCEDURE Actualiza_Saldo(fecha_ini Compilado.
anonymous block completed
10/08/18
11/08/18
12/08/18
13/08/18
14/08/18
15/08/18
16/08/18
17/08/18
18/08/18
19/08/18
20/08/18
21/08/18
22/08/18
23/08/18
24/08/18
25/08/18
26/08/18
27/08/18
28/08/18
29/08/18
30/08/18
14

Но если я попытаюсь вернуть значение, алгоритм умрет.Я понятия не имею, что я делаю неправильно или в чем ошибка, если бы вы могли мне помочь, я был бы очень признателен.

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Моя ошибка заключалась в том, что я выполнял не функцию, а решенную процедуру.

CREATE OR REPLACE
FUNCTION HR.Actualiza_Saldo(fecha_ini IN DATE/* DEFAULT '10/08/2018'*/, fecha_fin IN DATE/* DEFAULT '30/08/2018'*/) RETURN NUMBER
AS
0 голосов
/ 23 ноября 2018

Процедуры не могут возвращать значение, в Oracle у вас могут быть выходные параметры, которые будут видны после запуска процедуры.

Но здесь вы можете попробовать другой вариант, вместо написания кода для генерации дат междуво-вторых, попробуйте сделать это с помощью одного запроса на выборку и откройте курсор вывода, чтобы значения заполнялись после завершения процедуры

Пример, приведенный ниже

create or replace procedure generate_dates(start_date in date, end_date in date, result_set out sys_refcursor)
as
begin
   open result_set for
      select trunc(start_date)+level as output_dates
        from dual
   connect by level<=trunc(end_date)-trunc(start_date);
end;

, если вы используете sqlplus дляподключиться к вашей базе данных

вы бы назвали процедуру следующим образом

var x refcursor

begin
  generate_dates(date '2018-01-01',date '2018-12-31',:x);
end;

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