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