我动态地命名临时表,将一些数据插入到这个动态命名的临时表中.但我无法将动态命名临时表中的数据恢复到函数变量来进行计算.如何从/用动态命名的临时表执行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) 问题:如何在存储函数中声明相同类型的变量参数?
简单的答案是使用%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因为我的功能稍微复杂一点, …
我有一个如下所示的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) 我有一个表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) 我正在使用一个功能
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.
此语句中的“ %%”是什么意思?
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) 我想通过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加载函数时是否存在并因此错误而失败:
Run Code Online (Sandbox Code Playgroud)ERROR: relation "test_table" does not exist LINE 2: SELECT id from test_table;
但我不希望psql检查表是否存在,因为我稍后会创建此表.
以下解决方法可行,但我无法使用它们:
我试图理解它为什么会发生,但我找不到它.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) 以下自定义存储功能 -
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
我有这个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?
如果我从桌子上选择,我可以简单地使用: …
plpgsql ×10
postgresql ×10
sql ×3
datetime ×1
dynamic-sql ×1
json ×1
jsonb ×1
perl ×1
polymorphism ×1
psql ×1
shuffle ×1
sql-function ×1
sql-order-by ×1
triggers ×1
types ×1