小编drs*_*der的帖子

带有RETURNS TABLE(id整数)的PostgreSQL存储过程返回所有NULL

我在PostgreSQL 8.4中有一个存储过程,它根据作为参数传入的整数值调用另一个存储过程.调用那些存储过程,使它们返回一个整数列的关系.我遇到的问题是外部存储过程总是返回具有正确行数但具有所有id的NULL的关系.

这是存储过程简化为最简单的形式:

CREATE OR REPLACE FUNCTION spa(count integer) 
RETURNS TABLE (id integer) AS $$
BEGIN
    RETURN QUERY SELECT generate_series(1, count);
END;
$$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION spb(count integer) 
RETURNS TABLE (id integer) AS $$
BEGIN
    RETURN QUERY SELECT generate_series(1, count);
END;
$$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION conditional_relation_return(objectType integer, count integer) 
RETURNS TABLE (id integer) AS $$
BEGIN
    IF objectType = 1 THEN
        RETURN QUERY SELECT id FROM spa(count);
    ELSIF objectType = 2 OR objectType = …
Run Code Online (Sandbox Code Playgroud)

sql postgresql plpgsql

9
推荐指数
1
解决办法
2万
查看次数

在不使用CTE的情况下,是否存在逻辑等效且有效的查询版本?

我对postgresql 9.2系统有一个查询,它的正常形式大约需要20秒,但在使用CTE时只需要大约120ms.

为简洁起见,我简化了两个查询.

这是正常形式(大约需要20秒):

SELECT *
FROM tableA
WHERE (columna = 1 OR columnb = 2) AND
    atype = 35 AND
    aid IN (1, 2, 3)
ORDER BY modified_at DESC
LIMIT 25;
Run Code Online (Sandbox Code Playgroud)

以下是此查询的说明:http://explain.depesz.com/s/2v8

CTE表格(约120ms):

WITH raw AS (
    SELECT *
    FROM tableA
    WHERE (columna = 1 OR columnb = 2) AND
        atype = 35 AND
        aid IN (1, 2, 3)
)
SELECT *
FROM raw
ORDER BY modified_at DESC
LIMIT 25;
Run Code Online (Sandbox Code Playgroud)

以下是CTE的解释:http://explain.depesz.com/s/uxy

只需ORDER …

postgresql common-table-expression

8
推荐指数
1
解决办法
1729
查看次数

如何将可视选择的文本传递给UNIX命令,并将输出附加到Vim中的当前缓冲区

使用Vim,我正在尝试将在可视模式下选择的文本管道传输到UNIX命令,并将输出附加到当前文件的末尾.例如,假设我们有一个SQL命令,例如:

SELECT * FROM mytable;
Run Code Online (Sandbox Code Playgroud)

我想做类似以下的事情:

<ESC>
V                 " select text
:'<,'>!mysql -uuser -ppass mydb
Run Code Online (Sandbox Code Playgroud)

但是,我希望将输出附加到文件的末尾,而不是让输出覆盖当前选定的文本.你可能会看到它的发展方向.我正在使用Vim作为一个简单的SQL编辑器.这样,我不必让Vim进行编辑,调整,测试SQL代码.

sql vi vim editor

7
推荐指数
1
解决办法
3797
查看次数

为什么缺少主键/唯一键会导致upsert出现死锁问题?

我遇到了一个模式和一个导致死锁问题的upsert存储过程.我有一个大概的想法,为什么这会导致死锁以及如何解决它.我可以重现它,但我没有清楚地了解导致它的步骤顺序.如果有人能够清楚地解释为什么会造成僵局,那将会很棒.

这是架构和存储过程.此代码正在PostgreSQL 9.2.2上执行.

CREATE TABLE counters (                                                                                                                                                                                                                       
  count_type INTEGER NOT NULL,
  count_id   INTEGER NOT NULL,
  count      INTEGER NOT NULL
);


CREATE TABLE primary_relation (
  id INTEGER PRIMARY KEY,
  a_counter INTEGER NOT NULL DEFAULT 0
);

INSERT INTO primary_relation
SELECT i FROM generate_series(1,5) AS i;

CREATE OR REPLACE FUNCTION increment_count(ctype integer, cid integer, i integer) RETURNS VOID
AS $$
BEGIN
    LOOP
        UPDATE counters
         SET count = count + i 
         WHERE count_type = ctype AND count_id = cid;
         IF FOUND THEN
            RETURN; …
Run Code Online (Sandbox Code Playgroud)

sql database postgresql concurrency relational-database

7
推荐指数
1
解决办法
1899
查看次数

尾随数字对awk脚本的主体有什么影响?

我有一个简单的awk one衬里,当给定的模式匹配时,将下一行折叠到当前行上.这里是:

awk '/two/ { printf $1; next; } 1' test.txt 
Run Code Online (Sandbox Code Playgroud)

通过以下输入:

one
two
three
four
five
six

one
two
three 
four
Run Code Online (Sandbox Code Playgroud)

你得到:

one
twothree
four
five
six

one
twothree 
four
Run Code Online (Sandbox Code Playgroud)

请注意,"三"是折叠的"两个",这是我想要发生的.我找到了这个解决方案(不记得在哪里),并且认为尾随的"1"似乎是导致所需效果的缺失部分.如果你拿出来,你得到:

awk '/two/ { printf $1; next; }' test.txt 
twotwo
Run Code Online (Sandbox Code Playgroud)

作为结果.所以我的问题是,尾随的'1'做了什么,它在哪里记录?

谢谢!

unix awk text

5
推荐指数
1
解决办法
300
查看次数

为什么两个并发的删除+插入语句会在空表上死锁?

我很好奇为什么当主键不存在时,两个使用主键的并发语句会导致 MySQL 死锁DELETEINSERT该示例旨在以最简单的形式说明该问题。

这是设置。

> SELECT @@GLOBAL.tx_isolation, @@tx_isolation;
+-------------------------+------------------+
| @@GLOBAL.tx_isolation   | @@tx_isolation   |
|-------------------------+------------------|
| REPEATABLE-READ         | REPEATABLE-READ  |
+-------------------------+------------------+
1 row in set
Time: 0.002s

> select version();
+-------------+
| version()   |
|-------------|
| 5.7.12      |
+-------------+
1 row in set
Time: 0.002s

create table lock_test ( id int(11) not null, primary key (`id`) );
Run Code Online (Sandbox Code Playgroud)

下面,1>代表一个mysql终端,2>代表另一个终端。

1> begin;
1> delete from lock_test where id = 1;

2> begin; …
Run Code Online (Sandbox Code Playgroud)

mysql innodb database-deadlocks

5
推荐指数
1
解决办法
2971
查看次数

Capistrano:如何在多个项目deploy.rb文件中包含常用设置

这可能是一个新手红宝石问题.我有几个库和应用程序需要部署到几个不同的主机.所有应用程序和库将共享这些主机的一些常用设置 - 例如主机名,数据库服务器/用户/通道等.

我的目标是做一些事情:

cap host1 stage deploy
cap host2 stage deploy
cap host1 prod deploy
# ...
Run Code Online (Sandbox Code Playgroud)

我的问题是如何在所有deploy.rb文件中包含这些常用设置?更具体地说,我想创建一个我可以包含的rb文件,它包含一些常用设置和几个主机特定的任务定义:

set :use_sudo, false
# set some other options

task :host1 do
    role :app, "host1.example.com"
    role :web, "host1.example.com"
    role :db,  "host1.example.com", :primary => true

    set :rodb_host, "dbhost"
    set :rodb_user, "user"
    set :rodb_pass, "pass"
    set :rodb_name, "db"
 end

 task :host2 do
     #...
 end

deploy.task :carsala do
    transaction do
        setup
        update_code
        symlink
    end
end
Run Code Online (Sandbox Code Playgroud)

然后在我的所有deploy.rb文件中"包含"此文件,我在其中定义stage,prod等,并根据需要覆盖任何"常见"配置参数.任何建议,将不胜感激.我尝试了一些不同的东西,但是我从所有这些中获得了错误.

编辑:我试过了

require 'my_module'
Run Code Online (Sandbox Code Playgroud)

但我得到错误抱怨未定义的任务对象.

ruby deployment capistrano

4
推荐指数
1
解决办法
4971
查看次数

是否可以使用clojure.java.jdbc修补从文件中加载SQL语句?

我需要能够在clojure中使用多个SQL语句加载和执行文件。例如,假设我有一个包含以下语句的文件:

ALTER TABLE bla...;
ALTER TABLE foo...;
UPDATE bla SET ...;
UPDATE foo SET ...;
ALTER TABLE bla DROP...;
ALTER TABLE foo DROP...;
Run Code Online (Sandbox Code Playgroud)

您就知道了-一个包含许多以分号终止的语句的文件。

我目前在尝试使用时遇到以下错误do-commands

PSQLException org.postgresql.util.PSQLException: Too many update results were returned.
Run Code Online (Sandbox Code Playgroud)

postgresql jdbc clojure

3
推荐指数
1
解决办法
1089
查看次数

用Monadic方法估算Scala中的PI

我正在尝试了解如何在scala中利用monad来解决简单的问题,以增强我的熟悉度。一个简单的问题是使用函数随机数生成器估算PI。我将在下面的代码中包含一个基于流的简单方法。

我正在寻求帮助,以将其转换为单子方法。例如,是否有惯用的方法以安全的方式将此代码转换为使用状态(和其他monad)?

trait RNG {
    def nextInt: (Int, RNG)
    def nextDouble: (Double, RNG)
}

case class Point(x: Double, y: Double) {
    val isInCircle = (x * x + y * y) < 1.0
}

object RNG {
    def nonNegativeInt(rng: RNG): (Int, RNG) = {
      val (ni, rng2) = rng.nextInt
      if (ni > 0) (ni, rng2)
      else if (ni == Int.MinValue) (0, rng2)
      else (ni + Int.MaxValue, rng2)
    }

    def double(rng: RNG): (Double, RNG) = {
      val (ni, rng2) = nonNegativeInt(rng) …
Run Code Online (Sandbox Code Playgroud)

monads scala scala-cats

3
推荐指数
1
解决办法
86
查看次数