I have a table which contains a list of dynamic SQL views that needs to be created
SEEDING_TABLE
-------------
KEYVALUE|VIEW_TO_BE_CREATED|FROMTABLE|NOOFCOLS
1|A|A1|3
2|B|B1|4
3|C|C1|5
The other table which contains the actual column names for the above seeding table
ORDERCOLS_FORVIEW
KEYVALUE|FROMTABLE|COLSAVAILABLE
1|A1|NUM1
1|A1|NUM2
1|A1|NUM3
2|B1|NUM1
2|B1|NUM2
2|B1|NUM3
2|B1|NUM4
3|C1|NUM1
3|C1|NUM2
3|C1|NUM3
3|C1|NUM4
3|C1|NUM5
Definition of the table FROMTABLEs as follows
A1 -> KEYVALUE|NUM1|NUM2|NUM3
B1 -> KEYVALUE|NUM1|NUM2|NUM3|NUM4
C1 -> KEYVALUE|NUM1|NUM2|NUM3|NUM4|NUM5
After doing all our logic and magic the outcome should be a dynamic SQL which should produce the below view statements
DYNAMIC_ENTRIES -> TEXT|TABLE|RANK
TEXT |TABLE | RANK
CREATE OR REPLACE VIEW A AS SELECT | A | 1
KEYVALUE, | A | 2
NUM1 AS KEY1, | A | 3
NUM1 AS NO1, | A | 4
NUM1||'|'||NUM2 AS KEY2, | A | 5
NUM2 AS NO2, | A | 6
NUM1||'|'||NUM2||'|'||NUM3 AS KEY3, | A | 7
NUM3 AS NO3 | A | 8
FROM A1; | A | 9
CREATE OR REPLACE VIEW B AS SELECT | B | 1
KEYVALUE, | B | 2
NUM1 AS KEY1, | B | 3
NUM1 AS NO1, | B | 4
NUM1||'|'||NUM2 AS KEY2, | B | 5
NUM2 AS NO2, | B | 6
NUM1||'|'||NUM2||'|'||NUM3 AS KEY3, | B | 7
NUM3 AS NO3, | B | 8
NUM1||'|'||NUM2||'|'||NUM3||'|'||NUM4 AS KEY4, | B | 9
NUM4 AS NO4 | B | 10
FROM B1; | B | 11
CREATE OR REPLACE VIEW C AS SELECT | C | 1
KEYVALUE, | C | 2
NUM1 AS KEY1, | C | 3
NUM1 AS NO1, | C | 4
NUM1||'|'||NUM2 AS KEY2, | C | 5
NUM2 AS NO2, | C | 6
NUM1||'|'||NUM2||'|'||NUM3 AS KEY3, | C | 7
NUM3 AS NO3, | C | 8
NUM1||'|'||NUM2||'|'||NUM3||'|'||NUM4 AS KEY4, | C | 9
NUM4 AS NO4 | C | 10
NUM1||'|'||NUM2||'|'||NUM3||'|'||NUM4||'|'||NUM5 AS KEY5, | C | 11
NUM5 AS NO5 | C | 12
FROM C1; | C | 13
Assuming for every entry in the seeding table, we have the complete list of columns available in the lookup. The logic is that for every entry in the seeding table, we need to insert entries into the final dynamic SQL table to create views for the entries in VIEW_TO_BE_CREATED column by using the FROMTABLE. For every column in the FROMTABLE that has the sequence like NUM1...NUMn they need to concatenated like a tree.
I am confused on how to approach this. We can create any number of intermediate tables or views to achieve this. Any pointers for this would be much appreciated?
It's a bit messy, but you could do it in plain SQL, starting with a hierarchical query to get the concatenated strings:
I've assumed your table really has another column you haven't shown that gives the column position. If not you can generate that somehow - maybe based on column_id for the base table column, alphabetically, or whatever. You just need a contiguous number sequence for the connect-by clause.
You can then use two unions to get the text parts for those column and path values (since they need to be separate rows in your final table), plus extra ones for the
SELECT ...
andFROM ...
lines. Each of those needs another generated rank number. Those can be generated from the ranking in the CTE:Which with your starting data generates:
You could vary it a bit, having another CTE with the join between
seeding_table
andordercols_forview_cte
and using that for the union. You can also get the paths from a recursive CTE (from Oracle 11g):And can then use that instead; this does the join between that recursive CTE and the seeding table in another CTE as mentioned above, but you coudl just replace the hierarchical-query CTE with the recursive one:
Which gets the same result: