我们仍然是Postgres的新手,来自Microsoft Sql Server.
我们现在想要编写一些存储过程.好吧,在努力获得比hello world在pl/pgsql中工作更复杂的东西之后,我们认为如果我们要学习一种新语言我们也可以学习Python更好,因为我们在大约15分钟内得到相同的查询(注意,我们都不知道python).
所以与pl/psql相比,我有一些问题.
此外,我们的存储过程使用非常轻.现在我们只有4,但我们仍然试图从Sql Server特定的语法转换一些代码(例如变量,不能在存储过程之外的Postgres中使用)
我正在使用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自动为我生成?如果没有,是否有任何命令可以获取生成的游标名称?
我正在开发一个用PHP5编写的基于Web的应用程序,它基本上是一个基于数据库的UI.为了给用户提供一个更灵活的工具,我想嵌入一个脚本语言,这样他们就可以做更复杂的事情,如激发SQL查询,循环和在变量中存储数据等等.在我的业务领域,Python被广泛用于脚本编写,但我也在考虑制作一个简单的领域特定语言.该脚本必须包装我现有的PHP类.
我正在寻求有关如何处理此开发任务的建议?
更新:我将在PostgreSQL中使用PLPGSQL在数据库中尝试编写脚本.这样做现在,但我不能这样使用我的PHP类.Lua方法很有吸引力,似乎我想要的是什么(除了它不是Python).
我想获取一个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,我认为这是我问题的根源.
我想执行一个动态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中实现这一目标?
我有一个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函数不会将数据作为列返回?
该指令有效:
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 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) 我有一个包含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)
有可能阻止这种情况吗?
plpgsql ×10
postgresql ×9
sql ×3
dynamic-sql ×2
python ×2
arrays ×1
cursor ×1
dsl ×1
json ×1
php ×1
ref-cursor ×1
triggers ×1