【问题标题】:DBMS_OUTPUT.PUT_LINE not printingDBMS_OUTPUT.PUT_LINE 不打印
【发布时间】:2012-05-13 03:37:05
【问题描述】:

执行以下代码时,它只是说程序已完成并且不打印我想要的信息(名字,姓氏),然后是下表中选择查询中的其他值。

 CREATE OR REPLACE PROCEDURE PRINT_ACTOR_QUOTES (id_actor char)
AS
CURSOR quote_recs IS
SELECT a.firstName,a.lastName, m.title, m.year, r.roleName ,q.quotechar from quote q, role r,   
rolequote rq, actor a, movie m
where
rq.quoteID = q.quoteID
AND
rq.roleID = r.roleID
 AND
r.actorID = a.actorID
AND
r.movieID = m.movieID
AND
 a.actorID = id_actor;
BEGIN
FOR row IN quote_recs LOOP
DBMS_OUTPUT.PUT_LINE('a.firstName' || 'a.lastName');

end loop;
END PRINT_ACTOR_QUOTES;
/ 

设置服务器输出时,我得到

a.firstNamea.lastName
a.firstNamea.lastName
a.firstNamea.lastName
a.firstNamea.lastName

多次!

【问题讨论】:

    标签: plsql oracle10g sqlplus dbms-output


    【解决方案1】:

    “它只是说程序完成”语句中的“它”是什么?

    默认情况下,大多数工具不会为dbms_output 配置要写入的缓冲区,并且不会在代码执行后尝试从该缓冲区读取。另一方面,大多数工具都有能力这样做。在 SQL*Plus 中,您需要使用命令set serveroutput on [size N|unlimited]。所以你会做类似的事情

    SQL> set serveroutput on size 30000;
    SQL> exec print_actor_quotes( <<some value>> );
    

    在 SQL Developer 中,您可以转到 View | DBMS Output 启用 DBMS 输出窗口,然后按绿色加号图标为特定会话启用 DBMS 输出。

    此外,假设您不想为每一行打印文字“a.firstNamea.lastName”,您可能想要

    FOR row IN quote_recs
    LOOP
      DBMS_OUTPUT.PUT_LINE( row.firstName || ' ' || row.lastName );
    END LOOP;
    

    【讨论】:

    • 对不起,执行上述过程时,消息是PL/SQL过程成功完成。我正在使用 SQL plus
    • @dexter - 好的。那么您只需要在 SQL*Plus 中执行该过程之前添加set serveroutput on 命令即可。
    • @dexter - 对。请在最后查看我的评论 - 如果您不希望每一行都使用该文字,您可能需要我在答案末尾发布的语法。
    • @dexter - 对不起,我不明白。你是说你在SQLPlus命令提示符下输入SELECT语句,SQL语句执行,数据返回,但是SQLPlus中没有显示数据?除非您使用autotrace 设置,否则这似乎不太可能,在这种情况下,您可能看到的是查询计划和执行统计信息,而不是查询结果。但是,我们开始与您最初的问题相去甚远。
    • 对某人来说可能很有趣:我仍然没有使用本手册获得 SQL Developer 的输出。一段时间后,我找到了原因。 community.oracle.com/thread/4062562如果您使用旧数据库(Oracle 10g)和当前版本的 SQL Developer,则会出现错误。
    【解决方案2】:
    1. 确保通过菜单栏中的查看选项打开 Dbms 输出窗口。
    2. 点击绿色的“+”号并添加您的数据库名称。
    3. 写入“DBMS_OUTPUT.ENABLE;”在您的程序中作为第一行。 希望这能解决您的问题。

    【讨论】:

    • 这些说明适用于哪些应用程序?
    【解决方案3】:

    在第一行设置查询如下

    SET SERVEROUTPUT ON 
    

    【讨论】:

    • 即使它不起作用..请提供任何其他替代方案
    • 只是为了更加清楚。 Sreenath S 建议的行先行,并且位于 DECLARE 和 BEGIN/END 等所有代码块之外。我尝试在我的 DECLARE 块中首先创建它,但它不起作用。我正在使用 SQL*Plus。
    【解决方案4】:

    这句话

    DBMS_OUTPUT.PUT_LINE('a.firstName' || 'a.lastName');

    表示按原样打印字符串。去掉引号得到要打印的值。所以正确的语法是

    DBMS_OUTPUT.PUT_LINE(a.firstName || a.lastName);
    

    【讨论】:

      【解决方案5】:

      对于 SQL 开发人员

      你必须手动执行它

      SET SERVEROUTPUT ON 
      

      之后,如果您使用 DBMS_OUTPUT.PUT_LINE('info'); 执行任何过程;或直接。

      这将打印该行

      请不要尝试添加此内容

       SET SERVEROUTPUT ON
      

      在function和procedure的定义里面,不会编译,也不会工作。

      【讨论】:

        【解决方案6】:

        我正在使用 Oracle SQL Developer,

        在这个工具中,我必须启用 DBMS 输出才能查看 dbms_output.put_line 打印的结果

        您可以在显示其他查询结果的结果窗格中找到此选项。 所以,在结果窗格中,我有 7 个选项卡。第一个选项卡名为结果,下一个是脚本输出,依此类推。从中您可以找到一个名为“DBMS 输出”的选项卡,选择此选项卡,然后第一个图标(看起来像一个对话图标)是 启用 DBMS 输出。单击此图标。然后执行 PL/SQL,然后选择“DBMS 输出”选项卡,您应该可以在那里看到结果。

        【讨论】:

          【解决方案7】:

          在 Oracle SQL Developer 中,您可以按照下图的步骤进行操作:

          【讨论】:

            【解决方案8】:

            他们都专注于 for 循环,但如果我们使用普通循环,那么我们必须使用游标记录变量。以下是修改后的代码

             CREATE OR REPLACE PROCEDURE PRINT_ACTOR_QUOTES (id_actor char)
                AS
                CURSOR quote_recs IS
                SELECT a.firstName,a.lastName, m.title, m.year, r.roleName ,q.quotechar from quote q, role r,   
                rolequote rq, actor a, movie m
                where
                rq.quoteID = q.quoteID
                AND
                rq.roleID = r.roleID
                 AND
                r.actorID = a.actorID
                AND
                r.movieID = m.movieID
                AND
                 a.actorID = id_actor;
                recd quote_recs%rowtype;
                BEGIN
                open quote_recs;
                LOOP
                fetch quote_recs into recs;
                exit when quote_recs%notfound;
                DBMS_OUTPUT.PUT_LINE(recd.firstName||recd.lastName);
                end loop;
                close quote_recs;
                END PRINT_ACTOR_QUOTES;
                / 
            

            【讨论】:

              猜你喜欢
              • 2016-03-02
              • 2018-04-18
              • 2018-12-18
              • 2018-10-31
              • 2016-10-29
              • 2018-02-04
              • 2020-11-14
              • 2011-06-22
              • 2018-09-23
              相关资源
              最近更新 更多