当前位置: 首页 > 面试题库 >

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

史昱
2023-03-14
问题内容

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

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

因此,问题是,将PL / SQL关联数组参数转换为可在过程中用到的sql语句中的东西的方法是什么:

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
[]填充。

随意讨论除使用关联数组之外的其他方法,但是提前知道这些解决方案将不被接受。 不过,我仍然对看到其他选择感兴趣。


问题答案:

我将创建这样的数据库类型:

create type v2t as table of varchar2(30);
/

然后在过程中:

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类型。)



 类似资料:
  • 问题内容: 这是我想阻止在服务器上运行的那种查询的示例: 该查询(或其他类似查询)可能通过Oracle JDBC瘦驱动程序访问了我的Oracle服务器。我愿意阻止该查询在JDBC配置级别,数据库服务器配置级别或通过架构内的用户权限运行。我希望用户能够继续运行正常的选择/插入/更新/删除查询。老实说,如果没有可用的PL / SQL类型命令,而只有标准SQL,我会很高兴。 更新 我还应该提到,我希望用

  • 问题内容: 我对Oracle SQL查询并不十分了解,因此在删除表中的某些行时遇到了一个问题,该行必须满足一个约束,该约束包括另一个(联接)表的字段。换句话说,我想编写一个查询来删除包括JOIN的行。 在我的情况下,我有一个表和另一个连接在字段上的表。我想从大于或等于200的行中删除行,并且它们引用的产品具有名称“ Mark”(名称是“产品”中的一个字段)。 我想首先被告知Oracle中的Dele

  • 我有下面的模式, 学生(名字、姓氏、SID) 已注册(学生ID、课程ID) 课程(CID、课程名称、系) 我需要找出哪些学生上的课比课多。和位位于类别中。我有以下查询,其中列出了所有注册课程的学生以及他们注册了多少课程。 不太确定如何将这个数字与那些注册信息技术课程的人进行比较。

  • 问题内容: 我有一个带有“标题”字段的表,该字段是varchar2,我想选择所有行,然后按通常的顺序先按数字然后按字母对它们进行排序。 例如,我目前最后使用一个简单的代码: 美国广播公司 国防部 321 但是我想要这个: 321 美国广播公司 国防部 奇怪的是,SQL Developer显示“正确”的顺序,以数字开头。但是在我的应用程序(使用OCI8的PHP)上,它最后显示数字。 问题答案: 不是

  • 一个user有多个tel,是一对多的关系,现在我只需要查最新的一条即可,没必要把tel全查出来,应该怎么写?

  • 要在spark sql中运行sql语句以联接PostgreSQL中的两个表,请执行以下操作: 数据库引擎会执行联接操作并发回联接结果吗?或者数据库会将表_1和表_2的所有记录发送给spark job和spark job进行连接吗?是否有一些文档来解释此操作?谢谢