标签: plpgsql

如何启用PostgreSQL功能分析器?

我花了一段时间才弄清楚,几周前我在外语维基上找到了答案,这非常有帮助,所以我想我会分享.

postgresql profiling function plpgsql

12
推荐指数
1
解决办法
3386
查看次数

如何使用动态SQL设置复合变量字段的值

鉴于此类型:

-- Just for testing purposes:
CREATE TYPE testType as (name text)
Run Code Online (Sandbox Code Playgroud)

我可以使用此函数动态获取字段的值:

CREATE OR REPLACE FUNCTION get_field(object anyelement, field text) RETURNS text as
$BODY$
DECLARE
    value text;
BEGIN
    EXECUTE 'SELECT $1."' || field || '"'
      USING object
       INTO value;

    return value;
END;
$BODY$
LANGUAGE plpgsql
Run Code Online (Sandbox Code Playgroud)

呼叫get_field('(david)'::testType, 'name')按预期工作返回"大卫".

但是如何在复合类型中设置字段的值?我试过这些功能:

CREATE OR REPLACE FUNCTION set_field_try1(object anyelement, field text, value text)
RETURNS anyelement
as
$BODY$
DECLARE
    value text;
BEGIN
    EXECUTE '$1."' || field || '" := $2'
      USING object, value; …
Run Code Online (Sandbox Code Playgroud)

postgresql types stored-procedures composite plpgsql

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

声明变量set = select

这可能听起来像一个非常愚蠢的问题,但我如何声明一个用于PostgreSQL 9.3查询的变量?

CREATE or replace FUNCTION public.test()
  returns int4
AS
$BODY$
DECLARE    
    cod_process bigint :=30001;
    cod_instance bigint ;
    utc_log timestamp without time zone := localtimestamp;
    cod_log_type varchar(100) :='information ';
    txt_log_text varchar(100):= 'start process';
    txt_log varchar(100):= txt_log_text||'_'||cod_process;
    set cod_instance= select max(cod_instance) as cod_instance from public.instance where public.instance.cod_process=cod_process;    
BEGIN  
    INSERT INTO public.log (cod_process, cod_instance, utc_log,cod_log_type,txt_log)
    VALUES (cod_process, cod_instance, utc_log,cod_log_type,txt_log );
    RETURN 11;
END;
$BODY$ LANGUAGE 'plpgsql';
Run Code Online (Sandbox Code Playgroud)
ERROR: type "cod_instance" does not exist
SQL state: 42704
Character: 383
Run Code Online (Sandbox Code Playgroud)

postgresql variables set plpgsql declare

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

Postgresql JDBC表值参数

MSSQL有一个很棒的功能叫做Table Valued Parameters.它允许您将自定义数据表传递给存储过程和函数.

我想知道PostgreSQL中的等价物是什么,如果存在,使用JDBC?我知道将数组作为函数参数传递的选项,但这似乎仅限于PostgreSQL数据类型.

考虑以下PL/pgSQL代码:

CREATE  TYPE number_with_time AS(
_num   float,
_date  timestamp
);
Run Code Online (Sandbox Code Playgroud)

和这个函数头:

CREATE OR REPLACE FUNCTION myfunc(arr number_with_time[])
Run Code Online (Sandbox Code Playgroud)

任何人都可以使用JDBC驱动程序发布Java代码,使用用户定义数据类型的数组调用该函数吗?

java arrays postgresql jdbc plpgsql

12
推荐指数
2
解决办法
3445
查看次数

如何在触发器功能中使用变量设置?

我想在会话/事务中记录用户的id,使用SET,所以我以后可以在触发器函数中使用它来访问它current_setting.基本上,我正在尝试从之前发布的非常相似的票证中选择n2 ,区别在于我正在使用PG 10.1.

我一直在尝试3种设置变量的方法:

  • SET local myvars.user_id = 4,从而在交易中在本地设置;
  • SET myvars.user_id = 4从而将其设置在会话中;
  • SELECT set_config('myvars.user_id', '4', false),取决于最后一个参数,将是前两个选项的快捷方式.

它们都不能在触发器中使用,触发器NULL在获取变量时接收current_setting.这是我设计的用于对其进行故障排除的脚本(可以很容易地与postgres docker镜像一起使用):

database=$POSTGRES_DB
user=$POSTGRES_USER
[ -z "$user" ] && user="postgres"

psql -v ON_ERROR_STOP=1 --username "$user" $database <<-EOSQL
    DROP TRIGGER IF EXISTS add_transition1 ON houses;
    CREATE TABLE IF NOT EXISTS houses (
        id SERIAL NOT NULL,
        name VARCHAR(80),
        created_at TIMESTAMP WITHOUT TIME ZONE DEFAULT now(),
        PRIMARY KEY(id)
    );

    CREATE …
Run Code Online (Sandbox Code Playgroud)

postgresql global-variables plpgsql postgresql-triggers

12
推荐指数
3
解决办法
1905
查看次数

PostgreSQL - 尽管运行CREATE LANGUAGE,语言pgplsql仍然不存在

我只是尝试创建我的第一个plpgsql函数.执行脚本时,我明白了

错误:语言"'plpgsql'"不存在

然后我运行命令CREATE LANGUAGE plpgsql; 这显示以下错误:

错误:语言"plpgsql"已经存在

命令正在同一个数据库上运行.

问候

彼得

postgresql plpgsql

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

用于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
查看次数

如何使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
查看次数

在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万
查看次数