118

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

 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

多次!

4

8 回答 8

222

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

默认情况下,大多数工具不会配置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;
于 2012-05-03T15:30:51.320 回答
33
  1. 确保通过菜单栏中的视图选项打开了 Dbms 输出窗口。
  2. 单击绿色的“+”号并添加您的数据库名称。
  3. 写'DBMS_OUTPUT.ENABLE;' 在您的程序中作为第一行。希望这能解决您的问题。
于 2016-05-23T07:29:10.620 回答
27

在第一行设置查询如下

SET SERVEROUTPUT ON 
于 2018-09-03T11:40:03.350 回答
18

这个说法

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

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

DBMS_OUTPUT.PUT_LINE(a.firstName || a.lastName);
于 2012-05-09T05:59:10.870 回答
9

对于 SQL 开发人员

您必须手动执行它

SET SERVEROUTPUT ON 

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

这将打印该行

请不要尝试添加这个

 SET SERVEROUTPUT ON

在函数和过程的定义中,它不会编译,也不会工作。

于 2020-12-31T10:12:43.007 回答
3

我正在使用 Oracle SQL Developer,

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

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

于 2019-01-25T05:21:45.537 回答
2

在此处输入图像描述

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

于 2022-01-03T10:19:29.350 回答
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;
    / 
于 2014-09-02T07:25:55.193 回答