#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
. Я не могу понять, почему изобретатель естественного соединения когда-либо думал, что это сработает.