использование курсора в выборе - PullRequest
0 голосов
/ 10 сентября 2018

Моя последняя проблема: выберите с переменным параметром в процедуре

хорошо, у меня есть еще один вопрос. Я хотел бы распространить эту процедуру на другой элемент. Итак, мы уже выбрали эти идентификаторы из столбца 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;

1 Ответ

0 голосов
/ 11 сентября 2018

Что касается замены 8796093055031, вы можете просто использовать первый оператор в качестве подзапроса во втором описании:

SELECT DISTINCT m.TYPEPKSTRING 
  FROM METAINFORMATIONS m
  LEFT OUTER JOIN CAT2CATREL d
    ON m.TYPEPKSTRING = d.TYPEPKSTRING
  WHERE d.sourcepk IS NULL AND
        d.targetpk IS NULL AND
        m.typepkstring IN (SELECT DISTINCT m2.TYPEPKSTRING
                             FROM  METAINFORMATIONS m2
                             LEFT OUTER JOIN COMPOSEDTYPES c2
                               ON m2.TYPEPKSTRING = c2.PK 
                             WHERE c2.PK IS NULL);

В остальном, если я понимаю, что вы пытаетесь сделать, мне кажется, что вам нужно использовать динамический SQL, как показано в ответе на ваш предыдущий вопрос.

...