DBMS_OUTPUT.PUT_LINE tidak mencetak

93

Saat menjalankan kode berikut, itu hanya mengatakan prosedur selesai dan tidak mencetak informasi yang saya inginkan (firstName, lastName) dan kemudian nilai lain dari kueri pemilihan dalam tabel di bawah ini.

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

Saat mengatur output server, saya mengerti

a.firstNamea.lastName
a.firstNamea.lastName
a.firstNamea.lastName
a.firstNamea.lastName

berkali-kali!

dexter
sumber

Jawaban:

193

Apa yang dimaksud dengan "itu" dalam pernyataan "hanya mengatakan prosedur selesai"?

Secara default, sebagian besar alat tidak mengkonfigurasi buffer untuk dbms_outputmenulis dan tidak mencoba membaca dari buffer itu setelah kode dijalankan. Sebaliknya, kebanyakan alat memiliki kemampuan untuk melakukannya. Di SQL * Plus, Anda harus menggunakan perintah set serveroutput on [size N|unlimited]. Jadi Anda akan melakukan sesuatu seperti

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

Di Pengembang SQL, Anda akan pergi untuk View | DBMS Outputmengaktifkan jendela Output DBMS, lalu tekan ikon plus hijau untuk mengaktifkan Output DBMS untuk sesi tertentu.

Selain itu, dengan asumsi Anda tidak ingin mencetak "a.firstNamea.lastName" literal untuk setiap baris, Anda mungkin ingin

FOR row IN quote_recs
LOOP
  DBMS_OUTPUT.PUT_LINE( row.firstName || ' ' || row.lastName );
END LOOP;
Gua Justin
sumber
Maaf, saat menjalankan prosedur di atas pesan PL / SQL prosedur berhasil diselesaikan. Saya menggunakan SQL plus
dexter
8
@dexter - Oke. Kemudian Anda hanya perlu menambahkan set serveroutput onperintah sebelum menjalankan prosedur di SQL * Plus.
Gua Justin
@dexter - Benar. Lihat komentar saya di akhir - jika Anda tidak menginginkan literal itu untuk setiap baris, Anda mungkin menginginkan sintaks yang saya posting di akhir jawaban saya.
Gua Justin
Ok jadi sekarang ini menampilkan nama yang benar tapi seperti 100 kali. bagaimana saya menampilkan judul, tahun, nama rol, kutipan dalam tabel di bawah ini daripada 100 nama yang muncul
dexter
1
@dexter - Maaf, saya tidak mengerti. Apakah Anda mengatakan bahwa Anda mengetik SELECTpernyataan pada prompt perintah SQL Plus, pernyataan SQL dijalankan, data dikembalikan, tetapi data tidak ditampilkan di SQL Plus? Tampaknya tidak mungkin kecuali Anda bermain-main dengan autotracepengaturan dalam hal ini Anda mungkin telah melihat rencana kueri dan statistik eksekusi daripada hasil kueri. Namun, kami mulai agak jauh dari pertanyaan awal Anda.
Gua Justin
21
  1. Pastikan Anda memiliki jendela Keluaran Dbms terbuka melalui opsi tampilan di bilah menu.
  2. Klik tanda '+' hijau dan tambahkan nama database Anda.
  3. Tulis 'DBMS_OUTPUT.ENABLE;' dalam prosedur Anda sebagai baris pertama. Semoga ini menyelesaikan masalah Anda.
Atul Patel
sumber
Untuk aplikasi apa instruksi ini ditujukan?
osullic
14

pernyataan ini

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

berarti mencetak string apa adanya .. hapus tanda kutip untuk mendapatkan nilai yang akan dicetak. Jadi sintaks yang benar adalah

DBMS_OUTPUT.PUT_LINE(a.firstName || a.lastName);
asura
sumber
14

Atur Query seperti di bawah ini pada baris pertama

SET SERVEROUTPUT ON 
Sreenath S
sumber
bahkan tidak berfungsi .. Harap berikan alternatif lain
Lova Chittumuri
Hanya untuk lebih jelasnya. Baris yang disarankan Sreenath S berada di urutan pertama dan berada di luar semua blok kode seperti MENYATAKAN dan BEGIN / END. Saya mencoba membuatnya terlebih dahulu di blok MENYATAKAN saya yang tidak berfungsi. Saya menggunakan SQL * Plus.
Grant Johnson
2

Saya menggunakan Oracle SQL Developer,

Dalam alat ini, saya harus mengaktifkan keluaran DBMS untuk melihat hasil yang dicetak oleh dbms_output.put_line

Anda bisa menemukan opsi ini di panel hasil tempat hasil kueri lain ditampilkan. jadi, di panel result, saya punya 7 tab. Tab pertama dinamai Hasil, berikutnya adalah Output Script dan seterusnya. Dari sini Anda dapat menemukan tab bernama "DBMS Output" pilih tab ini, kemudian ikon pertama (tampak seperti ikon dialog) adalah Aktifkan Output DBMS . Klik ikon ini. Kemudian Anda menjalankan PL / SQL, lalu pilih "tab Output DBMS, Anda harus dapat melihat hasilnya di sana.

John Prawyn
sumber
0

Semuanya berkonsentrasi pada for loop tetapi jika kita menggunakan loop normal maka kita harus menggunakan variabel cursor record. Berikut ini adalah kode yang dimodifikasi

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