[英]Set table name as variable in a view oracle sql
我有這樣的看法:
create or replace view caritoplam as
select
clcard.parentclref,
CLCARD2.CODE,
SUM(GNTOTCL.DEBIT - GNTOTCL.CREDIT) AS TOPLAM
FROM
LG_001_CLCARD CLCARD,
LG_001_CLCARD CLCARD2,
LG_001_01_GNTOTCL GNTOTCL
WHERE
GNTOTCL.CARDREF=CLCARD.LOGICALREF
AND GNTOTCL.TOTTYP=1
AND clcard.code not like '61%'
and clcard.parentclref = clcard2.logicalref
and clcard.active = 0
GROUP by CLCARD.parentclref,CLCARD2.CODE
order by clcard.parentclref;
如何將表名設置為變量? 例如:
exp: LG_ || variable || _CLCARD
LG_ || variable || _CLCARD
如果要在運行時提供表名(或在這種情況下,表名的一部分),則可以使用動態SQL。 您可以將其隱藏在流水線表函數中,該函數的返回類型為對象表,兩種類型均在模式級別定義。 例如:
create type caritoplam_obj as object (
parentclref number, -- or whatever your real table data types are
code varchar2(5),
toplam number
)
/
create type caritoplam_tab as table of caritoplam_obj
/
create function caritoplam (p_index varchar2)
return caritoplam_tab pipelined as
l_cursor sys_refcursor;
l_caritoplam_obj caritoplam_obj;
begin
open l_cursor for 'select caritoplam_obj(clcard.parentclref,
clcard2.code,
sum(gntotcl.debit - gntotcl.credit))
from lg_' || p_index || '_clcard clcard
join lg_' || p_index || '_clcard clcard2
on clcard2.logicalref = clcard.parentclref
join lg_' || p_index || '_01_gntotcl gntotcl
on gntotcl.cardref=clcard.logicalref
where clcard.code not like ''61%''
and clcard.active = 0
and gntotcl.tottyp = 1
group by clcard.parentclref,clcard2.code
order by clcard.parentclref';
loop
fetch l_cursor into l_caritoplam_obj;
exit when l_cursor%notfound;
pipe row (l_caritoplam_obj);
end loop;
close l_cursor;
end caritoplam;
/
讓我們設置一些偽裝的數據,因為我們沒有真正的表結構或數據可以使用:
create table LG_001_CLCARD(logicalref number, parentclref number, code varchar2(5), active number);
create table LG_001_01_GNTOTCL(cardref number, tottyp number, credit number, debit number);
insert into LG_001_CLCARD values (2, 1, '231', 0);
insert into LG_001_CLCARD values (1, null, '231', 0);
insert into LG_001_01_GNTOTCL values (2, 1, 25, 100);
create table LG_002_CLCARD(logicalref number, parentclref number, code varchar2(5), active number);
create table LG_002_01_GNTOTCL(cardref number, tottyp number, credit number, debit number);
insert into LG_002_CLCARD values (7, 6, '654', 0);
insert into LG_002_CLCARD values (6, null, '654', 0);
insert into LG_002_01_GNTOTCL values (7, 1, 21, 42);
現在,您可以使用表集合表達式並傳遞表名稱的變量部分來調用該函數:
select * from table(caritoplam('001'));
PARENTCLREF CODE TOPLAM
----------- ----- ----------
1 231 75
select * from table(caritoplam('002'));
PARENTCLREF CODE TOPLAM
----------- ----- ----------
6 654 21
您還可以使用系統上下文創建參數化視圖,但這需要更多工作並且需要其他特權。 最終將不得不合並很多幾乎相同的查詢-每個可能的表名稱都有一個聯合分支。 或者,您可以使用一個視圖來完成所有這些聯合,並為每個聯合添加一個額外的列,然后在查詢時在該額外的列上添加一個過濾器,以便僅從感興趣的分支中獲取數據。工會仍然會很痛苦-盡管如果您確實想走那條路,則可以動態生成視圖。
有很多相同的表聽起來像一個奇怪的數據模型。 也許您正在嘗試實現諸如分區之類的功能,而無需為此付費。
Oracle不允許為表綁定變量。因此,您無法合並字符串以創建表名稱。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.