标签: plpgsql

用于PostgreSQL的Python存储过程

我们仍然是Postgres的新手,来自Microsoft Sql Server.

我们现在想要编写一些存储过程.好吧,在努力获得比hello world在pl/pgsql中工作更复杂的东西之后,我们认为如果我们要学习一种新语言我们也可以学习Python更好,因为我们在大约15分钟内得到相同的查询(注意,我们都不知道python).

所以与pl/psql相比,我有一些问题.

  1. pl/Pythonu比pl/pgsql慢吗?
  2. 对于如何使用它编写好的存储过程,有什么"好的"参考吗?Postgres文档中的五个短页并没有真正告诉我们.
  3. 查询准备怎么样?应该一直使用吗?
  4. 如果我们将SD和GD数组用于大量查询计划,它是否会过满或对服务器产生负面影响?如果它太满了会自动删除旧值吗?
  5. 有没有希望它成为一种值得信赖的语言?

此外,我们的存储过程使用非常轻.现在我们只有4,但我们仍然试图从Sql Server特定的语法转换一些代码(例如变量,不能在存储过程之外的Postgres中使用)

python postgresql stored-procedures plpgsql

11
推荐指数
1
解决办法
4975
查看次数

调用返回refcursor的函数

我正在使用Postgresql 8.3并具有以下简单函数,它将返回refcursor 给客户端

CREATE OR REPLACE FUNCTION function_1() RETURNS refcursor AS $$
DECLARE
        ref_cursor REFCURSOR;
BEGIN
        OPEN ref_cursor FOR SELECT * FROM some_table;
        RETURN (ref_cursor);    
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

现在,我可以使用以下SQL命令来调用此函数并操纵返回的游标,但游标名称由PostgreSQL自动生成

BEGIN;
SELECT function_1();  --It will output the generated cursor name , for example , "<unnamed portal 11>" ;
FETCH 4   from  "<unnamed portal 11>"; 
COMMIT;
Run Code Online (Sandbox Code Playgroud)

此外,明确声明游标名称作为函数的输入参数,如 38.7.3.5所述.返回游标.可以声明我自己的游标名称并使用此游标名称来操作返回的游标而不是Postgresql自动为我生成?如果没有,是否有任何命令可以获取生成的游标名称?

sql postgresql plpgsql cursor ref-cursor

11
推荐指数
2
解决办法
3万
查看次数

在PHP Web应用程序中嵌入python/dsl以进行脚本编写

我正在开发一个用PHP5编写的基于Web的应用程序,它基本上是一个基于数据库的UI.为了给用户提供一个更灵活的工具,我想嵌入一个脚本语言,这样他们就可以做更复杂的事情,如激发SQL查询,循环和在变量中存储数据等等.在我的业务领域,Python被广泛用于脚本编写,但我也在考虑制作一个简单的领域特定语言.该脚本必须包装我现有的PHP类.

我正在寻求有关如何处理此开发任务的建议?

更新:我将在PostgreSQL中使用PLPGSQL在数据库中尝试编写脚本.这样做现在,但我不能这样使用我的PHP类.Lua方法很有吸引力,似乎我想要的是什么(除了它不是Python).

php python dsl plpgsql

11
推荐指数
1
解决办法
516
查看次数

Unnest阵列一级

我想获取一个n维度数组和包含n-1维数组行的返回集.例如,获取数组ARRAY[[1,2,3], [4,5,6], [7,8,9]]并返回一个集合{1,2,3}, {4,5,6}, {7,8,9}.使用unnest返回集合1,2,3,4,5,6,7,8,9.

我尝试从PostgreSQL 8.4中获取不需要的函数,这似乎就像我正在寻找的那样:

CREATE OR REPLACE FUNCTION tstng.unnest2(anyarray)
    RETURNS SETOF anyelement
    LANGUAGE plpgsql
    IMMUTABLE
    AS $$
    BEGIN
            RETURN QUERY SELECT $1[i]
                FROM generate_series(array_lower($1,1), array_upper($1,1)) i;
        END;
    $$;
Run Code Online (Sandbox Code Playgroud)

但是,SELECT tstng.unnest2(ARRAY[[1,2,3], [4,5,6], [7,8,9]]);返回集合, ,(即:3个空行).

我还发现SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[0];返回null,我认为这是我问题的根源.

arrays postgresql plpgsql

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

动态SQL(EXECUTE)作为IF语句的条件

我想执行一个动态SQL语句,其返回值是IF语句的条件:

IF EXECUTE 'EXISTS (SELECT 1 FROM mytable)' THEN
Run Code Online (Sandbox Code Playgroud)

这会产生错误ERROR: type "execute" does not exist.

是否可以这样做,或者是否有必要在IF语句之前执行SQL变量,然后将变量检查为条件?

postgresql dynamic-sql plpgsql

11
推荐指数
2
解决办法
3万
查看次数

如何使PostgreSQL在从另一个表中删除时向表中插入一行?

我们有一个应用程序,它将根据用户请求从表中删除一行.我无法更改应用程序代码.但是,我想根据要删除的行的信息,使用来自其他几个表的信息将一行插入另一个表(有点像日志日志).

我如何在PostgreSQL中实现这一目标?

postgresql triggers plpgsql

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

Postgres函数返回表不返回列中的数据

我有一个Postgres函数返回一个表:

CREATE OR REPLACE FUNCTION testFunction() RETURNS TABLE(a int, b int) AS
$BODY$
DECLARE a int DEFAULT 0;
DECLARE b int DEFAULT 0;
BEGIN
CREATE TABLE tempTable AS SELECT a, b;
RETURN QUERY SELECT * FROM tempTable; 
DROP TABLE tempTable;
END;
$BODY$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

此函数不以行和列形式返回数据.相反,它返回数据为:

(0,0)
Run Code Online (Sandbox Code Playgroud)

这导致Coldfusion cfquery块在提取数据时出现问题.从此函数返回表时,如何获取行和列中的数据?换句话说:为什么PL/pgSQL函数不会将数据作为列返回?

sql postgresql plpgsql postgresql-9.1

11
推荐指数
2
解决办法
8362
查看次数

SELECT INTO有多个归因

该指令有效:

SELECT INTO unsolvedNodes array_agg(DISTINCT idDestination)
FROM road 
WHERE idOrigin = ANY(solvedNodes)
AND NOT (idDestination = ANY(solvedNodes));
Run Code Online (Sandbox Code Playgroud)

但我想用这种方式:

SELECT INTO unsolvedNodes array_agg(DISTINCT idDestination), lengths array_agg(length)
FROM road
WHERE idOrigin = ANY(solvedNodes)
AND NOT (idDestination = ANY(solvedNodes));
Run Code Online (Sandbox Code Playgroud)

如何只使用一个"SELECT INTO"指令来设置多个变量?

sql postgresql plpgsql variable-assignment

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

从PostgreSQL函数返回SETOF行

我有一种情况,我想在两个视图之间返回连接.那是很多专栏.在sql server中很容易.但是在PostgreSQL中我加入时.我收到错误"需要列定义列表".

有什么方法可以绕过这个,我不想提供返回列的定义.

CREATE OR REPLACE FUNCTION functionA(username character varying DEFAULT ''::character varying, databaseobject character varying DEFAULT ''::character varying)
  RETURNS SETOF ???? AS
$BODY$
Declare 
SqlString varchar(4000) = '';
BEGIN
IF(UserName = '*') THEN
   Begin
   SqlString  := 'select * from view1 left join ' + databaseobject  + ' as view2 on view1.id = view2.id';
   End;
ELSE
    Begin
    SqlString := 'select * from view3 left join ' + databaseobject  + ' as view2 on view3.id = view2.id';
    End;
END IF; 
execute …
Run Code Online (Sandbox Code Playgroud)

postgresql dynamic-sql plpgsql postgresql-9.2

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

在Postgres中防止'json类型的'无效输入语法'

我有一个包含JSON和计划文本的文本列.我想将其转换为JSON,然后选择一个特定的属性.例如:

user_data
_________
{"user": {"name": "jim"}}
{"user": {"name": "sally"}}
some random data string
Run Code Online (Sandbox Code Playgroud)

我试过了:

select user_data::json#>'{user,name}' from users
Run Code Online (Sandbox Code Playgroud)

我明白了:

ERROR:  invalid input syntax for type json
DETAIL:  Token "some" is invalid.
CONTEXT:  JSON user_data, line 1: some...
Run Code Online (Sandbox Code Playgroud)

有可能阻止这种情况吗?

postgresql json plpgsql

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