虚拟列上不允许插入操作

时间:2017-08-02 18:13:59

标签: oracle sql-insert virtual-column

我不明白以下问题,我试图插入查询并获取错误,因为虚拟列上不允许插入操作。我从sql开发人员的生产中导出了一个导出,我尝试在测试环境中运行那些插入语句,并且在生产和测试环境中的表中的两列中都有虚拟列,所以通常在从生产到测试环境插入时不会出现问题。但我仍然遇到了这个问题。下面是插入语句之一。但是有成千上万的插入声明。 ORD_DAYID列具有虚拟列。

Insert into TTRE (IS_GRP,ORD_SRCBK,ORD_MASTER_SRCBK,SALES_ORD_CHNL_SRCID,IS_CAPS,PROD_QTY_UNIT,PROD_U_PRICE,ORD_DAYID,ORD_SRCID,ORDLN_SRCID,ORDMAST_SRCID,ORD_LC_FLAG,PROD_SRCID,PARENT_PROD_SRCID,SYS_DB_NAME,SYS_LOAD_ID,SYS_LOAD_DTS,SYS_REC_SRC,CUST_SRCID,ENTITY_ID,ORD_DT,ORDMAST_DT,CURRENCY,IS_CONSUMPTION_INCLUDED,USER_CODE,WAREHOUSE_DIST_SRCID,IS_PASSED_BY,IS_CAN,PARENT_PROD_QTY,PROD_QTY,PARENT_PROD_U_PRICE,ORDLN_AMT,VAT_AMT,VAT_RATE_CODE,ORDLN_VAT_AMT,REBATE_ORD_AMT,GIFTCARD_ORD_AMT,ORDLN_PROMOTION,IS_INVOICED_FOR_STATISTIC,MAN_PROCESS_FLAG,ORDMAST_USER_CODE,IS_NPASS,ORIGIN,ORD_DTT,ITEM_CAT_CODE,REF_CAMPA_CODE) values (1,'43|14096967','43|14096898',6273,0,-1,0,20160330,13073855,59635337,416412266,-1,0,123076,'LM',358435,to_date('27-DEC-16','DD-MON-RR'),'NESSOFTLM',34118685,43,to_date('30-MAR-16','DD-MON-RR'),to_date('30-MAR-16','DD-MON-RR'),'COP',1,'NNCARDONMA1',4043,1,null,-1,-1,250000,-238095.2381,-11904.7619,'A',-250000,null,null,null,1,null,'NNCARDONMA1',0,29,to_date('30-MAR-16','DD-MON-RR'),null,null); 

3 个答案:

答案 0 :(得分:1)

似乎没有任何方法可以从生成的插入脚本中自动排除虚拟列,这似乎有点疏忽。

如果您坚持使用当前脚本,那么您可以编辑该文件以删除列引用和匹配值,这很痛苦;或者将数据加载到临时登台表中,并将非虚拟列复制到真实表中;或者临时修改测试环境中的目标表以重命名虚拟列并将其替换为非虚拟列,然后可以将其丢弃,例如,像这样的东西:

alter table ttre rename column ord_dayid to ord_dayid_temp;
alter table ttre add ord_dayid number; -- match actual data type
@your_insert_script
alter table ttre drop column ord_dayid;
alter table ttre rename ord_dayid_temp to ord_dayid;

(非常小心地了解你正在做什么以及你是在正确的时间改变/放弃正确的事情,并且你已经拥有了拥有表和数据库的人的同意。不要运行代码,特别是破坏性的代码,你在网上找到而不是真的确定它既合适又正确......)

但这也很痛苦且容易出错,请注意插入后的第一个更改将隐式提交。你甚至可能没有必要的特权去做。

如果您可以重新生成脚本,则可以手动排除虚拟列。在数据库导出向导中,当您转到“指定数据”窗口时:

enter image description here

输入您的表名,单击将在顶部列出的查找按钮,您的表名,从该列表中选择它,然后单击向下箭头。这会将其移至屏幕的底部,“列”条目显示为*。点击*,然后点击出现的铅笔符号,这将为您提供一个新的对话框:

enter image description here

单击加号以展开列表以显示所有列,并取消选中虚拟列。单击“确定”,然后继续导出。生成的脚本将仅包含您选中的列。

正如@krokodilko建议的那样,使用数据泵导出和导入会更简单,但如果您没有这样的权限,可能需要让您的DBA参与。 (当然,请确保您实际上允许将数据从生产复制到测试 - 取决于所涉及的数据类型,这可能不是一个好主意。)

答案 1 :(得分:0)

只删除一个派生自其他列的列,逻辑上你不需要在该列中插入值,系统会自动派生该列的值并插入特定记录

答案 2 :(得分:0)

当我尝试将值插入 compute 列时,这发生在我身上。在SQL Developer中,查看表模式网格,该违规列的DATA_DEFAULT列(而不是违规列,即网格中的列)具有case语句,该语句从行中的其他值派生其值。我从插入语句中删除了有问题的列,它起作用了。