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

PL/SQL使用表变量作为查询表,sql,oracle,plsql,oracle19c,Sql,Oracle,Plsql,Oracle19c,在PL/SQL中,是否可以使用变量作为表的查询 尝试: 声明 类型t_name是由PLS_整数表示的varchar(50)索引表; v_name t_name; 开始 从my_表中选择名称批量收集到v_名称中; 从v_名称中选择名称,其中名称='Max'; 结束; 是。。。但不是你是怎么做的,原因有两个: 首先,您没有一个集合(您称之为表变量),因为您使用了PLS_INTEGER索引,所以您拥有的是一个关联数组 其次,您只能在SQL查询中使用集合,其中数据类型已在SQL范围中声明(您的数据类型

在PL/SQL中,是否可以使用变量作为表的查询

尝试:

声明
类型t_name是由PLS_整数表示的varchar(50)索引表;
v_name t_name;
开始
从my_表中选择名称批量收集到v_名称中;
从v_名称中选择名称,其中名称='Max';
结束;

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

  • 首先,您没有一个集合(您称之为表变量),因为您使用了PLS_INTEGER索引,所以您拥有的是一个关联数组
  • 其次,您只能在SQL查询中使用集合,其中数据类型已在SQL范围中声明(您的数据类型在PL/SQL中声明)
因此,首先需要创建类型:

创建类型t_name是VARCHAR2(50)的表;
然后可以运行PL/SQL块:

声明
v_name t_name;
v_name VARCHAR2(50);
开始
选择名称
批量收集到v_名称中
从我的桌子上;
选择列值
化名
从表(v_名称)
其中列_值='Max';
DBMS_OUTPUT.PUT_行(v_名称);
结束;
/
(注意:第二个查询中的表集合表达式具有伪列
column\u值
,而不是表中的任何特定标识符。)


dbfiddle

谢谢!我不明白他们为什么把这件事弄得这么复杂,我不想到处都是类型的数据库,我只想让它工作!如果有人掉了我的字型就会破坏系统,该死的。@user5507535如果要筛选集合以查找单个值,则可以在初始
选择
中进行筛选以仅获取单个值,或者可以使用
FOR
循环在PL/SQL中迭代集合,然后不必尝试将其放回SQL范围。@user5507535。这并不复杂,只是你不熟悉而已。就破坏数据库而言,这不是问题。20年来,我从来没有丢过一个打字机。毕竟,varchar2、integer和date在包标准中都被定义为TYPE(大部分是子类型)。所以这样做是一贯的。只是不同而已。@Belayer我理解你,但这个设计决策毫无意义,就像要求你在不需要的时候创建一个全局变量。我只会在非常特定的文件和范围上使用该类型,那么为什么需要在整个系统中全局共享if呢?在PL/SQL和SQL中有很多事情是这样的,在我看来,这是一个糟糕的设计,而不是程序员的人机工程学。@ USER550735,如果你认为它们是两种不同的语言,这是完全有意义的。这就像编写一个Java程序来包装一些低级C代码,并询问为什么在Java中声明一个数据类型时不能在C代码中使用它?你不能,因为它们是两种不同的语言,包装是从Java到C,而不是相反。PL/SQL和SQL是一样的;您可以在PL/SQL中使用SQL类型,但不能在SQL中使用PL/SQL类型。