DBMS_OUTPUT.PUT_LINE yazdırılmıyor


95

Aşağıdaki kodu çalıştırırken, sadece prosedürün tamamlandığını ve istediğim bilgiyi (firstName, lastName) ve ardından aşağıdaki tablodaki seçme sorgusundaki diğer değerleri yazdırmadığını söylüyor.

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

Sunucu çıktısını açık olarak ayarlarken,

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

bir kaç sefer!

Yanıtlar:


199

İfadedeki "o" nedir, "sadece işlemin tamamlandığını söylüyor"?

Varsayılan olarak, çoğu araç dbms_outputyazma için bir arabellek yapılandırmaz ve kod çalıştırıldıktan sonra bu arabellekten okumaya çalışmaz. Öte yandan çoğu araç bunu yapma yeteneğine sahiptir. SQL * Plus'ta komutu kullanmanız gerekir set serveroutput on [size N|unlimited]. Yani şöyle bir şey yaparsın

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

SQL Developer'da, View | DBMS OutputDBMS Çıkışı penceresini etkinleştirmeye gidersiniz , ardından belirli bir oturum için DBMS Çıktısını etkinleştirmek için yeşil artı simgesine basarsınız.

Ek olarak, her satır için "a.firstNamea.lastName" hazır bilgisini yazdırmak istemediğinizi varsayarsak, muhtemelen

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

Üzgünüz, yukarıdaki prosedür yürütülürken mesaj PL / SQL prosedürü başarıyla tamamlandı. SQL plus kullanıyorum
Dexter

8
@dexter - Tamam. Daha sonra set serveroutput onprosedürü SQL * Plus'ta çalıştırmadan önce sadece komutu eklemeniz gerekir .
Justin Cave

@dexter - Doğru. Sonunda yorumuma bakın - her satır için bu değişmezliği istemiyorsanız, muhtemelen cevabımın sonunda gönderdiğim sözdizimini isteyeceksiniz.
Justin Cave

Tamam, şimdi doğru isimleri gösteriyor ama 100 kez gibi. görünen 100'lerce isim yerine aşağıdaki tabloda başlık, yıl, rol adı, alıntıyı nasıl görüntülerim
dexter

1
@dexter - Üzgünüm, anlamıyorum. İfadeyi SELECTSQL Plus komut istemine yazdığınızı, SQL ifadesinin çalıştırıldığını, verilerin döndürüldüğünü, ancak verilerin SQL Plus'ta görüntülenmediğini mi söylüyorsunuz ? Ayarlarla oynamadığınız sürece bu pek olası görünmüyor autotrace; bu durumda, sorgu sonuçları yerine bir sorgu planı ve yürütme istatistikleri görmüş olabilirsiniz. Bununla birlikte, orijinal sorunuzdan oldukça uzaklaşmaya başladık.
Justin Cave

22
  1. Menü çubuğundaki görünüm seçeneğinden Dbms Çıkışı pencerenizin açık olduğundan emin olun.
  2. Yeşil '+' işaretine tıklayın ve veritabanı adınızı ekleyin.
  3. 'DBMS_OUTPUT.ENABLE;' yazın. Prosedürünüz dahilinde ilk satır olarak. Umarız bu sorununuzu çözer.

Bu talimatlar hangi uygulama için tasarlanmıştır?
osullic

15

Sorguyu ilk satırda aşağıdaki gibi ayarlayın

SET SERVEROUTPUT ON 

çalışmıyor olsa bile .. Lütfen başka bir alternatif
sunun

Daha net olmak gerekirse. Sreenath S'nin önerdiği satır önce gider ve DECLARE ve BEGIN / END gibi tüm kod bloklarının dışındadır. İlk olarak çalışmayan DECLARE bloğumda yapmayı denedim. SQL * Plus kullanıyorum.
Grant Johnson

14

bu açıklama

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

dizeyi olduğu gibi yazdırmak anlamına gelir .. yazdırılacak değerleri almak için tırnak işaretlerini kaldırın. Yani doğru sözdizimi

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

3

Oracle SQL Developer kullanıyorum,

Bu araçta, dbms_output.put_line tarafından yazdırılan sonuçları görüntülemek için DBMS çıktısını etkinleştirmem gerekiyordu

Bu seçeneği, diğer sorgu sonuçlarının görüntülendiği sonuç bölmesinde bulabilirsiniz. sonuç bölmesinde 7 sekmem var. 1. sekme Sonuçlar olarak adlandırılır, sonraki sekme Komut Dosyası Çıktısı vb. Bunun dışında "DBMS Çıkışı" adında bir sekme bulabilirsiniz bu sekmeyi seçin, ardından 1. simge (bir diyalog simgesi gibi görünür) DBMS Çıktısını Etkinleştir'dir . Bu simgeye tıklayın. Daha sonra PL / SQL'i çalıştırır ve ardından "DBMS Çıkışı sekmesini seçersiniz, burada sonuçları görebilmelisiniz.


0

Hepsi for döngüsü üzerinde yoğunlaşıyor, ancak normal bir döngü kullanırsak, imleç kayıt değişkenini kullanmak zorunda kaldık. Aşağıdaki değiştirilmiş koddur

 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;
    / 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.