в select вывод значений столбца по имени, полученного из другого select. Оракл

помогите, пожалуйста! Изучаю PL\SQL есть задача сравнить две таблицы. Чтобы вручную не сравнивать и не прописывать все столбцы (их около 100 столбцов и 20 таблиц). Как можно их подставить в select Оракла? Я получила с помощью курсора название столбцов. Как название столбца column_name прописать в select column_name from emp (вторая таблица соответственно emp2)? Где прописывается второй Select? Структура например: введите сюда описание изображения

    --Код курсора:
    SET SERVEROUTPUT ON
declare 
cursor curs is SELECT distinct column_name from all_tab_columns
where table_name='EMP' or table_name='EMP2';

v_column_name curs%ROWTYPE;

BEGIN
OPEN curs;
LOOP
FETCH curs INTO v_column_name;
EXIT WHEN curs%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_column_name.column_name);
END LOOP;
END;
/

За любую помощь буду очень благодарна, с переменными пока полное непонимание (на стадии набивания шишек).


Ответы (1 шт):

Автор решения: Akina

Пример:

CREATE TABLE test1 ( id INT, val VARCHAR(255));
CREATE TABLE test2 ( id INT, val VARCHAR(255), grp INT);
CREATE TABLE test3 ( id INT, val INT);
-- имена полей различны, результат - различия
SELECT column_name 
FROM all_tab_columns
WHERE table_name IN ('TEST1', 'TEST2')
GROUP BY column_name
HAVING COUNT(*) = 1;
| COLUMN_NAME |
| :---------- |
| GRP         |
-- имена полей полностью идентичны, результат пуст
SELECT column_name 
FROM all_tab_columns
WHERE table_name IN ('TEST1', 'TEST3')
GROUP BY column_name
HAVING COUNT(*) = 1;
| COLUMN_NAME |
| :---------- |
-- имена полей полностью идентичны, а вот типы данных не совпадают, результат - различия
SELECT column_name
FROM all_tab_columns
WHERE table_name IN ('TEST1', 'TEST3')
GROUP BY column_name
HAVING COUNT(*) = 1
    OR COUNT(DISTINCT data_type) = 2;
| COLUMN_NAME |
| :---------- |
| VAL         |

db<>fiddle here


теперь надо сравнить данные. То есть вывести что у Boris сменился адрес с Москвы на Лондон. Но загвоздка в том что столбцов 100. и все сравнивать их вручную нереально. – Евгения Балабанова

CREATE TABLE test1 ( id INT PRIMARY KEY, val VARCHAR(255));
CREATE TABLE test2 ( id INT PRIMARY KEY, val VARCHAR(255));
INSERT INTO test1
SELECT 1, 'Иван' FROM DUAL UNION ALL
SELECT 2, 'Дмитрий' FROM DUAL;

INSERT INTO test2
SELECT 1, 'Иван' FROM DUAL UNION ALL
SELECT 2, 'Василий' FROM DUAL;
-- Вывести id записей, которые не совпадают
SELECT id
FROM test1
NATURAL FULL JOIN test2
GROUP BY id
HAVING COUNT(id) = 2;
| ID |
| -: |
|  2 |

db<>fiddle here

→ Ссылка