Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL中的Oracle access varray元素_Oracle - Fatal编程技术网

SQL中的Oracle access varray元素

SQL中的Oracle access varray元素,oracle,Oracle,我正在玩Oracle中的阵列支持,遇到了一个关于SQL查询中的阵列访问的障碍。我正在使用以下模式: create type smallintarray as varray(10) of number(3,0); create table tbl ( id number(19,0) not null, the_array smallintarray, primary key (id) ); 我想做的是获取id和第一个元素,即数组的索引1。在PostgreSQL中,我可以编写se

我正在玩Oracle中的阵列支持,遇到了一个关于SQL查询中的阵列访问的障碍。我正在使用以下模式:

create type smallintarray as varray(10) of number(3,0);
create table tbl (
   id number(19,0) not null,
   the_array smallintarray,
   primary key (id)
);
我想做的是获取id和第一个元素,即数组的索引1。在PostgreSQL中,我可以编写
select id,tbl t中的_数组[1]
,但我不知道如何使用Oracle实现这一点。我读到只有在PL/SQL中才可能通过索引访问数组,如果我可以通过JDBC返回一个“修饰的游标”以获得相同的结果,那就好了,但我不知道这是否可能

DECLARE
 c1   SYS_REFCURSOR;
 varr smallintarray2;
BEGIN
  OPEN c1 FOR SELECT t.id, t.THE_ARRAY from tbl t;
  -- SELECT t.THE_ARRAY INTO varr FROM table_with_enum_arrays2 t;
  -- return a "decorated cursor" with varr(1) at select item position 1
  dbms_sql.return_result(c1);
END;

您可以在普通SQL中实现这一点;它不漂亮,但确实有用。您更希望Oracle有语法来向程序员隐藏这一点(也许是这样,至少在最新的版本中是这样;我仍然停留在12.2)

编辑如果需要考虑通过
运算符生成元素的顺序,可以执行类似操作(在Oracle 12.1及更高版本中;否则函数本身不能作为查询的一部分,但可以自行定义):


您可以在普通SQL中实现这一点;它不漂亮,但确实有用。您更希望Oracle有语法来向程序员隐藏这一点(也许是这样,至少在最新的版本中是这样;我仍然停留在12.2)

编辑如果需要考虑通过
运算符生成元素的顺序,可以执行类似操作(在Oracle 12.1及更高版本中;否则函数本身不能作为查询的一部分,但可以自行定义):


首先,请不要在生产中这样做。使用表,而不是在表中存储数组

您的问题的答案是使用列作为表源

SELECT t.id, ta.*
  from tbl t,
       table(t.THE_ARRAY) ta
 order by column_value
--  offset 1 row -- in case if sometime you'll need to skip a row
fetch first 1 row only;
UPD:至于数组的排序,我只能说“使用2asc/desc”参数为我提供了我所期望的结果-它是按升序或降序排列的


UPD2:找到了一个很酷的链接,指向可能发生的问题的描述

首先,请不要在生产中这样做。请使用表,而不要在表中存储数组

您的问题的答案是使用列作为表源

SELECT t.id, ta.*
  from tbl t,
       table(t.THE_ARRAY) ta
 order by column_value
--  offset 1 row -- in case if sometime you'll need to skip a row
fetch first 1 row only;
UPD:至于数组的排序,我只能说“使用2asc/desc”参数为我提供了我所期望的结果-它是按升序或降序排列的



UPD2:找到了一个很酷的链接,指向可能发生的问题的描述

Hi,谢谢。我也在考虑这个问题,但由于Oracle没有明确提到这一点,我担心行号可能与实际数组索引不匹配。你确定这是真的吗?我想这是可行的。但是,
函数将按顺序返回集合中的元素,以便在这种情况下,
ord=1
始终是第一个元素,这在任何地方都有记录吗?我在文档中没有看到任何保证这一点的东西,尽管我也希望如此。我和贾斯汀·卡维一样担心,我也不确定,因为正如你所说,Oracle文档对此没有提及。OTN论坛对此进行了长时间的讨论;没有人见过数组元素不按数组顺序生成的情况。@ChristianBeikov-我看到您选择了不同的答案作为“正确答案”。但它也有同样的缺陷,不是吗?不知道你是如何决定哪个答案更好的。在任何情况下-如果需要使用
运算符保持顺序,则可以创建选择元素的PL/SQL函数;我编辑了我的回复来展示我是如何做的。嗨,谢谢你。我也在考虑这个问题,但由于Oracle没有明确提到这一点,我担心行号可能与实际数组索引不匹配。你确定这是真的吗?我想这是可行的。但是,
函数将按顺序返回集合中的元素,以便在这种情况下,
ord=1
始终是第一个元素,这在任何地方都有记录吗?我在文档中没有看到任何保证这一点的东西,尽管我也希望如此。我和贾斯汀·卡维一样担心,我也不确定,因为正如你所说,Oracle文档对此没有提及。OTN论坛对此进行了长时间的讨论;没有人见过数组元素不按数组顺序生成的情况。@ChristianBeikov-我看到您选择了不同的答案作为“正确答案”。但它也有同样的缺陷,不是吗?不知道你是如何决定哪个答案更好的。在任何情况下-如果需要使用
运算符保持顺序,则可以创建选择元素的PL/SQL函数;我编辑了我的回复来说明如何。我实际上想要第一个元素,但这归结为与下面评论中相同的问题。是否保证table操作符保留数组的顺序?@ChristianBeikov我已经更新了答案。主要的一点是:添加“orderby”子句可以按预期的顺序生成结果。但是再一次——因为它在任何地方都没有文档记录——考虑使用普通表来代替它,以获得预期的结果。为什么不推荐这样做呢?我喜欢它在线存储的事实。按值排序不是我想要的。我想要索引1处的元素,即数组中的第一个元素。@ChristianBeikov首先,它会降低未参与开发过程的其他开发人员对代码的支持。我现在有一个遗留项目的问题。由于数据存储在列中的集合中,因此很难找到数据的来源。第二,可能存在性能问题(请参阅UPD2上一个精彩答案的链接)@ChristianBeikov另一个问题是,如果您需要根据父id以外的某些条件选择子对象(_数组)。假设您需要在所有具有
SELECT t.id, ta.*
  from tbl t,
       table(t.THE_ARRAY) ta
 order by column_value
--  offset 1 row -- in case if sometime you'll need to skip a row
fetch first 1 row only;