TOP с индексной переменной oracle - PullRequest
2 голосов
/ 05 августа 2020

Я пытался использовать переменную 'ind', чтобы получить ROWNUM для моего выбора, но каждый раз, когда я пытаюсь использовать эту переменную, я получаю сообщение об ошибке, например:

ORA-01008: не все переменные связаны

или эти два:

ORA-01403: данные не найдены

ORA-06512: в строке 10

    DECLARE 
texto VARCHAR2(255);
ind NUMBER := 0;
BEGIN
   LOOP
     ind := ind + 1;
     IF ind > 3 THEN
      EXIT;
     END IF;
     SELECT TEXTO_LOG 
     INTO texto
      from table WHERE REGEXP_LIKE(TEXTO_LOG, 'Alteração') AND ROWNUM >= :ind AND ROWNUM <= :ind ;
      dbms_output.put_line(substr(trim(texto), 1, instr(texto, ' ')));
      dbms_output.put_line(substr(texto, 0, 100));
     
    END LOOP;
END;
/

Я искал и нашел кого-то говоря, что не все связанные переменные - это ошибка, я не уверен, что это так. Я пробовал ROWNUM с разными операторами. Есть предложения?

Ответы [ 3 ]

1 голос
/ 05 августа 2020

Использование rownum является проблемой, помимо других проблем, на которые уже были даны ответы. предикат типа rownum> = 2 и rownum <= 2 (и так далее ... до точки выхода) не дает результата и, следовательно, ошибка no_data_found </p>

Но в качестве обходного пути поместите rownum внутрь предложения from и ограничьте его снаружи, работа,

DECLARE
   texto VARCHAR2(255);
   ind   NUMBER := 0;
BEGIN
   LOOP
      ind := ind + 1;
      IF ind > 3
      THEN
         EXIT;
      END IF;
      SELECT texto_log 
      INTO texto
      FROM   (SELECT texto_log
                    ,rownum myrownum
              FROM   TABLE
              WHERE  regexp_like(texto_log
                                ,'Alteração'))
      WHERE  myrownum >= ind
      AND    myrownum <= ind;
      dbms_output.put_line(substr(TRIM(texto)
                                 ,1
                                 ,instr(texto
                                       ,' ')));
      dbms_output.put_line(substr(texto
                                 ,0
                                 ,100));
   
   END LOOP;
END;
/
1 голос
/ 05 августа 2020

С неявным курсором

DECLARE 
-- texto VARCHAR2(255);
ind NUMBER := 0;
BEGIN
   
    FOR i IN (SELECT TEXTO_LOG FROM table WHERE REGEXP_LIKE(TEXTO_LOG, 'Alteração'))
     LOOP  
         ind:=ind+1;
         EXIT WHEN ind >3;
         DBMS_OUTPUT.PUT_LINE(SUBSTR(TRIM(i.TEXTO_LOG), 1, INSTR(i.TEXTO_LOG, ' ')));
         DBMS_OUTPUT.PUT_LINE(SUBSTR(i.TEXTO_LOG, 0, 100));
     END LOOP;
END;
1 голос
/ 05 августа 2020

Ошибка в том, что вы ссылаетесь на :ind, как если бы это была переменная связывания, а это не так. Фактически это переменная, объявленная в вашем разделе DECLARE.

Вы можете попробовать это

** Обновление **

Поскольку ваш запрос выглядит как ложный, возможно, причина в самом запросе. Запустите это и получите результат и запустите отдельно

set serveroutput on size unlimited 
DECLARE 
texto VARCHAR2(255);
ind    NUMBER := 0;
BEGIN
  for r in 1..4 
   LOOP
     ind := r + 1;
   dbms_output.put_line ( q'[SELECT TEXTO_LOG 
         INTO texto
          from table WHERE REGEXP_LIKE(TEXTO_LOG, 'Alteração') AND ROWNUM <= ind ;
          dbms_output.put_line(substr(trim(texto), 1, instr(texto, ' ')));
          dbms_output.put_line(substr(texto, 0, 100));]');
   exit when ind > 3;
   END LOOP;
END;
/

Хотя вы можете построить его так, что проще

DECLARE 
texto VARCHAR2(255);
ind    NUMBER := 0;
BEGIN
  for r in 1..4 
   LOOP
     ind := r + 1;
     dbms_output.put_line(ind);
     SELECT TEXTO_LOG 
     INTO texto
      from table WHERE REGEXP_LIKE(TEXTO_LOG, 'Alteração') AND ROWNUM >= ind AND ROWNUM <= ind ;
      dbms_output.put_line(substr(trim(texto), 1, instr(texto, ' ')));
      dbms_output.put_line(substr(texto, 0, 100));
     exit when ind > 3;
   END LOOP;
END;
/

Пример

SQL> DECLARE
texto VARCHAR2(255);
ind    NUMBER := 0;
BEGIN
  for r in 1..4
   LOOP
     ind := r + 1;
     dbms_output.put_line(ind);
         exit when ind > 3;
   END LOOP;
END;
/  2    3    4    5    6    7    8    9   10   11   12
2
3
4

PL/SQL procedure successfully completed.

SQL>
...