2016-10-03 7 views
0

Szenario: Ich gebe 2 Tabellennamen (z. B. Mitarbeiter und Abteilungen) zu pl/SQL-Prozedur. Ich möchte diese Prozedur erzeugen WHERE-Klausel wie 'WHERE employees.department_id = departments.department_id' so im Grunde muss diese Prozedur Schlüsselrelationen finden.Oracle, Where-Klausel basierend auf Tabellennamen generieren

Ich habe versucht, die Tabelle all_constraints zu verwenden, um constraint_type = 'P' oder 'F' zu finden und dann die zugehörige Spalte zu finden, aber in dieser Tabelle gibt es keine Informationen darüber, welche Spalte in constraint verwendet wird. Hat jemand eine Idee wie kann ich das machen (mayby ​​auf andere Weise)?

+0

Siehe alle_cons_columns. Nur neugierig für welchen Zweck brauchen Sie dynamische SQL? Ich denke du erfindest ORM neu. –

+0

Masterarbeit - Testen usw. –

Antwort

1

diesen Code Versuchen:

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; 
+0

Dies wird sehr hilfreich sein. VIELEN DANK! –

+0

Können Sie diese Antwort akzeptieren? – starko

0

Wie wäre es ein Natural Join verwenden?

Wenn die Spaltennamen in zwei Tabellen konsistent sind, fügt die Natural-Join-Klausel die Tabellen für jeden gemeinsamen Spaltennamen hinzu.

Zum Beispiel aus der Dokumentation:

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

Wenn die Tabellen Länder und Städte haben zwei gemeinsame Spalten namens
LAND und COUNTRY_ISO_CODE, die folgenden zwei SELECT-Anweisungen sind äquivalent:

SELECT * FROM COUNTRIES NATURAL JOIN CITIES 

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

Wenn die Tabellen "employees" und "departments" beide eine Spalte "manager_id" enthalten, wird dies bei der natürlichen Verknüpfung in die Join-Bedingung aufgenommen. Ist der Manager der Abteilung derselbe wie der Manager der Angestellten? Wahrscheinlich nicht, also müssen Sie sehr vorsichtig mit natürlichen Join sein, da es unbeabsichtigte Folgen haben kann. – MT0

+1

Ganz zu schweigen von 'name',' description', 'comments',' start_datum', 'end_datum',' status' usw. Und viele Schemata verwenden Namenskonventionen wie 'cities.country_id = countries.id' oder' cities.city_ctry_id = Länder.ctry_id'. Ich kann nicht verstehen, warum der Erfinder des Natural Join jemals gedacht hat, dass es funktionieren würde. –

Verwandte Themen