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

pu3pd22g  于 2023-05-06  发布在  Oracle
关注(0)|答案(2)|浏览(230)

在PL/SQL中,是否可以使用变量作为查询表?
尝试:

declare
   TYPE t_name IS TABLE OF varchar(50) INDEX BY PLS_INTEGER;
   v_names t_name;
begin
select name bulk collect into v_names from my_table;

select name from v_names where name = 'Max';
end;
eit6fx6z

eit6fx6z1#

是的......但不是你怎么做的,有两个原因:

  • 首先,你没有一个集合(你称之为表变量),因为你使用了INDEX BY PLS_INTEGER,所以你有一个关联数组。
  • 其次,只能在SQL范围中声明数据类型的SQL查询中使用集合(而您的数据类型是在PL/SQL中声明的)。

首先,你需要创建一个类型:

CREATE TYPE t_name IS TABLE OF VARCHAR2(50);

然后你可以运行PL/SQL块:

DECLARE
  v_names t_name;
  v_name  VARCHAR2(50);
BEGIN
  SELECT name
  BULK COLLECT INTO v_names
  FROM my_table;

  SELECT COLUMN_VALUE
  INTO   v_name
  FROM   TABLE(v_names)
  WHERE  COLUMN_VALUE = 'Max';
  
  DBMS_OUTPUT.PUT_LINE( v_name );
END;
/
  • (注意:第二个查询中的表集合表达式具有伪列COLUMN_VALUE,而不是表中的任何特定标识符。
  • db〈〉fiddle here*
fgw7neuy

fgw7neuy2#

我同意OP,这是一个愚蠢的语言设计。OP想要的是一个作用域为查询会话的表变量,而不是数据库中的一个新的持久表。
在MSSQL中,这非常简单。在PL/SQL中,这基本上是不可能的。这是一个该死的愚蠢的设计。

相关问题