Oracle, сгенерируйте предложение Where на основе имен таблиц

#oracle #plsql #dynamic-sql

#Oracle #plsql #динамический-sql

Вопрос:

Сценарий: я передаю 2 имени таблиц (например, сотрудники и отделы) в процедуру pl / sql. Я хочу, чтобы эта процедура сгенерировала предложение WHERE, подобное 'WHERE employees.department_id = departments.department_id' так, что в основном эта процедура должна находить ключевые отношения.

Я попытался использовать таблицу all_constraints, чтобы найти constraint_type=’P’ или ‘F’, а затем найти связанный столбец, но в этой таблице нет информации о том, какой столбец используется в constraint . У кого-нибудь есть идея, как я могу это сделать (возможно, по-разному)?

Комментарии:

1. Смотрите all_cons_columns . Просто любопытно, для какой цели вам нужен динамический sql? Я думаю, вы заново изобретаете ORM.

2. Магистерская диссертация — тестирование и т. Д.

Ответ №1:

Попробуйте этот код:

 SELECT UC.OWNER
,      UC.CONSTRAINT_NAME
,      UCC1.TABLE_NAME||'.'||UCC1.COLUMN_NAME "CONSTRAINT_SOURCE"
,      'REFERENCES'
,      UCC2.TABLE_NAME||'.'||UCC2.COLUMN_NAME "REFERENCES_COLUMN"
FROM USER_CONSTRAINTS uc
,    USER_CONS_COLUMNS ucc1
,    USER_CONS_COLUMNS ucc2
WHERE UC.CONSTRAINT_NAME = UCC1.CONSTRAINT_NAME
  AND UC.R_CONSTRAINT_NAME = UCC2.CONSTRAINT_NAME
  AND UCC1.POSITION = UCC2.POSITION -- Correction for multiple column primary keys.
  AND UC.CONSTRAINT_TYPE = 'R'
ORDER BY UCC1.TABLE_NAME
,        UC.CONSTRAINT_NAME;
  

Комментарии:

1. Это будет очень полезно. Спасибо!

Ответ №2:

Как насчет использования естественного соединения?

Если имена столбцов совпадают в двух таблицах, предложение Natural Join будет объединять таблицы по каждому общему имени столбца.

Например, из документации:

https://docs.oracle.com/javadb/10.8.3.0/ref/rrefsqljnaturaljoin.html

Если в таблицах СТРАНЫ и ГОРОДА есть два общих столбца с именами
COUNTRY и COUNTRY_ISO_CODE, следующие два оператора SELECT эквивалентны:

 SELECT * FROM COUNTRIES NATURAL JOIN CITIES

SELECT * FROM COUNTRIES JOIN CITIES
USING (COUNTRY, COUNTRY_ISO_CODE)
  

Комментарии:

1. Если employees departments в обеих таблицах and есть manager_id столбец, тогда естественное соединение включит это в условие соединения. Будет ли менеджер отдела таким же, как менеджер сотрудника? Вероятно, нет, поэтому вам нужно быть очень осторожным с естественным соединением, поскольку оно может иметь непреднамеренные побочные эффекты.

2. Не говоря name уже о , description , comments , start_date , end_date , и т.д. status И многие схемы используют соглашения об именовании, такие как cities.country_id = countries.id или cities.city_ctry_id = countries.ctry_id . Я не могу понять, почему изобретатель естественного соединения когда-либо думал, что это сработает.