在 oracle 过程中设置 serveroutput on
Posted
技术标签:
【中文标题】在 oracle 过程中设置 serveroutput on【英文标题】:set serveroutput on in oracle procedure 【发布时间】:2012-10-18 07:55:30 【问题描述】:我创建了一个简单的程序。在这个过程中,我想输出一些数据。但是我把 设置服务器输出
它说
错误(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;
【问题讨论】:
在顶部创建之前移动 set serveroutput on @chrishardin 程序总是需要输出。并不是说我必须先设置服务器输出然后执行该过程 @chrislhardin 我需要把那个放在哪里?我把它放在哪里都写着code
Error(4,12): PLS-00103: Encountered the symbol "."当期望以下之一时:常量异常 table long double ref char time timestamp interval date binary national character ncharcode
orafaq.com/forum/t/14373/2
谢谢兄弟,成功了!
【参考方案1】:
为了理解“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。”
【讨论】:
【参考方案2】:“SET serveroutput ON”是 SQL*Plus 命令,不是有效的 PL/SQL。
【讨论】:
【参考方案3】:首先在你的 sp 中添加下一个代码:
BEGIN
dbms_output.enable();
dbms_output.put_line ('TEST LINE');
END;
在您的 Oracle SQL 开发人员中编译您的代码。所以转到菜单视图-> dbms 输出。单击 Icon Green Plus 并选择您的架构。立即运行您的 sp。
【讨论】:
【参考方案4】:其实你需要在BEGIN
调用之前调用SET SERVEROUTPUT ON;
。
每个人都建议这样做,但没有提供实际放置线路的建议:
SET SERVEROUTPUT ON;
BEGIN
FOR rec in (SELECT * FROM EMPLOYEES) LOOP
DBMS_OUTPUT.PUT_LINE(rec.EmployeeName);
ENDLOOP;
END;
否则,您将看不到任何输出。
【讨论】:
【参考方案5】: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;
/
【讨论】:
【参考方案6】:程序成功,但有任何输出
错误行 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
【讨论】:
请添加;在第一行的末尾。以上是关于在 oracle 过程中设置 serveroutput on的主要内容,如果未能解决你的问题,请参考以下文章
在 PreparedStatement 中设置 FetchSize 时 Oracle 驱动程序发生 OutOfMemoryError