DBMS_OUTPUT.PUT_LINE ไม่พิมพ์


94

เมื่อเรียกใช้โค้ดต่อไปนี้เพียงแค่บอกว่าขั้นตอนเสร็จสมบูรณ์และไม่ได้พิมพ์ข้อมูลที่ฉันต้องการ (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

หลายครั้ง!

คำตอบ:


194

"มัน" คืออะไรในคำสั่ง "มันบอกว่าขั้นตอนเสร็จสมบูรณ์"?

โดยค่าเริ่มต้นเครื่องมือส่วนใหญ่จะไม่กำหนดค่าบัฟเฟอร์สำหรับ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 onคำสั่งก่อนดำเนินการตามขั้นตอนใน SQL * Plus
Justin Cave

@dexter - ขวา ดูความคิดเห็นของฉันในตอนท้าย - ถ้าคุณไม่ต้องการตัวอักษรนั้นสำหรับทุกแถวคุณอาจต้องการไวยากรณ์ที่ฉันโพสต์ไว้ท้ายคำตอบของฉัน
Justin Cave

ตกลงตอนนี้จะแสดงชื่อที่ถูกต้อง แต่เหมือน 100 ครั้ง ฉันจะแสดงชื่อ, ปี, ชื่อเล่น, อ้างในตารางด้านล่างแทนชื่อ 100 ที่ปรากฏได้อย่างไร
dexter

1
@dexter - ฉันขอโทษฉันไม่เข้าใจ คุณกำลังบอกว่าคุณพิมพ์คำสั่งที่พรอมต์คำสั่งSELECT SQL Plus คำสั่ง SQL ดำเนินการข้อมูลถูกส่งกลับ แต่ข้อมูลไม่แสดงใน SQL Plus? ดูเหมือนว่าไม่น่าจะเป็นไปได้เว้นแต่คุณจะเล่นกับautotraceการตั้งค่าซึ่งในกรณีนี้คุณอาจเห็นแผนการสืบค้นและสถิติการดำเนินการมากกว่าผลการสืบค้น อย่างไรก็ตามเราเริ่มที่จะห่างไกลจากคำถามเดิมของคุณ
Justin Cave

21
  1. ตรวจสอบให้แน่ใจว่าคุณได้เปิดหน้าต่าง Dbms Output ผ่านตัวเลือกมุมมองในเมนู
  2. คลิกที่เครื่องหมาย '+' สีเขียวและเพิ่มชื่อฐานข้อมูลของคุณ
  3. เขียน 'DBMS_OUTPUT.ENABLE;' ภายในขั้นตอนของคุณเป็นบรรทัดแรก หวังว่านี่จะช่วยแก้ปัญหาของคุณได้

คำแนะนำเหล่านี้มีไว้สำหรับแอปพลิเคชันใด
osullic

14

คำสั่งนี้

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

หมายถึงการพิมพ์สตริงตามที่เป็น .. ลบเครื่องหมายคำพูดเพื่อรับค่าที่จะพิมพ์ดังนั้นไวยากรณ์ที่ถูกต้องคือ

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

14

ตั้งค่าการสืบค้นตามด้านล่างในบรรทัดแรก

SET SERVEROUTPUT ON 

แม้ว่ามันจะไม่ทำงานก็ตาม .. โปรดระบุทางเลือกอื่น
Lova Chittumuri

เพียงเพื่อให้ชัดเจนเป็นพิเศษ บรรทัดที่ Sreenath S ได้แนะนำไปก่อนและอยู่นอกบล็อกโค้ดทั้งหมดเช่น DECLARE และ BEGIN / END ฉันลองทำเป็นครั้งแรกในบล็อก DECLARE ซึ่งใช้ไม่ได้ ฉันใช้ SQL * Plus
Grant Johnson

2

ฉันใช้ Oracle SQL Developer

ในเครื่องมือนี้ฉันต้องเปิดใช้เอาต์พุต DBMSเพื่อดูผลลัพธ์ที่พิมพ์โดย dbms_output.put_line

คุณสามารถค้นหาตัวเลือกนี้ได้ในบานหน้าต่างผลลัพธ์ซึ่งจะแสดงผลลัพธ์คิวรีอื่น ๆ ดังนั้นในบานหน้าต่างผลลัพธ์ฉันมี 7 แท็บ แท็บที่ 1 ชื่อว่าผลลัพธ์ถัดไปคือเอาต์พุตสคริปต์และอื่น ๆ ออกจากนี้คุณจะพบแท็บชื่อเป็น "DBMS เอาท์พุท" เลือกแท็บนี้แล้วไอคอนที่ 1 (ดูเหมือนไอคอนการเจรจา) จะเปิดใช้งาน DBMS เอาท์พุท คลิกไอคอนนี้ จากนั้นคุณดำเนินการ PL / SQL จากนั้นเลือก "แท็บ DBMS Output คุณควรจะเห็นผลลัพธ์ที่นั่น


0

พวกเขาทั้งหมดมุ่งเน้นไปที่ for loop แต่ถ้าเราใช้ลูปปกติเราต้องใช้ตัวแปรบันทึกเคอร์เซอร์ ต่อไปนี้เป็นรหัสที่แก้ไข

 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.