我在写一个plpgsql脚本。 我想从二维数组中逐个获取数组内容。 DECLARE m varchar[]; arr varchar[][] := array[['key1','val1'],['key2','val2']]; BEGIN for m in select arr LOOP raise NOTICE '%',m; END LOOP; END; 但是上面的代码返回 {{key1,val1},{key2,val2}} 在一行中。 我想能够循环,并调用另一个函数,它需要像这样的参数: another_func(key1,val1)
它一定很简单,但我正在做我的第一步到Postgres函数,我找不到任何工作… 我想创build一个函数,将修改表和/或列,我找不到指定我的表和列作为我的函数参数的正确方法。 就像是: CREATE OR REPLACE FUNCTION foo(t table) RETURNS void AS $$ BEGIN alter table t add column c1 varchar(20); alter table t add column c2 varchar(20); alter table t add column c3 varchar(20); alter table t add column c4 varchar(20); END; $$ LANGUAGE PLPGSQL; select foo(some_table) 在另一种情况下,我想有一个函数来改变某个表的某个列: CREATE OR REPLACE FUNCTION foo(t table, […]
使用PostgreSQL 9.0。 比方说,我有一张包含company , profession和year的表格。 我想返回一个结果,其中包含独特的公司和行业,但基于数字序列聚合(到一个数组是罚款)年: 示例表: +—————————–+ | company | profession | year | +———+————+——+ | Google | Programmer | 2000 | | Google | Sales | 2000 | | Google | Sales | 2001 | | Google | Sales | 2002 | | Google | Sales | 2004 | | Mozilla | Sales […]
(免责声明:PostgreSQL新手。) 好的,据我所知,我的function与我所见过的样品非常相似。 有人能告诉我如何让这个工作? create or replace function get_user_by_username( username varchar(250), online boolean ) returns setof record as $$ declare result record; begin if online then update users set last_activity = current_timestamp where user_name = username; end if; return query select user_id, user_name, last_activity, created, email, approved, last_lockout, last_login, last_password_changed, password_question, comment from users where user_name […]
这是plpgsql函数的一个变体, 它返回多个被多次调用的列 。 但是,我希望find一个解决我的特定情况。 我有一个函数,用给定的参数处理行数组,并返回一组行+一个新的列。 CREATE OR REPLACE foo(data data[], parameter int) RETURNS SETOF enhanceddata AS … 该function仅对一组数据有效 SELECT * FROM foo( (SELECT ARRAY_AGG(data) FROM datatable GROUP BY dataid WHERE dataid = something), 1) 但我想使它与多组数据一起工作,而不将数据传递给函数。 我尝试了一些变化: SELECT dataid, (foo(ARRAY_AGG(data)),1).* FROM dataset WHERE dataid = something — only testing on 1 GROUP BY dataid 但是这个函数被每一列调用一次。
我的最后一个问题传递一个数组存储到postgres是有点不清楚。 现在,澄清我的目标: 我想创build一个Postgres存储过程,它将接受两个input参数。 其中一个是一些金额的列表,例如(100, 40.5, 76) ('01-2222-05','01-3333-04','01-4444-08') (100, 40.5, 76) ,另一个是一些发票清单 ('01-2222-05','01-3333-04','01-4444-08') 。 之后,我想使用这两个数字和字符列表,并与他们做一些事情。 例如,我想从这个数组中获取每个金额,并将其分配给相应的发票。 在Oracle中类似这样的东西: SOME_PACKAGE.SOME_PROCEDURE ( 789, SYSDATE, SIMPLEARRAYTYPE ('01-2222-05','01-3333-04','01-4444-08'), NUMBER_TABLE (100,40.5,76), 'EUR', 1, P_CODE, P_MESSAGE); 当然,这两种typesSIMPLEARRAYTYPE和NUMBER_TABLE是在DB中定义的。
在数据库开发中是非常新的,所以我对我的下面的例子有一些怀疑: 函数f1() – 语言sql create or replace function f1(istr varchar) returns text as $$ select 'hello! '::varchar || istr; $$ language sql; 函数f2() – 语言plpgsql create or replace function f2(istr varchar) returns text as $$ begin select 'hello! '::varchar || istr; end; $$ language plpgsql; 这两个函数可以被称为select f1('world')或select f2('world') 。 如果我调用select f1('world') , 输出将是: `hello! world` […]
鉴于这种types: — Just for testing purposes: CREATE TYPE testType as (name text) 我可以用这个函数dynamic地获得一个字段的值: 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 调用get_field('(david)'::testType, 'name')按照预期返回“david”。 但是,我怎样才能设置复合types的字段的值? 我试过这些function: CREATE OR REPLACE FUNCTION set_field_try1(object […]
我经常需要在重build之前从我的PostgreSQL数据库中删除所有的数据。 我将如何直接在SQL中做到这一点? 目前我已经设法提出了一条SQL语句,它返回我需要执行的所有命令: SELECT 'TRUNCATE TABLE ' || tablename || ';' FROM pg_tables WHERE tableowner='MYUSER'; 但是我看不到一种方法来一旦我拥有它们就可以通过编程来执行它们。
我不知道如何实现如下内容: CREATE OR REPLACE FUNCTION fnJobQueueBEFORE() RETURNS trigger AS $$ DECLARE shadowname varchar := TG_TABLE_NAME || 'shadow'; BEGIN INSERT INTO shadowname VALUES(OLD.*); RETURN OLD; END; $$ LANGUAGE plpgsql; 即将值插入到具有dynamic生成名称的表中。 执行上面的代码产生: ERROR: relation "shadowname" does not exist LINE 1: INSERT INTO shadowname VALUES(OLD.*) 它似乎build议variables不扩展/允许作为表名称。 我在Postgres手册中找不到这个参考。 我已经用EXECUTE试验过了,如下所示: EXECUTE 'INSERT INTO ' || quote_ident(shadowname) || ' VALUES ' […]