簡體   English   中英

在視圖Oracle SQL中將表名稱設置為變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM