DBMS_OUTPUT.PUT_LINE이 인쇄되지 않습니다.


93

다음 코드를 실행하면 절차가 완료되었다고 표시되고 원하는 정보 (firstName, lastName)를 인쇄하지 않고 아래 표의 선택 쿼리에서 다른 값을 인쇄하지 않습니다.

 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

여러 번!

답변:


191

"그냥 절차가 끝났다고 말하는 것"의 "그것"은 무엇입니까?

기본적으로 대부분의 도구는 dbms_output쓰기 위한 버퍼를 구성 하지 않으며 코드 실행 후 해당 버퍼에서 읽기를 시도하지 않습니다. 반면에 대부분의 도구는 그렇게 할 수 있습니다. SQL * Plus에서는 명령을 사용해야합니다 set serveroutput on [size N|unlimited]. 그래서 당신은 뭔가를 할 것입니다

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

SQL Developer View | DBMS Output에서 DBMS Output 창을 활성화 한 다음 녹색 더하기 아이콘을 눌러 특정 세션에 대해 DBMS Output을 활성화합니다.

또한 모든 행에 대해 리터럴 "a.firstNamea.lastName"을 인쇄하지 않는다고 가정하면

FOR row IN quote_recs
LOOP
  DBMS_OUTPUT.PUT_LINE( row.firstName || ' ' || row.lastName );
END LOOP;

죄송합니다. 위의 절차를 실행할 때 메시지는 PL / SQL 절차가 성공적으로 완료되었습니다. SQL plus를 사용하고 있습니다
dexter

8
@dexter-좋아요. 그런 다음 set serveroutput onSQL * Plus에서 절차를 실행하기 전에 명령 을 추가하기 만하면 됩니다.
Justin Cave

@dexter-맞습니다. 마지막에 내 의견을 참조하십시오. 모든 행에 대한 리터럴을 원하지 않는 경우 답변 끝에 게시 한 구문을 원할 것입니다.
Justin Cave

이제 올바른 이름이 표시되지만 100 번 정도 표시됩니다. 표시되는 100 개의 이름 대신 제목, 연도, 역할 이름, 인용문을 아래 표에 표시하려면 어떻게해야합니까?
dexter

1
@dexter-죄송합니다. 이해가 안 돼요. SELECTSQL Plus 명령 프롬프트 에서 문 을 입력하고 SQL 문이 실행되고 데이터가 반환되었지만 데이터가 SQL Plus에 표시되지 않았다는 뜻 입니까? autotrace쿼리 결과가 아닌 쿼리 계획 및 실행 통계를 보았을 수있는 설정을 사용하지 않는 한 그것은 가능성이없는 것 같습니다 . 그러나 우리는 원래 질문에서 다소 멀어지기 시작했습니다.
Justin Cave

21
  1. 메뉴 표시 줄의보기 옵션을 통해 Dbms 출력 창이 열려 있는지 확인하십시오.
  2. 녹색 '+'기호를 클릭하고 데이터베이스 이름을 추가하십시오.
  3. 'DBMS_OUTPUT.ENABLE;'쓰기 절차 내에서 첫 번째 줄로. 이것이 문제를 해결하기를 바랍니다.

이 지침은 어떤 용도로 사용됩니까?
osullic

14

이 진술

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

문자열을있는 그대로 인쇄하는 것을 의미합니다. 인쇄 할 값을 얻기 위해 따옴표제거합니다 . 올바른 구문은 다음과 같습니다.

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

13

첫 번째 줄에서 아래와 같이 쿼리를 설정하십시오.

SET SERVEROUTPUT ON 

심지어는 작동하지 않습니다 .. 알려주세요 다른 대안
Lova Chittumuri

더 명확하게. Sreenath S가 제안한 줄이 먼저 들어가며 DECLARE 및 BEGIN / END와 같은 모든 코드 블록 외부에 있습니다. 작동하지 않는 DECLARE 블록에서 먼저 만들어 보았습니다. SQL * Plus를 사용하고 있습니다.
Grant Johnson

2

Oracle SQL Developer를 사용하고 있습니다.

이 도구에서는 dbms_output.put_line에 의해 인쇄 된 결과를보기 위해 DBMS 출력활성화 해야했습니다.

이 옵션은 다른 쿼리 결과가 표시되는 결과 창에서 찾을 수 있습니다. 결과 창에 7 개의 탭이 있습니다. 결과로 명명 된 첫 번째 탭, 다음 탭은 스크립트 출력 등입니다. 여기에서 "DBMS Output"이라는 탭을 찾을 수 있습니다.이 탭을 선택한 다음 첫 번째 아이콘 (대화 상자 아이콘 모양)은 Enable DBMS Output 입니다. 이 아이콘을 클릭하십시오. 그런 다음 PL / SQL을 실행 한 다음 "DBMS Output 탭"을 선택하면 결과를 볼 수 있습니다.


0

모두 for 루프에 집중하고 있지만 일반 루프를 사용하는 경우 커서 레코드 변수를 사용해야합니다. 다음은 수정 된 코드입니다.

 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;
    / 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.