2
CREATE OR REPLACE procedure verify_data
IS
cursor c1 is 
select 
  e.id
from 
  table1 e 
where 
  id IN (select id from table1)
  and id in (select id from table2);
BEGIN
FOR ed in c1
   LOOP
      DBMS_OUTPUT.PUT_LINE(ed.id||ed.name);
   END LOOP;
END;
/

このPL/SQLを実行すると、次のように出力されます。

14アンドリュー・R・スミス

書式設定などでこのような通常の結果として出力するにはどうすればよいですか?

以下は、ターミナルで直接selectステートメントを実行した場合にどうなるかです。

        ID NAME
---------- --------------------------------------------------
        14 Andrew R. Smith

最初の質問: DBMS_OUTPUT.PUT_LINEをターミナルに表示されるものと同じにする方法。IDのように、以下はIDデータ、NAMEなどです。

次の問題:

聞きたいのは

カーソルが空であるか結果がない場合に、DBMS_OUTPUT.PUT_LINE( "NO RECORDS");という出力を行うにはどうすればよいですか。

すべての助けをありがとう!

アップデート:

これは私がしました

CREATE OR REPLACE procedure verify_data
IS
cursor c1 is 
select 
  e.id
from 
  table1 e 
where 
  id IN (select id from table1)
  and id in (select id from table2);
BEGIN
FOR ed in c1
   LOOP
      DBMS_OUTPUT.PUT_LINE(ed.id||ed.name);

 if c1%notfound then
 DBMS_OUTPUT.PUT_LINE('Okay');
  end if;

END LOOP;

END;

ただし、PL / SQLからレコードがフェッチされていない場合は、「OK」と出力されません。END LOOPの後にc1%notfoundを追加しました

4

2 に答える 2

1

dbms_outputを使用しているため、通常のsqlselectステートメントのような見出しは表示されません。

だから私が知っている唯一の方法はあなた自身の見出しを印刷することです。また、ループの前にカウンターを初期化し、ループ内でカウンターを増やすと、ループの後で結果があったかどうかを確認できます。次に、必要に応じて「NORECORDS」のようなメッセージを印刷できます。

于 2012-11-25T21:22:49.973 に答える
1

列名を表示する場合は、ループの前にもう1行追加する必要があります。

DBMS_OUTPUT.PUT_LINE('col1 col2 ...');

これはそれを行う唯一の方法だと思います。

以下のコードは、カーソルをチェックする方法を示しています。

if c1%notfound then
  DBMS_OUTPUT.PUT_LINE('NO RECORDS');
end if;

ここでは、カーソル属性に関する詳細情報を見つけることができます。

CREATE OR REPLACE procedure verify_data
IS
id number;
name varchar;
cursor c1 is 
select 
  e.id,e.name
from 
  table1 e 
where 
  id IN (select id from table1)
  and id in (select id from table2);
BEGIN

   open c1;
   fetch c1 into id,name;

   if c1%notfound then
      DBMS_OUTPUT.PUT_LINE('OK')
      EXIT; 
   else   
      DBMS_OUTPUT.PUT_LINE(id||name)
   end if;

   close c1;

END;
于 2012-11-25T21:25:37.770 に答える