PL SQL, помогите новичку!!! СРОЧНО!

san1185
Дата: 16.03.2011 07:37:51
Коллеги, помогите советом опытом.

Столкнулся с такой задачей: "необходимо проверить все поля (строковые) каждой таблицы в определенной схеме БД, на соответствие строковой константе".

Подскажите наиболее верный способ решения данной задачи.
Сам пытался реализовать через курсив - не получается. Получаю ошибку: "ORA-00904: недопустимый идентификтор" :(.

Спасибо!
брадобрей
Дата: 16.03.2011 07:40:05
было бы странно если бы курсив помог
Вячеслав Любомудров
Дата: 16.03.2011 07:44:29
Естественно, болдом надо

Ты эта, покажи, как пробовал-то
san1185
Дата: 16.03.2011 07:49:09
Сделал следующее:

create table temp_carr_tables as
select t.OWNER, t.TABLE_NAME, t.COLUMN_NAME, 'pacf2.amdocs' as dblink
--into owner, table_name, column_name, dblink
from sys.all_tab_columns@pacf2.amdocs t
where t.data_type in ('CHAR', 'NCHAR', 'CLOB', 'NCLOB', 'VARCHAR2', 'NVARCHAR2', 'LONG');

Затем создал тестовый скрипт:

declare
-- Non-scalar parameters require additional processing
owner varchar2(4000);
table_name varchar2(4000);
column_name varchar2(4000);
dblink varchar2(4000);
cursor cur is (
select t.OWNER, t.TABLE_NAME, t.COLUMN_NAME, t.dblink
into owner, table_name, column_name, dblink
from temp_carr_tables t
/*
select t.OWNER, t.TABLE_NAME, t.COLUMN_NAME, 'pacf2.amdocs'
into owner, table_name, column_name, dblink
from sys.all_tab_columns@pacf2.amdocs t
where t.data_type in ('CHAR', 'NCHAR', 'CLOB', 'NCLOB', 'VARCHAR2', 'NVARCHAR2', 'LONG')
--*/
);
begin

open cur;
loop
fetch cur into owner, table_name, column_name, dblink;
exit when cur%NOTFOUND;


--/*
EXECUTE IMMEDIATE '
update temp_carr_tables t
set t.is_like_car = chr(65)
where t.owner = '||owner||'
and t.table_name = '||table_name||'
and t.table_column = '||column_name||'
and t.dblink = '||dblink||'
and exists (
select *
from '||owner||'.'||table_name||'@'||dblink||'
where upper('||column_name||') like chr(37)||chr(67)||chr(65)||chr(82)||chr(37)
)';
commit;
--*/
/*
EXECUTE IMMEDIATE '
insert into temp_carr
select '||owner||','||table_name||','||column_name||', '||dblink||'
from '||owner||'.'||table_name||'@'||dblink||'
where upper('||column_name||') like chr(37)||chr(67)||chr(65)||chr(82)||chr(37)';
commit;
--*/
end loop;
close cur;
end;
san1185
Дата: 16.03.2011 08:00:33
напишите плиз подробнее, как можно решить задачу ))). Спасибо!
Вячеслав Любомудров
Дата: 16.03.2011 08:10:10
Приводи код без закоментаренных участков и в тегах SRC -- глаза ломать никому неохота

Ну и навскидку, зачем в объявлении курсора/курсива кляуза INTO
PooH_2
Дата: 16.03.2011 08:49:31
and exists (
select *
from '||owner||'.'||table_name||'@'||dblink||'
where upper('||column_name||') like chr(37)||chr(67)||chr(65)||chr(82)||chr(37)
)';
"Нет, сынок, это фантастика" ©реклама
копайте в сторону динамического SQL.
PooH_2
Дата: 16.03.2011 08:51:18
блин, там и так динамика... прощу прощения. Без форматирования и [ SRC ] нифига не могу читать нормально :(
PooH_2
Дата: 16.03.2011 08:56:07
попробуйте как советовали выше убрать INTO из курсора.

и запросе
where t.owner = ' || owner || '
and t.table_name = ' || table_name || '
and t.table_column = ' || column_name || '
and t.dblink = ' || dblink || '

значения сделать "в кавычках"
san1185
Дата: 16.03.2011 09:16:40
Ребята, ну не помогают данные рекомендации :(.

Пожалуйста, дайте что-нибудь посущественнее. Изначально надеялся, получить ответ от того, кому уже приходилось решать подобную задачу. Чтобы не изобретать велосипед заново. Уверен на 80%,что приведенный мною метод - плохой и возможно нерабочий ...

Попробуйте сами решить данную задачу: найти поля всех таблиц определенной схемы в БД, которые содержат значение 'заданной константы'. Как бы вы подошли к решению данной задачи?