2016-09-13 73 views
0

我已经创建了以下函数来检查日期是否以有效格式存在。为什么没有数据插入这个存储的pl/sql

create or replace function dt_valid(p_dstrng in varchar2, 
            p_dfmt in varchar2) return boolean is 
    v_dtval date; 
begin 
    v_dtval := TO_DATE (p_dstrng, p_dfmt); 
    return True; 
exception 
    when OTHERS then 
    return False; 
end; 

该函数是从PL被叫/ SQL 该过程从表tmp_to_dest获取的元数据信息,并且如果它获取字段是日期(通过柱transform_function =“txt2dtf”标识)它检查格式“DD-MON -YY'表中的该列的所有行都对表temp_med中的所有列都相同。如果该格式不存在,则应将行插入data_quality_chk中。

create or replace procedure data_quality_check (id number default null) as 
X varchar2(4000); 
begin 
for o in (select temp_field_name,dest_field_name,transform_function from TMP_TO_DEST) 
loop 
    if o.transform_function = 'text2df' then 
/// fetches the column name from metadata table TMP_TO_DEST and than loop through for each column to check for valid date 
    for m in (select o.temp_field_name temp_field_name from TEMP_COLUMNS) 
    loop 
    if not dt_valid(m.temp_field_name, 'DD-MON-YY') then 
    execute immediate 'insert into data_quality_chk values(X,''1'',''1'',''1'',''1'') ' ; 
    commit; 
    END IF; 
    end loop; 
    end if; 
end loop; 
end data_quality_check; 

/// fetches the column name from metadata table TMP_TO_DEST and than loop through for each column to check for valid date 

如果我执行上面的过程,没有任何输出显示没有任何行插入。 我在这里做错了什么?

+0

所有的人都可以通过看它是它充满了像一个日期验证功能奇怪的事情被应用到列名告诉(或“场”的名字,不管那些是),冗余'执行immediate'可不工作,嵌套循环中的commit,以及为了可读性而格式化代码的尝试很少。也许'TMP_TO_DEST'中没有数据?也许真正的程序有'when others'异常处理程序?谁知道? –

回答

0

也许有错误的行:

if o.transform_function = 'text2df' then 

试图改变这样的:

if o.transform_function = 'text2dtf' then 
+0

没有那么好,我检查了它。 – jackandjill

0

我不知道如果代码实际上是运行怎么我可以看到一些错误都你功能和你的过程。请参阅修订的代码。

您可以如下更改功能:

create or replace function dt_valid(p_dstrng in varchar2, 
             p_dfmt in varchar2) 
    return number is 
    v_dtval date; 
    begin 

    v_dtval := TO_DATE (p_dstrng, p_dstrng); 

     return 0; 
    exception 
     when OTHERS then 
     return 1; 
    end; 

电话:

select dt_valid('12-SEP-16', 'DD-MON-YY') from dual; 

输出

SQL> select dt_valid('12-SEP-16', 'DD-MON-YY') from dual; 

DT_VALID('12-SEP-16','DD-MON-YY') 
--------------------------------- 
           0 

然后用从温控功能的回报在任何你的程序就位布尔值。

CREATE OR REPLACE PROCEDURE data_quality_check (id NUMBER DEFAULT NULL) 
AS 
    X VARCHAR2 (4000); 
BEGIN 
    FOR o IN (SELECT temp_field_name, dest_field_name, transform_function 
       FROM TMP_TO_DEST) 
    LOOP 
    IF lower(o.transform_function) = 'text2df' 
     THEN 
     for m in (select temp_field_name temp_field_name from TEMP_COLUMNS) ---Must be throwing error coz of o.temp_field_name. O is not alaised to anything 
      loop 
      if dt_valid(m.temp_field_name, 'DD-MON-YY') = 0 then 
       execute immediate 'insert into data_quality_chk values(''X'',''1'',''1'',''1'',''1'') '; 

      END IF; 
      end loop; 
    end if; 
    end loop; 
commit; 
END data_quality_check; 
相关问题