语句未在 pl/sql 中打印

Posted

技术标签:

【中文标题】语句未在 pl/sql 中打印【英文标题】:Statement not getting printing in pl/sql 【发布时间】:2020-09-24 09:25:08 【问题描述】:

一行没有被打印出来

DECLARE 
R integer(10);
N varchar(20);
B VArchar(20);
Y VARCHAR(10);
A Integer(10);
E varchar2(10);
    
    CURSOR s IS 
    SELECT RollNo,Name, Branch, Year, Attendance_Percentage, Event FROM N_ROLLCALL
    WHERE branch='Comp' ORDER BY ROLLNO;
BEGIN
    OPEN s;
        LOOP
            FETCH s INTO R,N,B,Y,A,E ;
                 EXIT WHEN s%notfound;

            BEGIN
                DBMS_OUTPUT.PUT_LINE('      ROLLNO:'||R||'      NAME:'||N||'        BRANCH:'||B||'      YEAR:'||Y||'        ATTANDANCE_PERCENTAGE:'||A||'       EVENTS:'||E);
            END;
         
        END LOOP;
    CLOSE s;
    EXCEPTION
         WHEN DUP_VAL_ON_INDEX THEN
            dbms_output.put_line('You have tried to insert a duplicate roll_no.');
         WHEN OTHERS THEN
            dbms_output.put_line ('An error has occurred inserting a roll_no.');
END;

我得到的输出

已插入 1 行。

0.01 秒

但是,当我的行多于一个具有分支 ='comp' 的行时,我想使用 dbms_output.put_line 打印的行不会被打印。如果只有一个这样的条目,那么它就会被打印出来。

【问题讨论】:

你用的是什么客户端?打印消息通常需要在客户端手动开启。 我是 oracle apex,我已经创建了一个表 n_rollcall。我想从“comp”分支打印学生的详细信息,但没有打印任何内容。 在调用此代码 nlock 之前,您是否从控制台发出了命令 SET SERVEROUTPUT ON 其实我并没有在控制台上运行这段代码,我正在使用一个名为 apex oracle 的在线工具。 在 Apex 的哪里?它是 SQL Workshop,还是在您的某个应用程序/页面的进程中? 【参考方案1】:

DBMS_OUTPUT 在使用 APEX 时不会打印,因为它不是从控制台运行的。要显示成功消息,您需要将全局变量 APEX_APPLICATION.g_print_success_message 设置为您想要的成功消息。如果您想引发错误,您将需要使用 APEX_ERROR 包。如果使用 APEX_ERROR 包添加了任何错误,则在 APEX 完成处理后不会提交任何事务。

DECLARE
    R   INTEGER (10);
    N   VARCHAR (20);
    B   VARCHAR (20);
    Y   VARCHAR (10);
    A   INTEGER (10);
    E   VARCHAR2 (10);

    CURSOR s IS
          SELECT RollNo,
                 Name,
                 Branch,
                 Year,
                 Attendance_Percentage,
                 Event
            FROM N_ROLLCALL
           WHERE branch = 'Comp'
        ORDER BY ROLLNO;
BEGIN
    OPEN s;

    LOOP
        FETCH s
            INTO R,
                 N,
                 B,
                 Y,
                 A,
                 E;

        EXIT WHEN s%NOTFOUND;

        BEGIN
            APEX_APPLICATION.g_print_success_message (
                   '      ROLLNO:'
                || R
                || '      NAME:'
                || N
                || '      BRANCH:'
                || B
                || '      YEAR:'
                || Y
                || '      ATTANDANCE_PERCENTAGE:'
                || A
                || '      EVENTS:'
                || E);
        END;
    END LOOP;

    CLOSE s;
EXCEPTION
    WHEN DUP_VAL_ON_INDEX
    THEN
        apex_error.add_error (p_message            => 'You have tried to insert a duplicate roll_no.',
                              p_display_location   => apex_error.c_inline_in_notification);
    WHEN OTHERS
    THEN
        apex_error.add_error (p_message            => 'An error has occurred inserting a roll_no.',
                              p_display_location   => apex_error.c_inline_in_notification);
END;

【讨论】:

我不确定是否支持直接修改 g_print_success_message。 你在哪里得到错误?引发的错误是什么?您使用的是什么版本的 APEX? 我想打印行 DBMS_OUTPUT.PUT_LINE(' ROLLNO:'||R||' NAME:'||N||' BRANCH:'||B||' YEAR:'| |Y||' ATTANDANCE_PERCENTAGE:'||A||' 事件:'||E);但是什么都没有打印出来。我正在使用 apex oracle,因为我正在使用 SQL Workshop。

以上是关于语句未在 pl/sql 中打印的主要内容,如果未能解决你的问题,请参考以下文章

Oracle——PL/SQL

Others-PL/SQL Developer自动替换语句(自动打印select*from语句)

PL/SQL

oracle pl/sql中的循环及if语句

20181017 PL/SQL 记录

PL/SQL开发中动态SQL的使用方法