การพิมพ์ค่าของตัวแปรใน SQL Developer


102

ฉันต้องการพิมพ์ค่าของตัวแปรเฉพาะซึ่งอยู่ในบล็อกที่ไม่ระบุตัวตน ฉันใช้ Oracle SQL Developer ฉันลองใช้dbms_output.put_line. แต่มันไม่ทำงาน รหัสที่ฉันใช้แสดงอยู่ด้านล่าง

SET SERVEROUTPUT ON

DECLARE

  CTABLE USER_OBJECTS.OBJECT_NAME%TYPE;
  CCOLUMN ALL_TAB_COLS.COLUMN_NAME%TYPE;
  V_ALL_COLS VARCHAR2(500);

  CURSOR CURSOR_TABLE
    IS
    SELECT OBJECT_NAME 
    FROM USER_OBJECTS 
    WHERE OBJECT_TYPE='TABLE'
    AND OBJECT_NAME LIKE 'tb_prm_%';

  CURSOR CURSOR_COLUMNS (V_TABLE_NAME IN VARCHAR2)
    IS
    SELECT COLUMN_NAME
    FROM ALL_TAB_COLS
    WHERE TABLE_NAME = V_TABLE_NAME;

BEGIN

  OPEN CURSOR_TABLE;

  LOOP
    FETCH CURSOR_TABLE INTO CTABLE;
    EXIT WHEN CURSOR_TABLE%NOTFOUND;

    OPEN CURSOR_COLUMNS (CTABLE);

    V_ALL_COLS := NULL;

    LOOP
      FETCH CURSOR_COLUMNS INTO CCOLUMN;
      V_ALL_COLS := V_ALL_COLS || CCOLUMN;
      IF CURSOR_COLUMNS%FOUND THEN
        V_ALL_COLS := V_ALL_COLS || ', ';
      ELSE
        EXIT;
      END IF;
    END LOOP;

    DBMS_OUTPUT.PUT_LINE(V_ALL_COLS);

  END LOOP;
  CLOSE CURSOR_TABLE;

END;

และฉันได้รับผลลัพธ์เป็นanonymous block completed.


เอาต์พุตจะถูกล้างเมื่อสิ้นสุด / สิ้นสุดโปรแกรมนั่นคือวิธีการทำงาน คุณไม่สามารถล้างเพื่อแสดงขณะทำงานได้ ดูตารางบันทึก (ธุรกรรมอัตโนมัติ) เพื่อดูว่าเกิดอะไรขึ้นในขณะที่โปรแกรมกำลังทำงาน
tbone

ทำไมไม่ใช้ดีบักเกอร์ในตัวและก้าวผ่านบล็อกของคุณ แสดงสถานะของตัวแปรทั้งหมด
Wolf

5
ตั้งค่าเซิร์ฟเวอร์เปิด; - เพิ่มเซมิโคลอนเลือกทั้งหมดและทำงานในนักพัฒนาสำหรับฉันมันทำงานได้ดี
Praveenkumar_V

คำตอบ:


203

คุณต้องเปิด dbms_output ใน Oracle SQL Developer:

  1. แสดงหน้าต่างเอาต์พุต DBMS (View-> DBMS Output)
  2. กดปุ่ม "+" ที่ด้านบนของหน้าต่าง Dbms Output จากนั้นเลือกการเชื่อมต่อฐานข้อมูลแบบเปิดในกล่องโต้ตอบที่เปิดขึ้น

ใน SQL * Plus:

 SET SERVEROUTPUT ON

ในเวอร์ชัน 1.5.5 ดูเหมือนว่าฉันจะไม่มีตัวเลือกนั้นใน View มีการเชื่อมต่อไฟล์รายงาน ... แถบสถานะแถบเครื่องมือรีเฟรช แต่ไม่มีเอาต์พุต DBMS มีหลายสิ่งอยู่ภายใต้การตั้งค่า แต่ฉันยังไม่เห็นตัวเลือกสำหรับเอาต์พุต
ruffin

1
@ruffin: v1.5.5 มีอายุ 3 ปี ฉันใช้ v3.0 และเวอร์ชันปัจจุบันน่าจะเป็น v3.1
Klas Lindbäck

/ พยักหน้าเราติดอยู่ที่ 1.5.5 - ถ้าคุณมีคำตอบที่สะดวกฉันจะรับ แต่เป็นอย่างอื่น ขอบคุณ!
ruffin

ฉันตั้งค่าตัวเลือก "SET SERVEROUTPUT ON" ในไฟล์ sql บรรทัดแรก
Samih A

ขอบคุณมาก!
Amazigh.Ca

18

ดูเหมือนว่านักพัฒนา SQL จะแสดงเฉพาะข้อความ DBMS_OUTPUT เมื่อคุณเปิดบานหน้าต่างหน้าต่าง DBMS_OUTPUT อย่างชัดเจน

ไปที่ (Menu) VIEW -> Dbms_output เพื่อเรียกใช้บานหน้าต่าง

คลิกที่เครื่องหมาย Green Plus เพื่อเปิดใช้งานเอาต์พุตสำหรับการเชื่อมต่อของคุณจากนั้นเรียกใช้รหัส

แก้ไข: อย่าลืมกำหนดขนาดบัฟเฟอร์ตามจำนวนเอาต์พุตที่คุณคาดหวัง


6

สร้างเอาต์พุตของเซิร์ฟเวอร์ในอันดับแรก

  1. SET SERVEROUTPUT on แล้ว

  2. ไปที่หน้าต่าง DBMS Output (View-> DBMS Output)

  3. จากนั้นกดCtrl+ Nเพื่อเชื่อมต่อเซิร์ฟเวอร์


3

มี 2 ​​ตัวเลือก:

set serveroutput on format wrapped;

หรือ

เปิดเมนู 'view' และคลิกที่ 'dbms output' คุณควรได้รับหน้าต่างผลลัพธ์ dbms ที่ด้านล่างของแผ่นงาน จากนั้นคุณต้องเพิ่มการเชื่อมต่อ (ด้วยเหตุผลบางประการจึงไม่ได้ดำเนินการโดยอัตโนมัติ)


1

1) ไปที่เมนูดู
2) เลือกรายการเมนู DBMS_OUTPUT
3) กดCtrl+ Nและเลือกตัวแก้ไขการเชื่อมต่อ
4) ดำเนินการคำสั่ง SET SERVEROUTPUT ON
5) จากนั้นรันสคริปต์ PL / SQL ของคุณ

ป้อนคำอธิบายภาพที่นี่ ป้อนคำอธิบายภาพที่นี่


0
DECLARE

  CTABLE USER_OBJECTS.OBJECT_NAME%TYPE;
  CCOLUMN ALL_TAB_COLS.COLUMN_NAME%TYPE;
  V_ALL_COLS VARCHAR2(5000);

  CURSOR CURSOR_TABLE
    IS
    SELECT OBJECT_NAME 
    FROM USER_OBJECTS 
    WHERE OBJECT_TYPE='TABLE'
    AND OBJECT_NAME LIKE 'STG%';

  CURSOR CURSOR_COLUMNS (V_TABLE_NAME IN VARCHAR2)
    IS
    SELECT COLUMN_NAME
    FROM ALL_TAB_COLS
    WHERE TABLE_NAME = V_TABLE_NAME;

BEGIN

  OPEN CURSOR_TABLE;
  LOOP
    FETCH CURSOR_TABLE INTO CTABLE;

    OPEN CURSOR_COLUMNS (CTABLE);
    V_ALL_COLS := NULL;
    LOOP

      FETCH CURSOR_COLUMNS INTO CCOLUMN;
      V_ALL_COLS := V_ALL_COLS || CCOLUMN;
      IF CURSOR_COLUMNS%FOUND THEN
        V_ALL_COLS := V_ALL_COLS || ', ';
      ELSE
        EXIT;
      END IF;
    END LOOP;
   close CURSOR_COLUMNS ;
    DBMS_OUTPUT.PUT_LINE(V_ALL_COLS);
    EXIT WHEN CURSOR_TABLE%NOTFOUND;
  END LOOP;`enter code here`
  CLOSE CURSOR_TABLE;

END;

ฉันได้เพิ่มปิดเคอร์เซอร์ที่สองแล้ว มันทำงานและได้รับเอาต์พุตเช่นกัน ...



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.