Oracle
 sql >> база данни >  >> RDS >> Oracle

Динамичен SQL LOOP

Проблемът е, че не итерирате през курсора - няма израз за извличане или нещо подобно, така че по принцип имате безкраен цикъл. За да избегнете това, трябва да направите нещо подобно:

CREATE OR REPLACE PROCEDURE how_many_rows
   (p_in_table VARCHAR2) IS
   TYPE cur_cur IS REF CURSOR;
   v_cur_cur cur_cur;
   v_rowcount NUMBER(28);
   v_cur_txt VARCHAR2(299);
   v_row SOME_TABLE%ROWTYPE; --add row variable
BEGIN
   v_cur_txt := 'SELECT * FROM '|| p_in_table;

OPEN v_cur_cur FOR v_cur_txt;
   LOOP
      v_rowcount := v_cur_cur%ROWCOUNT;
      FETCH v_cur_cur INTO v_row; --fetch a row in it
         EXIT WHEN v_cur_cur%NOTFOUND;
   END LOOP;
CLOSE v_cur_cur;

DBMS_OUTPUT.PUT_LINE(v_rowcount);
END;

Но, както виждате, за да направите това, трябва да знаете коя таблица питате, така че това не е общо решение. Може би има решение за това, но предлагам да използвате по-прост и ефективен подход, например с EXECUTE IMMEDIATE:

CREATE OR REPLACE PROCEDURE HOW_MANY_ROWS(p_in_table VARCHAR2)
       IS
v_tmp NUMBER;
BEGIN

EXECUTE IMMEDIATE 'SELECT COUNT(1) FROM ' || p_in_table INTO v_tmp;
DBMS_OUTPUT.PUT_LINE(v_tmp);

END;

Добре, помислих как да постигна това, използвайки вашия начин, и ето какво стигнах до - просто извлечете ROWNUM от вашата таблица, всяка таблица го има и знаете, че е тип - NUMBER. Така че тази процедура ще работи в общия случай:

CREATE OR REPLACE PROCEDURE how_many_rows
   (p_in_table VARCHAR2) IS
   TYPE cur_cur IS REF CURSOR;
   v_cur_cur cur_cur;
   v_rowcount NUMBER(28);
   v_cur_txt VARCHAR2(299);
   v_row NUMBER; --add rownum variable
BEGIN
   v_cur_txt := 'SELECT ROWNUM FROM '|| p_in_table; --select only rownum from target table

OPEN v_cur_cur FOR v_cur_txt;
   LOOP
      v_rowcount := v_cur_cur%ROWCOUNT;
      FETCH v_cur_cur INTO v_row; --fetch rownum in it
         EXIT WHEN v_cur_cur%NOTFOUND;
   END LOOP;
CLOSE v_cur_cur;

DBMS_OUTPUT.PUT_LINE(v_rowcount);
END;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORA-65139:Несъответствие между XML файл с метаданни и файл с данни

  2. oracle PL/SQL как да изчислим обхвата ip за IPv6 cidr

  3. Как да декларирате входно-изходни параметри в съхранена процедура/функция на SQL Server?

  4. Oracle getConnection бавно

  5. PL/SQL настройка на производителността за LIKE '%...%' заместващи заявки