migration composite type

Datenbank Migration (z. B. von MySQL auf PostgreSQL)
Antworten
nms
Neuer Benutzer
Beiträge: 16
Registriert: Fr 9. Dez 2016, 12:11

migration composite type

Beitrag von nms » Do 29. Dez 2016, 10:33

Hallo

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

Code: Alles auswählen

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 :(

Code: Alles auswählen

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

akretschmer
Erfahrener Benutzer
Beiträge: 7677
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Re: migration composite type

Beitrag von akretschmer » Do 29. Dez 2016, 10:51

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).
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

nms
Neuer Benutzer
Beiträge: 16
Registriert: Fr 9. Dez 2016, 12:11

Re: migration composite type

Beitrag von nms » Do 29. Dez 2016, 11:20

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

akretschmer
Erfahrener Benutzer
Beiträge: 7677
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Re: migration composite type

Beitrag von akretschmer » Do 29. Dez 2016, 11:39

suchst Du sowas?

Code: Alles auswählen

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.
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

nms
Neuer Benutzer
Beiträge: 16
Registriert: Fr 9. Dez 2016, 12:11

Re: migration composite type

Beitrag von nms » Do 29. Dez 2016, 11:54

Genau..

create typ autos as ( autos auto[] )

wie setze ich denn autos ??

nms
Neuer Benutzer
Beiträge: 16
Registriert: Fr 9. Dez 2016, 12:11

Re: migration composite type

Beitrag von nms » Do 29. Dez 2016, 13:36

also ich habe es so geschafft,

Code: Alles auswählen

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 


castorp
Erfahrener Benutzer
Beiträge: 1174
Registriert: Sa 27. Jun 2009, 22:24
Wohnort: Bayern

Re: migration composite type

Beitrag von castorp » Do 29. Dez 2016, 13:39

Das geht einfacher:

Code: Alles auswählen

select array_agg(row(marke, model)::auto)
from autotbl;
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

Antworten