Sql 验证数据库插入的最佳方法

Sql 验证数据库插入的最佳方法,sql,oracle,Sql,Oracle,我有一个使用导出文件并将数据插入数据库的进程 作为测试过程的一部分,我为每次插入创建了一个SQL脚本。因此,如果该值存在,我将返回结果,如果不存在,则不返回结果。我将使用批处理文件来运行我的所有1000个文件,并查看结果 再仔细想想,有没有更好的方法来测试这一点?我想象的情况是,所有语句都失败,并返回一个空输出,这并不太有用 是否有一种方法可以进行反向操作,以便如果该值确实存在,则返回Null,如果不存在,则返回数据库中的内容?我认为从调试的角度来看,这个选项会更有用 对其他建议也持开放态度。我

我有一个使用导出文件并将数据插入数据库的进程

作为测试过程的一部分,我为每次插入创建了一个SQL脚本。因此,如果该值存在,我将返回结果,如果不存在,则不返回结果。我将使用批处理文件来运行我的所有1000个文件,并查看结果

再仔细想想,有没有更好的方法来测试这一点?我想象的情况是,所有语句都失败,并返回一个空输出,这并不太有用

是否有一种方法可以进行反向操作,以便如果该值确实存在,则返回Null,如果不存在,则返回数据库中的内容?我认为从调试的角度来看,这个选项会更有用

对其他建议也持开放态度。我使用的SQL语句非常基本


如果这对我处理Oracle SQL有帮助的话

是的,使用Oracle确实会有所不同,您使用的客户端语言是什么?如果您仅使用Oracle和SQLPlus,则可以将错误处理添加到脚本中-阅读SQLPlus文档了解如何-


否则,您将不得不使用您的客户端语言引发异常,并记录或处理它。

既然您在征求建议,下面是我的建议:

编写一个存储过程来执行insert语句。从客户端语言VBA代码调用存储过程。使用存储过程还将提供一些性能优势,但这是次要的

在我的示例中,我有一个写入test_insert表的存储进程。如果插入失败,它将向ti_logerrors表写入一条记录。您需要从VBA代码中调用存储过程

例如: 主表:

记录表:

存储过程:


在PL/SQL中执行您建议的操作将很容易,在vb中也是可能的,但本质上

declare
  cursor c_check_exists(p_pk number) is 
  select 'x'
  from table
  where table_id = p_pk;

  l_check_exists varchar2(1);
begin
  -- loop through all the things you want to check (look up pl/sql for loop)
  open c_check_exists(l_pk);
  fetch c_check_exists into l_check_exists;
  if c_check_exists%NOTFOUND then 
    -- doens't exist, run your process create a procedure for this
  else
    -- any logging you want to do e.g. dbms_output.put_line('l_pk: '||l_pk||' exists');
  end if;
end;

上面那个说存储过程会更快的家伙有时是真的,当pl/sql在服务器上执行时,您可能会消除网络流量,并且可以非常快地运行sql,并且可能更能够消除上下文切换-请参见

我不确定您所说的客户机语言是什么意思。我将VBA与SQL结合使用。我的脚本中不会出现任何错误,我只会得到一个空结果,因为该值在我的数据库中不存在。在生成任何SQL之前,直接在导出文件本身上运行一些测试怎么样?“使用存储过程也会提供一些性能优势”-您能为该语句提供一些依据吗?为什么你的程序是自主的?这比使用更好吗?该过程的自治性质是记录错误,即使插入失败和/或事务由客户端VBA脚本控制。数据库的内置功能始终是进行操作的最佳方式。
CREATE TABLE ti_logerrors 
  ( 
     logtime DATE, 
     logdesc VARCHAR2(4000) 
  ) 
CREATE OR replace PROCEDURE Proc_testinsert(tdesc IN VARCHAR2, 
                                            ttime IN DATE) 
IS 
  PRAGMA autonomous_transaction; 
BEGIN 
    INSERT INTO test_insert 
    VALUES     (my_seq.NEXTVAL, 
                tdesc, 
                ttime); 
EXCEPTION 
  WHEN OTHERS THEN 
             INSERT INTO ti_logerrors 
             VALUES     (SYSDATE, 
                         Nvl(tdesc, 'NULL') 
                         || ' HAS FAILED. '); 

             COMMIT; 
END; 
declare
  cursor c_check_exists(p_pk number) is 
  select 'x'
  from table
  where table_id = p_pk;

  l_check_exists varchar2(1);
begin
  -- loop through all the things you want to check (look up pl/sql for loop)
  open c_check_exists(l_pk);
  fetch c_check_exists into l_check_exists;
  if c_check_exists%NOTFOUND then 
    -- doens't exist, run your process create a procedure for this
  else
    -- any logging you want to do e.g. dbms_output.put_line('l_pk: '||l_pk||' exists');
  end if;
end;