programing

오라클 프로시저에서 서버 출력 설정

codeshow 2023. 9. 24. 13:10
반응형

오라클 프로시저에서 서버 출력 설정

간단한 절차를 만들었습니다.이 절차에서는 몇 가지 데이터를 출력하고자 합니다.그러나 설정된 서버 출력을 설정하는 곳마다

라고 합니다.

오류(26,5): PLS-00103: 다음 중 하나를 예상할 때 "SERVEROUT" 기호가 발생했습니다. . ( ), * @ % & = - + < / > at is mod 나머지는 rem = > <> 또는 != 또는 ~= > = <= > 등입니다. || 멀티셋 멤버 하위 멀티셋 사이의 like4 like4.

어디에 두든 상관없어요, 계속 쓰여요.

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 SERVER OUTPUT 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(' ARPONT '/VALUES), 즉 ARPONT/VALUES는 SGA(Shared Global Area) 메모리 영역의 버퍼 내부에 최대 2000바이트까지 저장됩니다.

*참고 :***그러나버퍼는 **dbms_output package를 사용할 때만 생성됩니다.그리고 환경 변수는 한 세션에 한 번만 설정하면 됩니다!!

그리고 해당 버퍼에서 가져오려면 세션의 환경 변수를 설정해야 합니다.서버 출력을 (이름 때문에) 설정하는 것은 초보자들에게 많은 혼란을 주지만 유감스럽게도 그런 것은 아닙니다. SET SERVER OUTPUT ON을 사용하는 것은 PL/SQL 엔진에 다음과 같은 것을 알려주는 것입니다.

*안녕하세요 dbms_output 안에 전달할 ARGONT/VALUES를 출력해주세요.put_line
그리고 PL/SQL 런타임 엔진은 인수를 메인 콘솔에 출력합니다.

잘 알고 있습니다. 좋은 일만 가득하시길 바랍니다.Oracle Server Engine아키텍처 구조에 대한 자세한 내용은 Quora http://qr.ae/RojAn8 에서 확인할 수 있습니다.

그리고 "세션 초반에 SET SERVER OUTPUT을 사용해야 합니다."라는 질문에 답변을 드립니다.

"SET server output ON"은 SQL*Plus 명령이며 유효한 PL/SQL이 아닙니다.

먼저 sp에 다음 코드를 추가합니다.

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

Oracle SQL 개발자에서 코드를 컴파일합니다.메뉴 보기 --> dbms 출력으로 이동합니다.Icon Green Plus를 클릭하고 스키마를 선택합니다.지금 돌려요.

한테 요, SET SERVEROUTPUT ON; 전에BEGIN러.

모두가 이를 제안했지만 실제로 어디에 줄을 세울 것인지에 대한 조언은 없습니다.

SET SERVEROUTPUT ON;

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

그렇지 않으면 출력이 표시되지 않습니다.

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;
/

절차는 성공했지만 출력은 모두 성공했습니다.

오류 행 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

언급URL : https://stackoverflow.com/questions/13114220/set-serveroutput-on-in-oracle-procedure

반응형