标签: plpgsql

无法在plpgsql函数中从动态命名的临时表中运行'select into'

我动态地命名临时表,将一些数据插入到这个动态命名的临时表中.但我无法将动态命名临时表中的数据恢复到函数变量来进行计算.如何从/用动态命名的临时表执行plpgsql函数中的'select into ....'?

drop table dummy;  
drop table mytable;  
create table dummy (id bigint,parent_id bigint);  
insert into dummy values(600,null);  
insert into dummy values(12,600);  
insert into dummy values(700,null);  

DROP FUNCTION total_test(bigint,text,text,date,bigint[],text);  
CREATE OR REPLACE FUNCTION total_test(bigint,text,text,date,dep bigint[],tname text)   RETURNS double precision AS '  
    DECLARE pid BIGINT;  
    DECLARE total DOUBLE PRECISION;  
    DECLARE array_len int;  
    DECLARE myDepIds bigint[];  
    BEGIN   
        IF dep IS NOT NULL THEN  
            total :=0;  
            array_len := array_upper(DEP, 1);  
            EXECUTE ''CREATE TEMPORARY TABLE  '' || tname || ''  (dep_id bigint )''; …
Run Code Online (Sandbox Code Playgroud)

sql postgresql plpgsql

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

使用%TYPE在PostgreSQL中声明复合类型的变量

问题:如何在存储函数中声明相同类型的变量参数?

简单的答案是使用%TYPE,这有效:

CREATE OR REPLACE FUNCTION test_function_1(param1 text)
  RETURNS integer AS
$BODY$ 
DECLARE
    myVariable param1%TYPE;
BEGIN
    return 1;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
Run Code Online (Sandbox Code Playgroud)

但问题是何时param1是复合类型:

CREATE TYPE comp_type as
(
    field1 text
)

CREATE OR REPLACE FUNCTION test_function_2(param1 comp_type)
  RETURNS integer AS
$BODY$ 
DECLARE
    myVariable param1%TYPE;
BEGIN
    return 1;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
Run Code Online (Sandbox Code Playgroud)

这不起作用:

ERROR: type comp_type does not exist [SQL State=42704]
Run Code Online (Sandbox Code Playgroud)

那么当param1复合型时我该怎么办?

(注意:myVariable comp_type因为我的功能稍微复杂一点, …

postgresql polymorphism types stored-procedures plpgsql

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

Postgres pl/pgsql错误:列"column_name"不存在

我有一个如下所示的storerd程序,

CREATE FUNCTION select_transactions3(text, text, int)    
RETURNS SETOF transactions AS   
$body$   
DECLARE    
    rec transactions%ROWTYPE;  
BEGIN
    FOR rec IN (SELECT invoice_no, trans_date FROM transactions WHERE $1 = $2 limit $3  )    
    LOOP     
        RETURN NEXT rec;    
    END LOOP;  
END;   
$body$  
LANGUAGE plpgsql VOLATILE SECURITY DEFINER;
Run Code Online (Sandbox Code Playgroud)

当我执行这样的查询时:

select * from select_transactions3("invoice_no", '1103300105472',10);
Run Code Online (Sandbox Code Playgroud)

要么

select * from select_transactions3(invoice_no, '1103300105472',10);
Run Code Online (Sandbox Code Playgroud)

它得到这样的错误: 错误:列"invoice_no"不存在

但是当我尝试用这样的一个冒号执行时:

select * from select_transactions3('invoice_no', '1103300105472',10);
Run Code Online (Sandbox Code Playgroud)

结果是没有行.

我怎么能得到这样的数据:

  invoice_no   |       trans_date        
---------------+-------------------------
 1103300105472 | 2011-03-30 12:25:35.694
Run Code Online (Sandbox Code Playgroud)

谢谢 .

更新:如果我们想要显示我们想要显示的某一列表

CREATE FUNCTION select_to_transactions14(_col character …
Run Code Online (Sandbox Code Playgroud)

postgresql stored-procedures plpgsql

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

SQL状态:42601语法错误在"11"或附近

我有一个表address_all,它由几个地址表继承.address_history从父表继承history_all并保留当前地址信息.我正在创建一个新表继承address_all表并将信息复制address_history到新表.

我的存储过程如下所示.我打电话时遇到一些错误.为了更好地解释错误,我正在使用行号.

1  CREATE OR REPLACE FUNCTION somefunc()
2  RETURNS void AS
3  $BODY$
4  DECLARE
5   year_id INTEGER;
6   month_id INTEGER;
7   week_id INTEGER;
8   addresstablename text; 
9   backupdays text;
10 BEGIN
11  week_id := EXTRACT(DAY FROM TIMESTAMP 'now()');
12  month_id := EXTRACT(MONTH FROM TIMESTAMP 'now()');
13  year_id := EXTRACT(YEAR FROM TIMESTAMP 'now()');
14  addresstablename := 'address_history_' || week_id || '_' || month_id || '_' || year_id;
15  backupdays:= …
Run Code Online (Sandbox Code Playgroud)

postgresql datetime dynamic-sql plpgsql

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

函数能否检测到触发事件类型?

我正在使用一个功能

CREATE FUNCTION myfunc() RETURNS trigger AS $$ ... $$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

带触发器,

    CREATE TRIGGER mycheck BEFORE INSERT OR UPDATE ON t
       FOR EACH ROW EXECUTE PROCEDURE myfunc();
Run Code Online (Sandbox Code Playgroud)

我现在的问题是在体内表达myfunc()关于事件的条件,像plpgsql一样

    IF TRIGGER_EVENT_WAS_INSERT THEN ...doThis... END IF;
Run Code Online (Sandbox Code Playgroud)

如何表达这种情况? (看到我有"INSERT OR UPDATE"触发事件)


我正在使用PostgreSQL v9.1.

postgresql triggers plpgsql

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

Postgres %%功能

此语句中的“ %%”是什么意思?

SELECT nextval(seq_name) %% 1024 INTO seq_id;
Run Code Online (Sandbox Code Playgroud)

当我使用Postgres时为什么会说呢?

operator does not exist: bigint %% integer
Run Code Online (Sandbox Code Playgroud)

sql postgresql plpgsql

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

创建引用不存在的表或列的SQL函数(尚)

我想通过psql在空数据库中加载一些SQL函数:

psql -d my_database -f fuctions.sql --set ON_ERROR_STOP=1 
Run Code Online (Sandbox Code Playgroud)

我使用--set ON_ERROR_STOP=1是因为如果脚本包含错误,我希望psql失败.

内容functions.sql是:

CREATE or REPLACE FUNCTION test_function() RETURNS INT AS $$
  SELECT id from test_table;
$$ LANGUAGE sql;
Run Code Online (Sandbox Code Playgroud)

我的问题是,psql检查test_table加载函数时是否存在并因此错误而失败:

ERROR:  relation "test_table" does not exist LINE 2: SELECT id from test_table;
Run Code Online (Sandbox Code Playgroud)

但我不希望psql检查表是否存在,因为我稍后会创建此表.

以下解决方法可行,但我无法使用它们:

  • 忽略错误.如果脚本包含ie sql语法错误,我希望psql退出时出错.
  • 使用plpgsql函数而不是sql.我当然可以,但简单的sql函数往往是最好的选择.
  • 首先创建表.我的真实场景实际上比这个例子更复杂.

postgresql plpgsql sql-function psql

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

Perl PostgreSQL查询执行两次

我试图理解它为什么会发生,但我找不到它.SQL查询执行两次.

我的一块脚本:

my $driver = "Pg"; # Driver Name
my $database = $ARGV[0]; # First argument will be database name
my $dsn = "DBI:$driver:dbname=$database;host=127.0.0.1;port=5432";
my $userid = $ARGV[1]; # second argument will be username
my $password = $ARGV[2]; # third argument will be passwd
my $dbh = DBI->connect($dsn,$userid,$password,  {RaiseError => 1 }) or die $DBI::errstr;

sub f_createUser {
    if (scalar @_ != 3 ) {
        return;
    }
    my $query = $dbh->prepare(qq{ SELECT createUserWithPassword(?,?) });
    #my $result = $dbh->do($query) < 0 …
Run Code Online (Sandbox Code Playgroud)

postgresql perl plpgsql

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

如何在PostgreSQL 9.6和更低版本中改组数组?

以下自定义存储功能 -

CREATE OR REPLACE FUNCTION words_shuffle(in_array varchar[])
        RETURNS varchar[] AS
$func$
        SELECT array_agg(letters.x) FROM 
        (SELECT UNNEST(in_array) x ORDER BY RANDOM()) letters;
$func$ LANGUAGE sql STABLE;
Run Code Online (Sandbox Code Playgroud)

在PostgreSQL 9.5.3中改组字符数组:

words=> select words_shuffle(ARRAY['a','b','c','d','e','f']);
 words_shuffle 
---------------
 {c,d,b,a,e,f}
(1 row)
Run Code Online (Sandbox Code Playgroud)

但是现在我切换到PostgreSQL 9.6.2后,该功能停止了工作:

words=> select words_shuffle(ARRAY['a','b','c','d','e','f']);
 words_shuffle 
---------------
 {a,b,c,d,e,f}
(1 row)
Run Code Online (Sandbox Code Playgroud)

可能是因为ORDER BY RANDOM()停止工作:

words=> select unnest(ARRAY['a','b','c','d','e','f']) order by random();
 unnest 
--------
 a
 b
 c
 d
 e
 f
(6 rows)
Run Code Online (Sandbox Code Playgroud)

我正在寻找一个更好的方法来改组字符数组,这可以在新的PostgreSQL 9.6中使用,但也可以在9.5中使用.

我需要它用于开发中的文字游戏,它使用Pl/PgSQL函数.

更新:

汤姆莱恩回复:

现在,在ORDER BY之后扩展目标列表中的SRF.所以ORDER BY正在排序一个虚拟行,然后在此之后发生不必要的行.看到

https://git.postgresql.org/gitweb/?p=postgresql.git&a=commitdiff&h=9118d03a8

sql postgresql shuffle plpgsql stored-functions

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

如何通过对象的属性对json或jsonb值内的数组中的对象进行排序?

我有这个pl/pgsql函数来聚合jsonb值(data_table_1和data_table_2)中两个表的行.fk_id是两个表中的常见外键ID:

DECLARE
v_my_variable_1 jsonb;
v_my_variable_2 jsonb;
v_combined      jsonb;
BEGIN
  SELECT json_agg( data_table_1 ) INTO v_my_variable FROM data_table_1 WHERE fk_id = v_id;
  SELECT json_agg( data_table_2 ) into v_my_variable_2 FROM data_table_2 WHERE fk_id = v_id;
  SELECT v_my_variable || v_my_variable_2 into v_combined;
Run Code Online (Sandbox Code Playgroud)

现在我想v_combined按字段排序,这ts是两个表共有的时间戳列,因此是jsonb值中所有数组对象的公共键.

例:

v_combined = '[{"id": 1, "type": 4, "param": 3, "ts": 12354355}
             , {"id": 1, "txt": "something", "args": 5, "ts": 12354345}]';
Run Code Online (Sandbox Code Playgroud)

如何v_combined按升序对数组元素进行排序ts?

如果我从桌子上选择,我可以简单地使用: …

postgresql json sql-order-by plpgsql jsonb

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