如何使用虚拟列在 Oracle table 中插入数据?

How to insert data in Oracle table with virtual columns?

我有一个从 Oracle 数据库加载数据的 .Net 应用程序table。 table 包含一个虚拟列。

当我在数据table中插入一个新行时,它说:

Insert INSERT operation disallowed on virtual columns

我明白这个错误,但我不知道如何在将数据保存回数据库时跳过虚拟列。

这是我的代码:

    Dim Command As OracleCommand
    Dim TempDataAdapter As OracleDataAdapter
    Dim DataSet = new DataSet
    Dim Name = "MyTable"
    Dim TempDataAdapter As OracleDataAdapter
    Dim DataTable as DataTable

    'The connection is defined somewhere else...
    Command = New OracleCommand("MyTable", Me.Connection) 
    Command.CommandType = CommandType.Text

    TempDataAdapter = New OracleDataAdapter(Command)

    'Fill the table from the database 
    TempDataAdapter.FillSchema(DataSet, SchemaType.Source, Name)
    DataTable = DataTable = DataSet.Tables(0)           

以及将数据保存回数据库的代码:

    TempDataAdapter.Update(DataTable)

创建数据后table,我尝试从数据中删除虚拟列table: DataTable.Columns.Remove(DataTable.Columns("MyVirtualColumn"))

但是将数据存回数据库时,returns同样的错误。

有人可以帮忙吗?

干杯,

当您使用虚拟列将数据插入 table 时,您必须列出列,即。 e.你不能使用

Insert into table_x values (x, y, z)

但是

Insert into table_x (col1, col2, col3) values (x, y, z)

相应地编写您的 .net 语句。如果您尝试使用 DataTable 进行更新,那么您可以使用排除虚拟列的视图:

CREATE OR REPLACE VIEW V_MyTable AS 
SELECT col1, col2 -- skip virtual_col3 
FROM MyTable;

如果您喜欢 select 虚拟列但跳过它们以进行插入(或更新),您可以使用 INSTEAD OF 触发器创建视图。会是这样的:

CREATE OR REPLACE VIEW V_MyTable AS 
SELECT col1, col2, virtual_col3
FROM MyTable;

CREATE OR REPLACE TRIGGER IO_MyTable
    INSTEAD OF INSERT OR UPDATE ON V_MyTable
    FOR EACH ROW

BEGIN

    IF UPDATING THEN
        UPDATE MyTable SET 
            col1 = :NEW.col1, 
            col2 = :NEW.col2
        WHERE primary_key_col = :OLD.primary_key_col;
    ELSIF INSERTING THEN
        INSERT INTO MyTable (col1, col2) VALUES (:NEW.col1, :NEW.col2);
    END IF;

END;

如果您不尝试填充或查询虚拟列,能否在 table 上创建一个排除虚拟列的视图并使用该视图。