Выполнить для каждой таблицы в PLSQL - PullRequest
5 голосов
/ 28 февраля 2011

Я хочу количество записей во всех таблицах, которые соответствуют определенным критериям имени.Вот SQL, который я построил

Declare SQLStatement VARCHAR (8000) :='';
BEGIN
  SELECT 'SELECT COUNT (*) FROM ' || Table_Name || ';'
  INTO SQLStatement
  FROM All_Tables
  WHERE 1=1
    AND UPPER (Table_Name) LIKE UPPER ('MSRS%');

  IF SQLStatement <> '' THEN
    EXECUTE IMMEDIATE SQLStatement;
  END IF;
END;
/

Но я получаю следующую ошибку:

Error at line 1
ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at line 3
Script Terminated on line 1.

Как мне изменить это так, чтобы он работал для всех соответствующих таблиц?

Обновление:

На основании полученного ответа я попробовал следующее, но ничего не получил в DBMS_OUTPUT

declare 
  cnt number;
begin
  for r in (select table_name from all_tables) loop
    dbms_output.put_line('select count(*) from CDR.' || r.table_name);
  end loop;
end;
/

1 Ответ

9 голосов
/ 28 февраля 2011
declare 
  cnt number;
begin
  for r in (select owner, table_name from all_tables
             where upper(table_name) like ('%MSRS%')) loop

    execute immediate 'select count(*) from "'
            || r.owner || '"."'
            || r.table_name || '"'
            into cnt;

    dbms_output.put_line(r.owner || '.' || r.table_name || ': ' || cnt);
  end loop;
end;
/

Если вы выбираете из all_tables, вы не можете рассчитывать на получение грантов, необходимых для выбора из названия таблицы. Поэтому вы должны проверить на наличие ошибки ORA-00942: table or view does not exist.

Что касается причины вашей ошибки: Вы получаете эту ошибку, потому что оператор select возвращает набор результатов с более чем одной строкой (по одной для каждой таблицы), и вы не можете назначить такой набор результатов для varchar2.

Кстати, убедитесь, что вы включили dbms_output с SET SERVEROUT ON перед выполнением этого блока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...