в 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 шт):
Пример:
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