postgres中用户定义的类型为oracle

时间:2018-11-20 08:57:36

标签: postgresql database-migration postgresql-9.3 postgresql-9.5

有人可以帮助我在postgres中实现用户定义的类型吗?

我如何在postgres中复制以下oracle类型的相同功能:

sudo yum install geos geos-devel

Postgres代码如下,其类型为GT_CPT(NomTable)和GT_DATA()。 谁能在这里解释为什么将GT_DATA()类型用作函数?

CREATE TYPE gr_data AS (
col1 numeric, col2 varchar(30)
);

CREATE OR REPLACE TYPE GT_DATA      IS TABLE OF GR_DATA;
CREATE OR REPLACE TYPE GT_TEXT      IS TABLE OF VARCHAR2(255) INDEX BY BINARY_INTEGER ;  
CREATE OR REPLACE TYPE GN_CPT       IS TABLE OF NUMBER        INDEX BY VARCHAR2(30);

1 个答案:

答案 0 :(得分:0)

is table of通常是在Postgres中使用arrays完成的。

INDEX BY VARCHAR2(30)等效的可能是JSONB值(键/值对)或hstore值。在这两种情况下,您都会失去is table of number index by varchar所提供的类型安全性。

我不清楚您要达到什么目标(尤其是您想如何使用table of number,但是也许以下内容可以帮助您入门:

create type gr_data as 
(
   col1 numeric, col2 varchar(30)
);

create or replace function test() 
   returns void as $body$
declare
  NomTable text:= 'tab1';
  tes text := 'some value';
  result gr_data[];
  gt_cpt jsonb := '{}'; 
begin
  -- this assigns 'some value' to the key 'tab1' in the jsonb key/value pair
  -- similar to GT_CPT(NomTable) := tes;
  gt_cpt := jsonb_set(gt_cpt, array[nomtable], tes);

  -- this assigns an empty array to the variable result
  -- if I remember correctly that's the same as Oracle's type constructor GT_DATA()
  result := array[];
end 
$body$
language plpgsql;