11

簡単な手順を作成しました。この手順では、いくつかのデータを出力したいと考えています。ただし、set serveroutputをどこに置いても

それは言う

エラー(26,5): PLS-00103: 次のいずれかを予期しているときに、シンボル「SERVEROUTPUT」が検出されました: 。( ) , * @ % & = - + </> at in is mod 剰余 not rem => <> or != or ~= >= <= <> and or like like2 like4 likec as between || multiset メンバー submultiset

どこに置いても問題ありません、それは言い続けます。

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 は、最大 2000 バイトの SGA (共有グローバル領域) メモリ領域のバッファー内に内部的に格納されるためです。

*注:***ただし、**dbms_outputパッケージを使用した場合にのみ、このバッファが作成されることに注意してください。また、環境変数を設定する必要があるのは、セッションごとに 1 回だけです !!

そして、そのバッファからそれを取得するには、セッションの環境変数を設定する必要があります。サーバー出力をオンに設定しているということは、初心者にとって多くの混乱を招きますが (その命名法のため)、残念ながらそのようなことはありません。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 開発者でコードをコンパイルします。Menu View --> dbms output に移動します。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 に答える