11

我创建了一个简单的程序。在这个过程中,我想输出一些数据。但是,无论我在哪里设置服务器输出

它说

错误(26,5):PLS-00103:在预期以下情况之一时遇到符号“SERVEROUTPUT”:。( ) , * @ % & = - + < / > at 是 mod 余数 not rem => <> or != or ~= >= <= <> and or like2 like4 likec as between || 多集成员子多集

不管我把它放在哪里,它一直在说。

create or replace PROCEDURE discount  

is --- signature 

BEGIN --- executable part

update dvd set me_our_price = me_our_price*0.90 WHERE me_release_year = 2011;
update dvd set me_our_price = me_our_price*0.80 WHERE me_release_year = 2010;

update bluray set me_our_price = me_our_price*0.95 WHERE me_release_year = 2011;
update bluray set me_our_price = me_our_price*0.90 WHERE me_release_year = 2010;


DBMS_OUTPUT.PUT_LINE(' Blurays '); 
for i in ( 
SELECT e.mo_title, e.mo_bluray.me_list_price as me_list_price, e.mo_bluray.me_our_price    as  me_our_price FROM movie e  where e.mo_bluray is not null
 ) 
loop 

DBMS_OUTPUT.PUT_LINE(i.mo_title|| '  ' || i.me_list_price|| '  ' || i.me_list_price); 

end loop; 

DBMS_OUTPUT.PUT_LINE(' DVDs '); 
for i in ( 
set serveroutput on
SELECT e.mo_title, e.mo_dvd.me_list_price as me_list_price, e.mo_dvd.me_our_price as      me_our_price FROM movie e  where e.mo_dvd is not null
 ) 
loop 
DBMS_OUTPUT.PUT_LINE(i.mo_title|| '  ' || i.me_list_price|| '  ' || i.me_list_price); 
end loop; 


END discount; 
4

6 回答 6

29

为了理解“SET SERVEROUTPUT ON”的使用,我举个例子

DECLARE
a number(10)  :=10;
BEGIN
dbms_output.put_line(a) ;
dbms_output.put_line('Hello World ! ')  ;
END ;

有输出:PL/SQl 程序成功完成,即没有预期的输出

背后的主要原因是,无论我们在dbms_output.put_line('ARGUMENT'/VALUES)中传递什么,即 ARGUMENT/VALUES,都内部存储在 SGA(共享全局区域)内存区域的缓冲区中,最多 2000 字节。

*注意:***但是应该注意,这个缓冲区仅在我们使用 **dbms_output包时创建。而且我们只需要为会话设置一次环境变量!

为了从该缓冲区中获取它,我们需要为 session 设置环境变量。我们正在设置服务器输出(因为它的命名法),这让初学者很困惑,但不幸的是它不是那样的。使用SET SERVER OUTPUT ON只是告诉 PL/SQL 引擎

*嘿,请打印我将在 dbms_output.put_line
中传递的 ARGUMENT/VALUES,然后 PL/SQl 运行时引擎在主控制台上打印参数。

我想我对你们都很清楚。祝你一切顺利 。要了解有关Oracle Server Engine架构结构的更多信息, 您可以在 Quora http://qr.ae/RojAn8上查看我的答案

并回答您的问题“应该在会话开始时使用 SET SERVER OUTPUT。”

于 2014-04-08T04:46:23.310 回答
22

“SET serveroutput ON”是一个 SQL*Plus 命令,不是有效的 PL/SQL。

于 2012-10-29T04:09:08.623 回答
10

首先在你的 sp 中添加下一个代码:

BEGIN
    dbms_output.enable();
    dbms_output.put_line ('TEST LINE'); 
END;

在您的 Oracle SQL 开发人员中编译您的代码。所以转到菜单视图-> dbms 输出。单击 Icon Green Plus 并选择您的架构。现在运行你的 sp。

于 2015-11-26T20:43:03.077 回答
4

实际上,您需要在调用SET SERVEROUTPUT ON;之前BEGIN调用。

每个人都建议这样做,但没有提供实际放置线路的建议:

SET SERVEROUTPUT ON;

BEGIN
    FOR rec in (SELECT * FROM EMPLOYEES) LOOP
        DBMS_OUTPUT.PUT_LINE(rec.EmployeeName);
    ENDLOOP;
END;

否则,您将看不到任何输出。

于 2018-03-29T17:26:50.723 回答
3
If you want to execute any procedure then firstly you have to set serveroutput on in the sqldeveloper work environment like.

->  SET SERVEROUTPUT ON;
-> BEGIN
dbms_output.put_line ('Hello World..');
dbms_output.put_line('Its displaying the values only for the Testing purpose');
END;
/
于 2019-01-25T05:49:38.430 回答
0

程序成功但有任何输出

错误行 1:意外的标识符

这是代码:

SET SERVEROUTPUT ON 

DECLARE

    -- Curseurs 
    CURSOR c1 IS        
    SELECT RWID FROM J_EVT
     WHERE DT_SYST < TO_DATE(TO_CHAR(SYSDATE,'DD/MM') || '/' || TO_CHAR(TO_NUMBER(TO_CHAR(SYSDATE, 'YYYY')) - 3));

    -- Collections 

    TYPE tc1 IS TABLE OF c1%RWTYPE;

    -- Variables de type record
    rtc1                        tc1;    

    vCpt                        NUMBER:=0;

BEGIN

    OPEN c1;
    LOOP
        FETCH c1 BULK COLLECT INTO rtc1 LIMIT 5000;

        FORALL i IN 1..rtc1.COUNT 
        DELETE FROM J_EVT
          WHERE RWID = rtc1(i).RWID;
        COMMIT;

        -- Nombres lus : 5025651
        FOR i IN 1..rtc1.COUNT LOOP               
            vCpt := vCpt + SQL%BULK_RWCOUNT(i);
        END LOOP;            

        EXIT WHEN c1%NOTFOUND;   
    END LOOP;
    CLOSE c1;
    COMMIT;

    DBMS_OUTPUT.PUT_LINE ('Nombres supprimes : ' || TO_CHAR(vCpt)); 

END;
/
exit
于 2019-09-09T12:22:52.127 回答