DBMS_OUTPUT.PUT_LINE无法打印


93

当执行以下代码时,它只是说该过程已完成,并且不会将我希望它的信息打印到(firstName,lastName),然后是下表中来自select查询的其他值。

 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

多次!

Answers:


191

“仅表示过程已完成”语句中的“它”是什么?

默认情况下,大多数工具不配置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,2012年

8
@dexter-好的。然后,您只需要set serveroutput on在执行SQL * Plus中的过程之前添加命令即可。
贾斯汀·凯夫

@dexter-对。最后查看我的评论-如果您不希望每一行都使用该文字,那么您可能希望我在答案末尾发布的语法。
贾斯汀·凯夫

好的,现在它显示正确的名称,但类似于100次。我如何在下表中显示标题,年份,角色名称,引号,而不是显示的名称的100年代
dexter 2012年

1
@dexter-对不起,我不明白。您是说您SELECT在SQL Plus命令提示符下键入了语句,执行了SQL语句,返回了数据,但数据未在SQL Plus中显示?除非您正在使用autotrace设置,否则这似乎不太可能,在这种情况下,您可能会看到查询计划和执行统计信息,而不是查询结果。但是,我们开始与您的原始问题相去甚远。
贾斯汀·凯夫

21
  1. 确保通过菜单栏中的视图选项打开“ Dbms输出”窗口。
  2. 单击绿色的“ +”号并添加您的数据库名称。
  3. 写入“ DBMS_OUTPUT.ENABLE;” 在您的程序中作为第一行。希望这能解决您的问题。

这些说明适用于哪些应用程序?
osullic

14

这个说法

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

表示按原样打印字符串.. 删除引号以获取要打印的值。因此正确的语法是

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

13

在第一行中将查询设置如下

SET SERVEROUTPUT ON 

即使它不工作。请提供任何其他替代
乐风Chittumuri

为了更加清楚。Sreenath S建议的行先行,并且在所有代码块(如DECLARE和BEGIN / END)之外。我尝试在无法使用的DECLARE块中首先使其制作成功。我正在使用SQL * Plus。
格兰特·约翰逊

2

我正在使用Oracle SQL Developer,

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

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


0

它们都集中在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;
    / 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.