2016-07-11 9 views
0

Angenommen ich ein Objekt und Tabelle haben erklärt wie folgt aus:Standardwerte für die Objekte in OracleDB

CREATE TYPE MyType AS OBJECT (
    some_property NUMBER(20) 
) NOT FINAL; 

CREATE TABLE MyTable OF MyType; 

Wie kann ich die Standardwerte angeben? Für normale Tabellen würde ich etwas wie some_property NUMBER(20) DEFAULT 123 verwenden. Ist es möglich, etwas Ähnliches für Objekte zu verwenden?

Ich weiß, es ist möglich, den Konstruktor zu überlasten, aber ich möchte die Tabelle auf die gleiche Weise wie ohne Objekte verwenden (das heißt, in der Lage, nur eine kleine Anzahl von Spalten beim Einfügen von Daten anzugeben, und default die anderen).

+0

Sie Standardkonstruktors erstellen können. Siehe diesen Link http://stackoverflow.com/questions/17939882/setting-default-value-in-oracle-object-type-constructor-function. –

+0

Ist es möglich, die vorhandene Syntax zum Einfügen von Objekten zu verwenden, z. 'Einfügen in MyTable (some_property) values ​​(1)' und auch 'in MyTable values ​​()' einfügen? – tobspr

Antwort

1

Also statt Kommentar ich hinzufügen vollständige Antwort wegen Missverständnissen

DDL

CREATE TYPE MyType AS OBJECT (
    some_property NUMBER(20), 
    CONSTRUCTOR FUNCTION MyType(some_property number default 123) RETURN SELF AS RESULT 
) NOT FINAL; 
/

CREATE OR REPLACE TYPE BODY MyType AS 
    CONSTRUCTOR FUNCTION MyType(some_property number default 123) 
    RETURN SELF AS RESULT 
    AS 
    BEGIN 
    SELF.some_property := some_property; 
    RETURN; 
    END; 
END; 
/

CREATE TABLE MyTable OF MyType; 

DML Werke wie dieses

-- Insert row with 123 
INSERT INTO MyTable(some_property) 
VALUES(MyType().some_property); 
/

-- Insert row with 456 
INSERT INTO MyTable(some_property) 
VALUES(MyType(456).some_property); 
/

Meiner Meinung nach Konstruktor ist flexibler, wenn Tabelle mit Spaltenobjekt erstellen

create table testt (
     v mytype); 
/

insert into testt values(MyType()); 
/

insert into testt values(MyType(456)); 
/

aktualisieren

ich glaube, Sie smt wie diese insert into <table> values() mit Objekttypen mit Konstrukteuren schreiben cann't. Sehen Sie sich auch die Problemumgehung mit dem Trigger Oracle: specifying default value for object type column an. Aber es ist nicht zuverlässig.

Noch eine Anmerkung

Recent Ich weiß, eine Sache, die Sie Standardwert verschachtelte Tabellenspalte hinzufügen können, wie es gewöhnlichen Tisch. Ich dachte, das ist verboten.

Schauen Sie sich das

CREATE TYPE MyType AS OBJECT (
    some_property NUMBER(20), 
    test_property NUMBER(20) 
); 

CREATE TABLE MyTable OF MyType 
(some_property default '123'); -- this simply transforms into 'alter table MYTABLE modify some_property default '123';' 

insert into MyTable(test_property) values(1) 
+0

Okay, scheint es gibt keinen besseren Weg, mein Ziel war es, in der Lage zu sein, die gleiche Syntax für Objekte zu verwenden, so dass der vorhandene Code noch funktioniert. – tobspr

+0

@tobspr Ich füge eine Notiz hinzu, die ich vor kurzem aus einem Quiz kenne. Dies kann für Sie hilfreich sein. –

Verwandte Themen