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