【问题标题】:Error in return of PLSQL ORACLE Not Working返回 PLSQL ORACLE 的错误不工作
【发布时间】:2018-11-23 01:53:29
【问题描述】:

此代码是:

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;

如果我执行而不返回它可以工作,如果我尝试返回一个值它会失败,我不知道会发生什么。

oracle的错误是:

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

但如果我尝试返回该值,算法就会死掉。 我不知道我做错了什么或错在哪里,如果你能帮助我,我将不胜感激。

【问题讨论】:

    标签: sql oracle plsql compiler-errors plsqldeveloper


    【解决方案1】:

    程序无法返回值,在 Oracle 中,您可以拥有在程序运行后可见的 out-parameters。

    但是您可以尝试另一种选择,而不是编写代码来生成两个日期之间的日期,而是尝试使用单个选择查询并打开一个输出游标以在 proc 完成后填充值

    一个例子如下

    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 连接到您的数据库

    您可以按如下方式调用 proc

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

    【讨论】:

      【解决方案2】:

      我的错误是我没有做一个函数,而是解决了一个过程。

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多