ROWNUM работает только для одного ряда. Как получить строки после этого? - PullRequest
0 голосов
/ 02 июля 2018

Я хочу извлечь BLOB-данные и записать из них файл (предположить, что это должен быть Excel, TXT или любой другой). В одной ячейке может быть до 60 000 символов. Я хотел написать скрипт, который читает всю таблицу с BLOB-данными и записывает в файл. В приведенном ниже коде ROWNUM работает только для одной строки. какая альтернатива? Или есть другой сценарий, который может помочь мне достичь моей конечной цели - читать BLOB и записывать файлы?

SET SERVEROUTPUT ON;
    DECLARE
       TotalRows NUMBER;
       TotalChar NUMBER;
       CharCounter NUMBER;
    BEGIN
    SELECT count(*) INTO TotalRows FROM <TableName>;
            --dbms_output.Put_line(RC);
            --END;
       FOR RC IN 1..TotalRows
       LOOP
           -----------------Code for Rows starts--------------------------------------------------------------------------------
            dbms_output.Put_line('Row '||RC||' Started.');
            SELECT Length(<ColumnWithBLOBDataType>) INTO TotalChar FROM <TableName> where **Rownum = RC**;
            dbms_output.Put_line('Crossed Char counting query. TotalChar='||TotalChar);
            CharCounter:=TotalChar/2000+1;
            dbms_output.Put_line('Loop will run these many times= '||CharCounter|| ' and Total Chars=' ||TotalChar);
            For CC IN 1..CharCounter
            LOOP
                dbms_output.Put_line('Trip: '||CC);
            END LOOP;  
        -----------------Code for Rows Ends----------------------------------------------------------------------------------------
            TotalChar :=0;
            dbms_output.Put_line('Row '|| RC||' Done. TotalChar='|| TotalChar);
       END LOOP;
       dbms_output.Put_line('Exited loop 1.');
    END;

1 Ответ

0 голосов
/ 02 июля 2018

Обычно вы не используете ROWNUM для выбора строк из таблицы. Это не безопасно и не нужно. Как правило, вы можете сделать это с помощью одного FOR SELECT цикла:

DECLARE
   CharCounter NUMBER;
   part VARCHAR2(30000);
   offset NUMBER;
BEGIN
  FOR r IN (SELECT c,
                   rownum as rc,
                   dbms_lob.getlength(c) as totalchar
              FROM mytable)
  LOOP
    -----------------Code for Rows starts--------------------------------------------------------------------------------
    dbms_output.put_line('Row '||r.rc||' Started.');

    dbms_output.put_line('Crossed Char counting query. TotalChar='||r.totalchar);

    offset := 1;
    WHILE (offset <= r.totalchar) LOOP
      part := dbms_lob.substr(r.c, 20000, offset);
      offset := offset + length(part);      
      dbms_output.put(part);
    END LOOP;
    dbms_output.put_line('');

  END LOOP;
END;
/
...