从pl / sql中的记录集中逐行检索

时间:2013-09-18 06:43:45

标签: oracle plsql package

我的一个pl / sql包。我需要从记录集中打印特定字段。

CREATE OR REPLACE PACKAGE logDetailsPack AS
   TYPE MSG_TXT IS RECORD(LOC_MSG XX_FS_MOB_LOG.MESSAGE_TEXT%TYPE);
   TYPE MSG_TAB IS TABLE OF MSG_TXT;
   C_MSG MSG_TAB;
   PROCEDURE getLog;
END logDetailsPack; 

我的包裹身体是

CREATE OR REPLACE PACKAGE BODY logDetailsPack AS
  PROCEDURE getLog IS
  CURSOR C1 IS SELECT MESSAGE_TEXT FROM XX_FS_MOB_LOG;
  BEGIN
    OPEN C1;
    FETCH C1 BULK COLLECT INTO C_MSG; 
    FOR COUNTER IN 1..500 LOOP
      dbms_output.put_line('Message : '|| C_MSG.LOC_MSG(COUNTER));
    END LOOP;
  END getLog;
END  logDetailsPack;

此处C_MSG是我的记录集的名称,LOC_MSG是记录集中的字段。如何循环浏览并打印LOC_MSG

提前致谢..

1 个答案:

答案 0 :(得分:1)

  1. 确实没有必要使用记录ADT。你可以只有一个项目 声明msg_tab类型如下:

    type msg_tab is table of xx_fs_mob_log.message_text%type;
    
  2. 在这种特殊情况下也无需使用光标。

  3. 话虽如此,您的包装可能如下所示:

    create or replace package logdetailspack as
      type msg_tab is table of xx_fs_mob_log.message_text%type;
      c_msg msg_tab;
      procedure getlog;
    end logdetailspack;
    
    create or replace package body logdetailspack as
       procedure getlog is
       begin
         select message_text 
           bulk collect into c_msg
           from xx_fs_mob_log;
         for counter c_msg.first..c_msg.last
         loop
           dbms_output.put_line('message : '|| c_msg(counter));
         end loop;
       exception
         when no_data_found
         then dbms_output('Select returns no rows') 
       end getlog;
     end  logdetailspack;