的Oracle SQL元編程通過Oracle數據墨盒與任何類型的結合是可能的。
即使使用現有的包元編程,構建查詢內的查詢是複雜的,應儘量避免。其他答案通常更好,即使它們可能需要額外的步驟並且不是「純」的SQL。
如果你真的需要在單個SQL語句中做所有事情,請試試我的open source project, Method4。安裝後,創建一個示例模式:
create table some_table(
one number, just_one number, another_one number,
two number, just_two number, another_two number);
insert into some_table values(1,1,1,2,2,2);
運行該查詢建立了基於數據字典中的實際SELECT語句:
select * from table(method4.dynamic_query(
q'[
--Find columns that match pattern and aggregate into SELECT list.
select
'SELECT'||chr(10)||
rtrim(listagg(' CASE WHEN '||column_name||' = 1 THEN 1 ELSE 0 END '||column_name||',', chr(10))
within group (order by order_by1, order_by2), ',')||chr(10)||
'FROM some_table' sql_statement
from user_tab_columns
join
(
--Column names that might match the pattern [null|JUST_|ANOTHER]SPELLED_NUMBER.
select prefix||spelled_number possible_column_names
,order_by1, order_by2
from
(
--Numbers 1-10.
select upper(to_char(to_date(level, 'j'), 'jsp')) spelled_number
,level order_by1
from dual
--Increase this number up to the maximum possible number.
connect by level <= 10
)
cross join
(
--Possible prefixes.
select null prefix, 1 order_by2 from dual union all
select 'JUST_' prefix, 2 order_by2 from dual union all
select 'ANOTHER_' prefix, 3 order_by2 from dual
)
) column_names
on user_tab_columns.column_name = column_names.possible_column_names
where table_name = 'SOME_TABLE'
]'
));
同樣的查詢將返回基於表的不同列:
ONE JUST_ONE ANOTHER_ONE TWO JUST_TWO ANOTHER_TWO
---------- ---------- ----------- ---------- ---------- -----------
1 1 1 0 0 0
這是一些嚴重的複雜編碼來避免輸入幾行。當他第一次聽說硬編碼總是很糟糕時,這是一種經理人夢寐以求的解決方案。
這實際上回答了有關元編程Oracle SQL SELECT語句的問題。有一些罕見的情況下,這種方法是挽救生命。但99.9%的時間以簡單的方式做事情更好,即使它自動化程度稍低。
不是普通的SQL,但是您可以嘗試動態生成此查詢 –
我可以使用PL/SQL來實現嗎?我沒有訪問任何編程語言。 – JustMichael
PL/SQL = **過程語言** /結構化查詢語言 – stee1rat