ORACLE SQL: цикл по таблице - PullRequest
0 голосов
/ 27 июня 2018

У меня есть таблица, которая содержит список имен таблиц. Я хотел бы искать каждую из этих таблиц одну за другой, чтобы увидеть, содержат ли они определенный элемент (первичный ключ, указанный в начале скрипта). Я хотел бы вернуть список всех таблиц, в которых присутствует этот элемент (в идеальном случае). Я довольно новичок в этом PL / SQL "не просто запрос". поэтому я заранее прошу прощения за ужасную попытку, которую вы собираетесь увидеть, но, надеюсь, это иллюстрирует то, к чему я стремлюсь:

PROCEDURE CHECK_FOR_ELEMENTS
BEGIN
DECLARE 
ELEMENT_KEY varchar(5):=X78ehryfk;
RNUM_MAX int :=167;

----create output table for script
create or replace table ALL_TABLES CONTAINING_&ELEMENT_KEY 
(ELEMENT_KEY VARCHAR(255), 
TABLE_NAME varchar(255))
/
commit;

---begin loop over rnum;
FOR rnum_counter in 1..&RNUM_MAX
LOOP
--define this statement as variable TABLE_NAME_VAR
select table_name from (select * from (select table_name, rownum as rnum         
from all_tables
where owner = 'RMS'
and table_name like 'ABC%'
and table_name not like '%STG'
and table_name not like '%BKP'
and num_rows>0
order by num_rows desc)
where rnum = rnum_counter
)INTO TABLE_NAME_VAR
;
----run below to collect row, if it exists, from table being searched
SQL_STMT:='INSERT INTO ALL_TABLES CONTAINING_&ELEMENT_KEY 
SELECT distinct key,'||TABLE_NAME_VAR||' as UMF from         
'||TABLE_NAME_VAR|| 
' where key like 'ELEMENT_KEY-%'
execute immediate SQL_STMT;
commit;
---insert row into table created for output

END LOOP
---loop over all tables

END;

Основное сообщение об ошибке, которое я получаю, заключается в том, что TABLE_NAME_VAR не является допустимым именем таблицы в динамическом операторе SQL. Я немного погуглил и теперь понимаю, что вы не можете использовать переменные для ввода имен таблиц таким способом.

Любая помощь очень ценится! Спасибо!

1 Ответ

0 голосов
/ 27 июня 2018

Здесь я пытался очистить это для вас. Дайте мне знать, если вы все еще получаете ошибки.

create or replace PROCEDURE CHECK_FOR_ELEMENTS is
    ELEMENT_KEY varchar2(14):='X78ehryfk';
    RNUM_MAX int :=167;
    TABLE_NAME_VAR varchar2(30);
    SQL_STMT varchar2(4000);
BEGIN

----create output table for script
begin
    execute immediate 'drop table ALL_TABLES_WITH_' || element_key;
exception when others then null;
end;
execute immediate 'create table ALL_TABLES_WITH_' || element_key || ' 
(ELEMENT_KEY VARCHAR2(255), -- does this need to be 255 characters?
TABLE_NAME varchar2(30))';

--- implicit cursor loop
FOR rnum_row in (select table_name, rownum as rnum         
    from all_tables
    where owner = 'RMS'
    and table_name like 'ABC%'
    and table_name not like '%STG'
    and table_name not like '%BKP'
    and num_rows>0
    order by num_rows desc)
LOOP
    if rnum_row.rnum > RNUM_MAX 
        then exit;
    end if;

    TABLE_NAME_VAR := rnum_row.table_name;

    ----run below to collect row, if it exists, from table being searched
    SQL_STMT:='INSERT INTO ALL_TABLES_WITH_' || element_key || ' 
    (ELEMENT_KEY, TABLE_NAME)
    SELECT distinct key, :1 as UMF from         
    '||TABLE_NAME_VAR|| 
    ' where key like :2';
    execute immediate SQL_STMT using TABLE_NAME_VAR, element_key || '-%';

    ---insert row into table created for output
END LOOP;
commit; 
---loop over all tables

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