Как сделать dbms_output.put_line в Oracle - PullRequest
0 голосов
/ 02 июня 2018

В результате не отображается команда ROUND(SYSDATE - V_FECHA,1) от dbms_output.put_line, у меня есть этот скрипт:

SET SERVEROUTPUT ON

DECLARE
    v_fecha   v$database.created%TYPE;
BEGIN
    CASE
        WHEN ( SYSDATE - v_fecha <= 50 ) THEN
            dbms_output.put_line('LA FECHA DE CREACION DE LA BASE DE DATOS ES <= 50 DÍAS');
        WHEN ( SYSDATE - v_fecha > 50 AND SYSDATE - v_fecha <= 100 ) THEN
            dbms_output.put_line('LA FECHA DE CREACIÓN ES MAYOR QUE 50 DÍAS O <= 100 DÍAS');
        ELSE
            dbms_output.put_line('LA FECHA DE CREACIÓN ES IGUAL A '
                                   || round(SYSDATE - v_fecha,1)
                                   || ' DÍAS');
    END CASE;
END;
/

OUTPUT:
LA FECHA DE CREACIÓN ES IGUAL A  DÍAS.

Версия Oracle: Oracle Database 11g Express EditionВыпуск 11.2.0.2.0 - 64-битная производственная среда разработки: разработчик SQL - Версия 4.1.1.19

Спасибо.

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Вывод команды ROUND(SYSDATE - V_FECHA,1) не отображается, потому что V_FECHA по-прежнему NULL в вашем коде.Вы можете проверить это с помощью

SELECT ROUND(SYSDATE - NULL) FROM DUAL;

, который тоже ничего не показывает.Почти каждая операция в SQL будет выводить NULL, если входные данные содержат NULL значений, а DBMS_OUTPUT показывает пустую строку.

Как предложил @Kaushik, если вы добавите SELECT в свой коди, может быть, что-то, что ловит NULL значения, все должно быть хорошо:

DECLARE
  v_fecha v$database.created%TYPE;
  delta NUMBER;
BEGIN
  SELECT created INTO v_fecha FROM v$database;
  delta := v_fecha - SYSDATE;

  CASE WHEN delta <= 50 THEN
          dbms_output.put_line('LA FECHA DE CREACION DE LA BASE DE DATOS ES <= 50 DÍAS');
       WHEN delta > 50 AND delta <= 100 THEN
          dbms_output.put_line('LA FECHA DE CREACIÓN ES MAYOR QUE 50 DÍAS O <= 100 DÍAS');
       WHEN delta IS NULL THEN
          dbms_output.put_line('LA FECHA DE CREACIÓN ES DESCONOCIDA');
       ELSE 
          dbms_output.put_line('LA FECHA DE CREACIÓN ES IGUAL A '
                               || NVL(round(SYSDATE - v_fecha,1), 0)
                               || ' DÍAS');
  END CASE;
END;
/

Я поставил два варианта, WHEN delta IS NULL и NVL, чтобы показать вам различные возможности.

Кроме того, я пытаюсь позвонить на SYSDATE только один раз, так как каждый вызов SYSDATE может быть немного позже, чем предыдущий.(Разница, конечно, очень мала, но я пытаюсь предотвратить ошибки, которые происходят очень редко, но потом их очень трудно найти.)

0 голосов
/ 02 июня 2018

Вы, вероятно, хотите получить с v$database.Добавьте это после BEGIN

SELECT
    created
INTO v_fecha
FROM
    v$database;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...