首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在SQL查询中使用Oracle关联数组

如何在SQL查询中使用Oracle关联数组
EN

Stack Overflow用户
提问于 2009-11-11 15:35:24
回答 2查看 33.5K关注 0票数 9

ODP.Net公开了将关联数组作为参数从C#传递到Oracle存储过程的能力。这是一个很好的特性,除非您试图在sql查询中使用该关联数组中包含的数据。

这是因为它需要一个上下文切换- SQL语句需要SQL类型,并且像这样传递到PL/SQL的关联数组实际上被定义为PL/SQL类型。我相信在PL/SQL包/过程/函数中定义的任何类型都是PL/SQL类型,而在这些对象之外创建的类型是SQL类型(如果您可以提供更多的说明,请这样做,但这不是这个问题的目的)。

因此,问题是,您将使用哪些方法将PL/SQL关联数组param转换为在过程中可以在如下sql语句中使用的内容:

代码语言:javascript
运行
复制
OPEN refCursor FOR
SELECT T.*
FROM   SOME_TABLE T,
       ( SELECT COLUMN_VALUE V
         FROM   TABLE( associativeArray )
       ) T2
WHERE  T.NAME = T2.V;

就本例而言,"associativeArray“是由PLS_INTEGER索引的varchar2(200)的一个简单表。在C#中,associativeArry参数由一个string[]填充。

除了使用关联数组之外,还可以讨论其他方法,但是提前知道这些解决方案不会被接受。不过,我还是对其他选择感兴趣。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-11-11 16:10:12

我会创建这样一个数据库类型:

代码语言:javascript
运行
复制
create type v2t as table of varchar2(30);
/

然后在程序中:

代码语言:javascript
运行
复制
FOR i IN 1..associativeArray.COUNT LOOP
    databaseArray.extend(1);
    databaseArray(i) := associativeArray(i);
END LOOP;

OPEN refCursor FOR
SELECT T.*
FROM   SOME_TABLE T,
       ( SELECT COLUMN_VALUE V
         FROM   TABLE( databaseArray )
       ) T2
WHERE  T.NAME = T2.V;

(其中databaseArray被声明为v2t类型)。

票数 12
EN

Stack Overflow用户

发布于 2017-08-08 10:37:36

不能在SQL作用域中使用关联数组--它们只能在PL/SQL作用域中使用。

一种方法是将关联数组映射到集合(如果集合类型是在SQL作用域中定义的,而不是PL/SQL作用域,则可以在SQL作用域中使用该集合)。

SQL

代码语言:javascript
运行
复制
CREATE TYPE VARCHAR2_200_Array_Type AS TABLE OF VARCHAR2(200);
/

PL/SQL

代码语言:javascript
运行
复制
DECLARE
  TYPE associativeArrayType IS TABLE OF VARCHAR2(200) INDEX BY PLS_INTEGER;
  i                PLS_INTEGER;
  associativeArray associativeArrayType;
  array            VARCHAR2_200_Array_Type;
  cur              SYS_REFCURSOR;
BEGIN
  -- Sample data in the (sparse) associative array
  associativeArray(-2) := 'Test 1';
  associativeArray(0)  := 'Test 2';
  associativeArray(7)  := 'Test 3';

  -- Initialise the collection
  array := VARCHAR2_200_Array_Type();

  -- Loop through the associative array
  i := associativeArray.FIRST;
  WHILE i IS NOT NULL LOOP
    array.EXTEND(1);
    array(array.COUNT) := associativeArray(i);
    i := associativeArray.NEXT(i);
  END LOOP;

  -- Use the collection in a query
  OPEN cur FOR
    SELECT *
    FROM   your_table
    WHERE  your_column MEMBER OF array;
END;
/
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1715978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档