我想创建一个嵌入式 MySQL 数据库来运行测试,但我不知道该怎么做。
我正在使用 Perl,所以它需要用一种语言而不是几个命令来完成。
我一直在尝试加快我在 pl/pgsql 中编写的通用审计触发器的速度。更新时,它会生成正在更新的表中的列列表,并在审计表中插入记录任何更改的行(按表、列、之前的数据、之后的数据等)。跨多个表使用相同的触发器函数。
我正在尝试使用 pl/perl,因为它对于手头的任务似乎要快得多,但我似乎遇到了区分数据库中 NULL 和空字符串 ('') 值的问题。
在我看来,如果一列从 NULL 变为空字符串(反之亦然),这是我需要记录的更改。但是,使用可用的新/旧列引用 ($_TD->{new/old}{$columnName}),我似乎无法区分实际为空的列和包含空字符串的列。我知道为空的列正在被空和 undef 检查捕获,我知道的列也是空的。
if($_TD->{new}{$column} eq '') {
elog(NOTICE, "New value in column $column is empty");
}
if($_TD->{old}{$column} eq '') {
elog(NOTICE, "Old value in column $column is empty");
}
if($_TD->{new}{$column} eq undef) {
elog(NOTICE, "New value in column $column is not defined");
}
if($_TD->{old}{$column} eq undef) {
elog(NOTICE, "Old value in column $column is not defined");
}
Run Code Online (Sandbox Code Playgroud)
我怀疑我在这里做了一些愚蠢的事情,但也许我正在尝试做一些我根本无法做的事情。有什么建议吗?
编辑 - 使用 Postgres 8.4.4 的价值
编辑 - 在查看下面 filiprem …
我想创建一个像这样的字母数字序列:
AAAA0000
AAAA0001
AAAA0002
AAAA0003
.
.
.
AAAA9999
AAAB0000
AAAB0001
.
.
.
ZZZZ9999
Run Code Online (Sandbox Code Playgroud)
我创建了这个存储过程来做到这一点,但它太慢了:
CREATE OR REPLACE FUNCTION public.fn_batch_seq()
RETURNS text
LANGUAGE plpgsql
AS
$body$
DECLARE
v_sequence TEXT := '';
v_next_sequence TEXT := '';
v_existing_id BIGINT := 0;
BEGIN
/*
* VARCHAR BATCH SEQUENCE FOR SIMCARDS
*/
SELECT "sequence" FROM batch_sequence WHERE id = 1 INTO v_sequence;
IF v_sequence = '' THEN
RAISE NOTICE 'Error - No existe ningun registro en batch_sequence almacenado';
RETURN -500;
END IF;
SELECT …
Run Code Online (Sandbox Code Playgroud) 如何使用无限循环的 plperl 函数终止会话?
双方pg_terminate_backend
并pg_cancel_backend
没有任何影响。kill -1 pid
什么也没做,kill -9 pid
服务器崩溃了。
据我所知,temp_buffers
设置用于存储临时表数据的服务。
PGDATA
但是,当我创建了一个临时表时,会立即在主数据库中为其创建文件。因此,我希望能就几个问题得到帮助。
a.会发生什么
?临时表数据是否temp_buffers
足以存储临时表数据?
b. 临时表数据是否temp_buffers
不足以存储临时表数据?
是否存在temp_buffers
设置不足而导致溢出的情况pgsql_tmp
?
我觉得我的 SQL 连接一定有问题。我通常忽略了它,但我最终会尝试深入了解它。
my $dsn = "DBI:Oracle:host=$host;sid=$sid";
my $dbh = DBI->connect($dsn,$dbuser,$dbpass,{ RaiseError => 1,AutoCommit => 0 }) or die("Unable to connect: $DBI::errstr");
Run Code Online (Sandbox Code Playgroud)
每次跑步都需要 60 秒DBI->connect
。相当大的查询可能需要一些时间,网络延迟可能会导致一些延迟,但所有这些都超出了连接所需的 60 秒。我可以DBI->connect
在不实际运行查询的情况下直接运行然后立即关闭它,这将需要 60 秒。我可以使用不同的工具毫无问题地查询这个数据库,但是任何时候我DBI->connect
对它运行一个,都需要 60 秒。我的大多数查询返回的时间为 61.2 秒、63.4 秒或 65.3 秒。不管怎样,从脚本点击 DBI->connect 到它点击下一行的时间是 60 秒。我什至在之前和之后的行上给它加上了时间戳。时间戳之间的唯一内容是DBI->connect
.
我究竟做错了什么?