Plsql DBMS_OUTPUT.PUT_行未打印

Plsql DBMS_OUTPUT.PUT_行未打印,plsql,oracle10g,sqlplus,dbms-output,Plsql,Oracle10g,Sqlplus,Dbms Output,当执行下面的代码时,它只是说过程已经完成,并且没有打印我希望它显示的信息: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,

当执行下面的代码时,它只是说过程已经完成,并且没有打印我希望它显示的信息: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

多次

在声明中它只是说程序已经完成了,这是什么意思

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

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

DBMS_OUTPUT.PUT_行'a.firstName'| |'a.lastName'

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

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

它们都集中在for循环上,但是如果我们使用普通循环,那么就必须使用cursor-record变量。下面是修改后的代码

 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;
    / 
确保通过菜单栏中的view选项打开Dbms输出窗口。 单击绿色“+”符号并添加数据库名称。 写入“DBMS_OUTPUT.ENABLE;”在您的程序中作为第一行。 希望这能解决你的问题。
在第一行设置查询如下

SET SERVEROUTPUT ON 

我使用的是Oracle SQL Developer

在这个工具中,我必须启用DBMS输出来查看DBMS_output.put_行打印的结果

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

对于SQL Developer

您必须手动执行它

SET SERVEROUTPUT ON 
之后,如果您使用DBMS_OUTPUT执行任何过程,请将_行“info”;或者直接

这将打印该行

请不要试图添加这个

 SET SERVEROUTPUT ON

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

对不起,执行上面的过程时,消息是PL/SQL过程成功完成。我正在使用SQLplus@dexter-好的。然后,在SQL*Plus中执行该过程之前,只需添加set serveroutput on命令。@dexter-Right。请看我在结尾的评论-如果你不希望每行都有这样的文字,你可能会想要我在答案末尾发布的语法。我如何在下表中显示标题、年份、角色名称和引号,而不是显示名称的100appears@dexter-对不起,我不明白。您是说您在SQLPlus命令提示符下键入了SELECT语句,执行了SQL语句,返回了数据,但数据没有显示在SQLPlus中吗?这似乎不太可能,除非您正在使用autotrace设置,在这种情况下,您可能看到的是查询计划和执行统计信息,而不是查询结果。然而,我们已经开始离你原来的问题很远了。即使它不起作用。。请提供任何其他备选方案,以便更加清楚。Sreenath S建议的行位于所有代码块(如DECLARE和BEGIN/END)的前面。我尝试在我的DECLARE块中首先创建它,但它不起作用。我使用的是SQL*Plus。这些说明适用于哪个应用程序?它在Oracle SQL Developer中工作
 SET SERVEROUTPUT ON