migration composite type

Hallo

ora2pg hat zwei composite type in oracle wie folgt nach postgres migriert…

Ora
-----------------------------
create or replace 
TYPE CLASS_MAPPING_TAB IS TABLE OF class_mapping;

create or replace 
TYPE CLASS_MAPPING IS OBJECT (
   ID                NUMBER,
   klasse            NUMBER,
   text              VARCHAR2 (500 CHAR)
);

||
\/
Postgres:
-----------------------------
create or replace
TYPE class_mapping_tab AS
   class_mapping_tab class_mapping[];

create or replace 
TYPE CLASS_MAPPING IS OBJECT (
   ID                NUMBER,
   klasse            NUMBER,
   text              VARCHAR2 (500 CHAR)
);

wie kann ich class_mapping_tab setzen?
es funkt nicht wie folgt :frowning:

..
 tmpval	       RECORD;
 retval          class_mapping_tab;
 retval := array[ ROW(tmpval.ID, tmpval.klasse, tmpval.text) :: class_mapping)];  
..

iirc unterstützt PostgreSQL nicht CREATE OR REPLACE TYPE, also laß das OR REPLACE mal weg. Dafür setzt du das nach dem AS in ( runde Klammern).

Hallo Kretschemer,
Danke fuer die schnelle Antwort !.. Die Typen sind nach Postgres bereits migriert (das war copy/paste Fehler von mir)
wie setze ich ein Array die in einem composite typ definiert ist?

Gruss

suchst Du sowas?

test=# create type auto as (marke text, type text);
CREATE TYPE
test=*# create table meine_autos(id int, autos auto[]);
CREATE TABLE
test=*#

Das Handling von composite types und auch noch arrays davon ist etwas, ähm, speziell. Google mal, es gibt diverse Leute, die dazu was geschrieben haben.

Genau…

create typ autos as ( autos auto[] )

wie setze ich denn autos ??

also ich habe es so geschafft,

create table autotbl ( id numeric, marke text, model text);
insert into autotbl(id, marke, type) values (1, 'VW', 'passat');
insert into autotbl(id, marke, type) values (2, 'BMW', '540d');

create or replace function getautos() returns autos as $$
declare mycur CURSOR FOR select marke, model FROM autotbl;
retval autos;
autosArray auto[];
row_auto RECORD;
idx int :=0;

begin 
	OPEN mycur;
	LOOP
		FETCH mycur INTO row_auto;
		    EXIT WHEN NOT FOUND;
		autosArray[idx] := row_auto;
		idx := idx+1;
		
	END LOOP;
	retval.autos := autosArray;
	CLOSE mycur;

	return retval;
	end
$$
LANGUAGE plpgsql

Das geht einfacher:

select array_agg(row(marke, model)::auto)
from autotbl;