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 获取记录时,它不会打印 Okay 。我在 END LOOP 之后添加了 c1%notfound

4

2 回答 2

1

由于您使用的是 dbms_output,因此您不会像普通的 sql select 语句那样获得任何标题。

所以我知道的唯一方法是打印你自己的标题。如果你在循环之前初始化一个计数器并在循环内增加它,你可以在循环之后检查是否有结果。然后,您可以根据需要打印一条消息,如“NO RECORDS”。

于 2012-11-25T21:22:49.973 回答
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 回答