如何在Oracle中使用dbms_output.put_line

时间:2018-06-02 12:21:18

标签: oracle plsql oracle11g

结果不显示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快捷版11.2.0.2.0版 - 64位生产版 IDE:SQL开发人员 - Versión4.1.1.19

感谢。

2 个答案:

答案 0 :(得分:0)

您可能想要从v$database获取。在BEGIN

之后添加
SELECT
    created
INTO v_fecha
FROM
    v$database;

答案 1 :(得分:0)

未显示命令V_FECHA的输出,因为代码中NULL仍为SELECT ROUND(SYSDATE - NULL) FROM DUAL; 。您可以使用

验证
NULL

也没有显示任何内容。如果输入包含NULL值,则几乎SQL中的每个操作都将输出DBMS_OUTPUT,而SELECT则显示空字符串。

正如@Kaushik建议的那样,如果您将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

我提供了两个选项,NVLSYSDATE,以向您展示不同的可能性。

此外,我尝试只调用SYSDATE一次,因为{{1}}的每次调用可能稍晚于前一次调用。 (差别当然很小,但我试图防止很少发生但很难找到的错误。)