使用查询声明 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 变量,然后在后续查询中使用的主要内容,如果未能解决你的问题,请参考以下文章

在 PL/SQL 中的选择查询中引用数组元素

如何在 Oracle PL/SQL 过程的开始部分之后声明游标

将查询的答案保存在变量 PL/SQL 中

声明变量的 PL/SQL 编译错误

如何在 oracle pl/sql 语句中声明查询?

PL/SQL 使用表变量作为查询表