使用查询声明 pl sql 变量,然后在后续查询中使用
Posted
技术标签:
【中文标题】使用查询声明 pl sql 变量,然后在后续查询中使用【英文标题】:declaring pl sql variable using query then using in subsequent query 【发布时间】:2021-12-03 23:46:28 【问题描述】:我读过一些关于在 PL/SQL 中声明和使用变量的文章。而且我只在其他版本 (TSQL) 或代码语言中这样做过。
下面是我想要做的,就是
-
声明一个变量
通过查询为该变量赋值
使用 #2 的后续结果
在另一个查询中。
我尝试了 Internet 上列出的其他方法,但在最终查询中调用变量时,我所做的一切似乎都不起作用。
声明和into
语句有效,但最后一个选择查询无效。
declare
Degr_term varchar2(20);
begin
select max(z.term)
INTO degr_term
from dwh.rpt_ersd_vw d
join dwh.dim_ers_term_vw z
on d.DIM_DEGR_ERS_TERM_SKEY = z.dim_ers_term_skey;
select * from ir_wip.stem_enr s where s.min_deg_term = degr_term;
end;
【问题讨论】:
不起作用真的不能帮助人们回答你的问题。 PL/SQL 代码块中的查询必须具有INTO
或必须声明为游标。代码(在您的问题中)是否编译?我的猜测是它没有。所以我认为你应该edit你的问题并发布你得到的编译错误。你试过阅读Database PL/SQL Language Reference吗?
该方法应该可以正常工作,您只需要添加代码来处理第二个查询的输出。
【参考方案1】:
就像您从第一个 select
语句中选择 INTO
一样,您也必须在第二个语句中执行此操作。这意味着您必须声明一个变量来保存其内容。
假设 - 可能不正确 - 第二个 select
只返回一行 - 你可以
SQL> declare
2 degr_term varchar2(20);
3 l_stem stem_enr%rowtype; --> this
4 begin
5 select max(z.term)
6 into degr_term
7 from rpt_ersd_vw d
8 join dim_ers_term_vw z
9 on d.DIM_DEGR_ERS_TERM_SKEY = z.dim_ers_term_skey;
10
11 select *
12 into l_stem --> this
13 from stem_enr s
14 where s.min_deg_term = degr_term;
15 end;
16 /
PL/SQL procedure successfully completed.
SQL>
(我删除了架构名称,因为我没有它们并且不想创建它们。)
如果第二个查询返回多于一行,那么例如
SQL> declare
2 degr_term varchar2(20);
3 type l_stem_typ is table of stem_enr%rowtype;
4 l_stem_tab l_stem_typ;
5 begin
6 select max(z.term)
7 into degr_term
8 from rpt_ersd_vw d
9 join dim_ers_term_vw z
10 on d.DIM_DEGR_ERS_TERM_SKEY = z.dim_ers_term_skey;
11
12 select *
13 bulk collect
14 into l_stem_tab
15 from stem_enr s
16 where s.min_deg_term = degr_term;
17 end;
18 /
PL/SQL procedure successfully completed.
SQL>
[编辑:如何输出结果?使用循环]
假设该表看起来像这样(我真的不知道,您从未发布任何示例数据):
SQL> select * from stem_enr;
MIN_DEG_TERM NAME SURN
------------ ------ ----
1 Little Foot
1 Big Foot
那么你会(简化示例;我也不想创建其他表):
SQL> declare
2 type l_stem_typ is table of stem_enr%rowtype;
3 l_stem_tab l_stem_typ;
4 begin
5 select *
6 bulk collect
7 into l_stem_tab
8 from stem_enr s
9 where s.min_deg_term = 1;
10
11 for i in 1 .. l_stem_tab.count loop
12 dbms_output.put_line(l_stem_tab(i).name ||' '|| l_stem_tab(i).surname);
13 end loop;
14 end;
15 /
Little Foot
Big Foot
PL/SQL procedure successfully completed.
SQL>
【讨论】:
谢谢。如何在该解决方案中输出 l_stem_tab 的结果? 不客气。你会使用一个循环;看看编辑后的答案。以上是关于使用查询声明 pl sql 变量,然后在后续查询中使用的主要内容,如果未能解决你的问题,请参考以下文章