Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/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
可在POSTGRES中使用Oracle Cast和MULTISET_Oracle_Postgresql_Casting_Multiset - Fatal编程技术网

可在POSTGRES中使用Oracle Cast和MULTISET

可在POSTGRES中使用Oracle Cast和MULTISET,oracle,postgresql,casting,multiset,Oracle,Postgresql,Casting,Multiset,我一直在研究一个从oracle数据库生成xml的查询 其中“column”是一种类型 CREATE OR REPLACE TYPE "column" AS OBJECT ("coulmnname" VARCHAR2 (30), "datatype" VARCHAR2 (30)) 列列表的类型为 CREATE OR REPLACE TYPE col_list_t AS TABLE OF "column" 及 问题是,这必须转换为postgres as CAS

我一直在研究一个从oracle数据库生成xml的查询

其中“column”是一种类型

CREATE OR REPLACE TYPE "column" AS OBJECT
                  ("coulmnname" VARCHAR2 (30), "datatype" VARCHAR2 (30))
列列表的类型为

CREATE OR REPLACE TYPE col_list_t AS TABLE OF "column"


问题是,这必须转换为postgres as CAST,而MULTISET在postgres中不可用,所以在postgres语法中是否有办法做到这一点?不幸的是,PostgreSQL并不真正支持SQL标准
MULTISET
运算符,也不支持嵌套集。您可以创建一个
数组
,其中包含
类型,如下所示:

select array[row(1, 2), row(3, 4)]
select array_agg(row(a, b))
from (
  select ...
) t(a, b)
您甚至可以取消检测上述阵列

select * from unnest(array[row(1, 2), row(3, 4)]) t(a int, b int)
因此,如果您可以接受
行的
数组
,您可以编写如下内容:

select array[row(1, 2), row(3, 4)]
select array_agg(row(a, b))
from (
  select ...
) t(a, b)
如果您在PostgreSQL中有自己的
对象
类型,则可以将匿名
强制转换为您的类型:

select array_agg(row(a, b)::your_type)
from (
  select ...
) t(a, b)

cast(…)
在Postgres中可用,但
multiset
不可用。如果您正在生成XML,您是否查看了Postgres中的各种XML函数?当有一种有用的SQL标准方法来做Oracle支持而PostgreSQL不支持的事情时,我总是有点震惊。甲骨文并不以其爱用标准方式做事而闻名。快速一看,多重集合看起来非常有用。@CraigRinger:我自己也很惊讶。当然,许多SQL标准在过去都是由Oracle和IBM推动的,因此经常在其中发现Oracle功能并不令人惊讶,例如,还通过组内的
(ORDER by…
)对聚合函数进行排序。在这种情况下,Oracle没有完全实现该标准,但需要OP对命名集合类型进行
CAST
。在标准中,集合和数组也可以是匿名的,例如由Informix实现example@CraigRinger:Oracle与PostgreSQL的另一点:
MERGE
是的,MERGE是。。。嗯,一个混合袋。它是一个很好的OLAP数据合并工具,但它经常被错误地滥用为OLTP UPSERT样式的使用,在这种情况下,它只是简单地被破坏了。它不能替换正确的upserts。@CraigRinger:这取决于数据库。从理论上讲,不存在虐待:-)