sql - Oracle SQL 中的数组

标签 sql oracle arrays plsql

这是我希望能够在 PL-SQL (Oracle) 中执行的操作的简化伪代码版本:

DECLARE
  mylist as ARRAY
BEGIN
  mylist (1) := '1'
  mylist (2) := '3'
  ...
  SELECT *
  FROM aTable
  WHERE aKey IN mylist;
END;

SELECT 应该返回 mylist(1)、mylist(2) 等的匹配记录。它应该类似于对所有值进行 ORing,但当然我们事先不知道我们得到了多少个值。

我怎样才能做到这一点?我知道 PL/SQL 有一些集合数据类型,但我似乎无法让它们在 SQL 语句中正常工作。

感谢您的任何想法。

最佳答案

使用 TABLE() 函数很容易做到这一点。一个问题是数组变量必须使用在 SQL 中声明的类型。这是因为 SELECT 使用 SQL 引擎,所以 PL/SQL 声明超出范围。

SQL> create or replace type numbers_nt as table of number
  2  /

Type created.

SQL>
SQL> declare
  2      l_array numbers_nt;
  3  begin
  4      l_array := numbers_nt (7521,7566,7654);
  5      for r in ( select ename
  6                 from emp
  7                 where empno in ( select *
  8                                  from table (l_array)
  9                                 )
 10               )
 11      loop
 12          dbms_output.put_line ( 'employee name = '||r.ename);
 13      end loop;
 14  end;
 15  /
employee name = PADFIELD
employee name = ROBERTSON
employee name = BILLINGTON

PL/SQL procedure successfully completed.

SQL>

关于sql - Oracle SQL 中的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1401801/

相关文章:

php - 从 VALUES NOT EQUALS = array 的数据库中选择

MySql 准备语句 - 是否可以参数化列名或函数名?

mysql - 无法提供代码来回答此查询。

java - 插入新行,并通过简单计算增加最大值(并发问题)

oracle - Oracle的dump(systimestamp)字节的含义

sql - 如何将 MySQL 中的表与 Oracle 中的表连接

c# - 获取数组中最接近的值

Javascript创建未知维度大小的数组

php - 如何防止 PHP 中的 SQL 注入(inject)?

mysql - SQL 查询 - JOIN 和 UNION