繁体   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