使用SQL处理和加载到目标表时出错

使用SQL处理和加载到目标表时出错,sql,oracle,Sql,Oracle,我今天有一个场景,我有点累了。在我的源Oracle源表中有如下数据(示例数据) 现在,第二行中的工资为负值,第三行中的生日格式无效(有效格式为MM/dd/yyyy)。第二行和第三行都应转到无效的\u员工,第一条记录应转到有效的\u员工。在源文件中,日期格式为dd/mm/yyyy。我必须将其转换为MM/dd/yyyy格式,还必须检查源文件中传入的日期格式是否为dd/MM/yyyy。薪资不应低于0。源表中的所有列均为字符串,目标表中的ID为整数,名称为VARCHAR2(255),薪水为数字,生日为日

我今天有一个场景,我有点累了。在我的源Oracle源表中有如下数据(示例数据)

现在,第二行中的工资为负值,第三行中的生日格式无效(有效格式为MM/dd/yyyy)。第二行和第三行都应转到无效的\u员工,第一条记录应转到有效的\u员工。在源文件中,日期格式为dd/mm/yyyy。我必须将其转换为MM/dd/yyyy格式,还必须检查源文件中传入的日期格式是否为dd/MM/yyyy。薪资不应低于0。源表中的所有列均为字符串,目标表中的ID为整数,名称为VARCHAR2(255),薪水为数字,生日为日期。
我已经在我的项目ETL工具中处理了所有这些。因此,我尝试在查询中推动所有这些以提高性能。非常感谢任何帮助

尽管错误记录最好由执行插入的进程处理,但在许多情况下,这可能无法做到。 相反,您现在可以做的是为Salary列在表上设置约束。日期检查可以通过简单地使用日期数据类型的列来实现。然后创建一个错误记录表来记录错误

现在我们需要一个表来记录您的无效记录。为此,您有两种选择。 您可以将
INVALID_EMPLOYEES
表本身作为错误表。但这意味着在表中有额外的列(
ORA\u ERR\u MESG$
ORA\u ERR\u TAG$

如果不选择增加列,则可以创建一个专用错误表,然后将记录从此表移动到
INVALID_EMPLOYEES
表中。您必须编写一些在插入代码之后运行的代码来移动记录

请参阅软件包以了解如何创建错误日志记录表

一旦创建了错误记录表,就必须指示代码将错误记录到错误记录表中。这将确保所有有效记录都插入到employees表中,而无效记录则进入error表,其中包含一列,该列存储插入特定记录时遇到的错误。所以你的插入代码看起来像

INSERT INTO VALID_EMPLOYEES
    SELECT ID,
             NAME,
             SALARY,
             BIRTHDAY
      FROM my_source_table
          LOG ERRORS INTO INVALID_EMPLOYEES ('Oops this guy failed');
在本例中,“Oops this guy failed”将进入错误表的
ORA\u ERR\u TAG$
列。可以使用此标记列标识尝试插入无效记录的不同insert语句


希望有帮助

您的问题是“如何使用SQL查询实现这些验证”?如果没有,请描述你的问题。你好,史瑞克,是的,我的问题是。如何使用sql查询以及加载和转换为相应的数据类型来实现此验证。因为我的项目ETL工具提供的帮助太差了,为什么第一行应该转到
valid\u employee
,即使它的生日是
dd/mm/yyyyy
格式?嗨,Arijit,是的,我们有专用的错误表,其中所有数据类型都是与我的源表匹配的字符串。如果这是我的原始数据ID,姓名,薪水,生日1,阿比吉特,2000年,17/12/1990 2,罗希特,-2000年,15/09/1988 3,莫希特,5002075-575-43 4,肖恩,-700,15/10/1989然后我将如何编写我的查询,将第2行和第4行移动到ERROR_表,这是Negative Salary,第3行移动到ERROR表,因为这也是无效日期的无效记录由
DBMS_ERRLOG
package创建的errorlog表的所有列都是VARCHAR2(4000)。因此,您可以删除现有的错误日志表并使用DBMS_ERRLOG包重新创建它,也可以创建一个专用的错误日志表,然后将记录从该表移动到错误日志表。在主插入之后,这将是一个单独的插入。Arijit,Soumitra,你能至少给出一个如何使用负值检查构造这个sql的想法吗?我将在我的ETL中处理这个日期case@Abhijit,如果我理解正确,您需要处理源中的所有数据,并将其加载到目标表中,包括无效记录。所以,您只需要一种机制(SQL查询)来识别无效记录并将其推送到错误表中?如果我的理解是正确的,我建议您应该在目标表中有一个标志列(例如:validation_Flag),它将根据您的验证结果保存真/假值。让我知道这是不是你想要的?稍后我会建议您对无效案例进行SQL查询。您好@Mayank,是的。但是我的实际目标表没有任何标志。可能是任何具有标识实际记录和无效记录的临时表。是的。你能为sql查询提供指导吗
INSERT INTO VALID_EMPLOYEES
    SELECT ID,
             NAME,
             SALARY,
             BIRTHDAY
      FROM my_source_table
          LOG ERRORS INTO INVALID_EMPLOYEES ('Oops this guy failed');