Моя последняя проблема: выберите с переменным параметром в процедуре
хорошо, у меня есть еще один вопрос. Я хотел бы распространить эту процедуру на другой элемент. Итак, мы уже выбрали эти идентификаторы из столбца typepkstring, из всех таблиц в схеме, которых нет в столбце PK таблицы Composedtypes. Это прекрасно работает.
К этому добавлено новое условие. После выбора того, что у меня было раньше, и того, чего я уже достиг, теперь я должен проверить, есть ли у этих конкретных выбранных идентификаторов пустые поля в таблицах, содержащих столбцы SOURCEPK и TARGETPK.
Для этого сначала попытались разбить эту проблему еще раз на маленькие, желательно на конкретном столе.
Вот выбор, который он получает из предыдущего вопроса:
SELECT DISTINCT METAINFORMATIONS.TYPEPKSTRING
FROM METAINFORMATIONS
LEFT OUTER JOIN COMPOSEDTYPES c
ON METAINFORMATIONS.TYPEPKSTRING = c.PK
WHERE c.PK IS NULL;
Я выбираю делать то, что хочу сейчас:
SELECT DISTINCT METAINFORMATIONS.TYPEPKSTRING
FROM METAINFORMATIONS
LEFT OUTER JOIN CAT2CATREL d
ON METAINFORMATIONS.TYPEPKSTRING = d.TYPEPKSTRING
WHERE d.sourcepk IS NULL AND d.targetpk IS NULL AND metainformations.typepkstring=8796093055031;
Таблица метаинформации - это таблица, которая «естественно» соответствует условиям предыдущей процедуры.
Чтобы добиться того, что ей нужно только параметризовать, я думаю, что она должна выглядеть следующим образом:
Как правило, в select, который я более уважительно относил к месту таблицы CAT2CATREL, задайте имена таблиц, которые соответствуют этому select:
выберите для извлечения имен таблиц, которые должны:
select table_name from all_tab_columns where column_name='SOURCEPK' OR column_name ='TARGETPK';
Кроме того, номер 8796093055031 следует заменить значением из первого курсора или vTYPEPKSTRING. Но могу ли я действовать таким образом? Может быть, мне следует создать второй курсор, который ссылается на это значение.
Надеюсь, я четко объяснил эту проблему, поскольку я могу объяснить ее один раз в комментариях. Спасибо за любой совет.
Обновить вопрос:
Итак, я изменил выбор из предыдущей процедуры для этого символа:
strSelect := 'SELECT DISTINCT m.TYPEPKSTRING ' ||
' FROM ' || i_table_name || ' m ' ||
' LEFT OUTER JOIN ' || is_table_name || ' d ' ||
' ON m.TYPEPKSTRING = d.TYPEPKSTRING ' ||
' WHERE d.sourcepk IS NULL AND ' ||
' d.targetpk IS NULL AND ' ||
' m.typepkstring IN (select count(*) from (SELECT DISTINCT m2.TYPEPKSTRING ' ||
' FROM ' || i_table_name || ' m2 ' ||
' LEFT OUTER JOIN COMPOSEDTYPES c2 ' ||
' ON m2.TYPEPKSTRING = c2.PK ' ||
' WHERE c2.PK IS NULL)) ';
в результате процедуры, сконструированной таким образом, я получаю ключи, для которых я хотел, но запись предназначена для всех таблиц, которые соответствуют select в измененном вызове. Это означает, что вместо получения, скажем, 2 ключей он получает 2 одинаковых ключа для каждой таблицы. Я пробовал как-то считать, но потом ничего не получаю на выходе.
модифицированный звонок:
set serveroutput on
DECLARE
ind integer := 0;
BEGIN
FOR ind IN (select table_name from all_tab_columns where column_name='TYPEPKSTRING' AND table_name!='COMPOSEDTYPES')
LOOP
BEGIN
FOR inds IN (select distinct table_name from all_tab_columns where column_name='SOURCEPK' OR column_name ='TARGETPK')
LOOP
BEGIN
SIEROT(ind.table_name,inds.table_name);
EXCEPTION
WHEN NO_DATA_FOUND THEN
null;
END;
END LOOP;
END;
END LOOP;
END;