0

我不明白下面的问题,我试图插入查询并得到错误,因为在虚拟列上不允许插入操作。我在 sql developer 中从生产环境中导出,并尝试在测试环境中运行这些插入语句,并且在生产环境和测试环境中的表中的列中都有虚拟列,因此从生产环境插入到测试环境时通常不会出现问题。但我仍然遇到问题。下面是插入语句之一。但是有成千上万的插入语句。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); 
4

3 回答 3

3

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

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

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;

(要非常小心地了解您在做什么,并且您正在正确的时间更改/删除正确的内容,并且您已获得拥有表和数据库的任何人的同意。不要运行代码,尤其是破坏性代码,您在互联网上找到,但并没有真正确定它既合适又正确......)

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

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

在此处输入图像描述

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

在此处输入图像描述

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


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

于 2017-08-02T19:06:37.590 回答
0

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

于 2019-12-04T17:31:25.340 回答
0

只需删除从其他列派生的列,从逻辑上讲,您不需要在该列中插入值,系统将自动为该列派生值并插入特定记录

于 2017-08-10T10:05:02.233 回答