如何在带有虚拟列的 Oracle 表中插入数据?



我有一个.Net应用程序,它从oracle数据库加载数据表。该表包含一个虚拟列。

当我在数据表中插入新行时,它说:

不允许在虚拟列上执行插入 INSERT 操作

我确实理解此错误,但我不知道在将数据保存回数据库时如何跳过虚拟列。

这是我的代码:

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)

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

但是,将数据保存回数据库时,它会返回相同的错误。

谁能帮忙?

干杯

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

当您将数据插入到具有虚拟列的表中时,您必须列出列,即您不得使用

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;

如果您想选择虚拟列,但跳过它们进行插入(或更新(,您可以使用 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;

最新更新