我试图integer[]
在plpgsql函数中循环遍历整数数组().像这样的东西:
declare
a integer[] = array[1,2,3];
i bigint;
begin
for i in a
loop
raise notice "% ",i;
end loop;
return true;
end
Run Code Online (Sandbox Code Playgroud)
在我的实际用例中,整数数组a
作为参数传递给函数.我收到此错误:
Run Code Online (Sandbox Code Playgroud)ERROR: syntax error at or near "$1" LINE 1: $1
如何正确循环数组?
我需要一个Postgres函数来返回一个带有自定义内容的虚拟表(就像在Oracle中一样).该表将有3列和未知行数.
我在互联网上找不到正确的语法.
想象一下:
CREATE OR REPLACE FUNCTION "public"."storeopeninghours_tostring" (numeric)
RETURNS setof record AS
DECLARE
open_id ALIAS FOR $1;
returnrecords setof record;
BEGIN
insert into returnrecords('1', '2', '3');
insert into returnrecords('3', '4', '5');
insert into returnrecords('3', '4', '5');
RETURN returnrecords;
END;
Run Code Online (Sandbox Code Playgroud)
这怎么写的正确?
我是数据库开发的新手,所以我对以下示例有些怀疑:
函数f1() - 语言sql
create or replace function f1(istr varchar) returns text as $$
select 'hello! '::varchar || istr;
$$ language sql;
Run Code Online (Sandbox Code Playgroud)
函数f2() - 语言plpgsql
create or replace function f2(istr varchar)
returns text as $$
begin select 'hello! '::varchar || istr; end;
$$ language plpgsql;
Run Code Online (Sandbox Code Playgroud)
这两个函数都可以像select f1('world')
或一样调用select f2('world')
.
如果我打电话select f1('world')
的输出将是:
`hello! world`
Run Code Online (Sandbox Code Playgroud)并输出为select f2('world')
:
错误:查询没有结果数据的目的地提示:如果要丢弃SELECT的结果,请改用PERFORM.语境:在SQL语句中PL/pgSQL函数f11(字符变化)第2行 ******错误******
我想知道的差异,在哪些情况下我应该使用language sql
或language plpgsql …
给定一个表名,如何从plpgsql函数中提取主键列及其数据类型列表?
我是PostgreSQL的新手.请问任何人请更正此查询.
BEGIN TRANSACTION;
BEGIN;
CREATE TABLE "Logs"."Events"
(
EventId BIGSERIAL NOT NULL PRIMARY KEY,
PrimaryKeyId bigint NOT NULL,
EventDateTime date NOT NULL DEFAULT(now()),
Action varchar(12) NOT NULL,
UserId integer NOT NULL REFERENCES "Office"."Users"(UserId),
PrincipalUserId varchar(50) NOT NULL DEFAULT(user)
);
CREATE TABLE "Logs"."EventDetails"
(
EventDetailId BIGSERIAL NOT NULL PRIMARY KEY,
EventId bigint NOT NULL REFERENCES "Logs"."Events"(EventId),
Resource varchar(64) NOT NULL,
OldVal varchar(4000) NOT NULL,
NewVal varchar(4000) NOT NULL
);
COMMIT TRANSACTION;
RAISE NOTICE 'Task completed sucessfully.'
EXCEPTION;
ROLLBACK TRANSACTION;
RAISE ERROR …
Run Code Online (Sandbox Code Playgroud) (免责声明:PostgreSQL新手.)
好吧,据我所知,我的功能与我见过的样本非常相似.有人能否告诉我如何让这个工作?
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 = username
limit 1;
return;
end;
$$ language plpgsql;
Run Code Online (Sandbox Code Playgroud) 我写了一个函数,输出一个SELECT
以文本形式组成的PostgreSQL 查询.现在我不想再输出文本,但实际上SELECT
对数据库运行生成的语句并返回结果 - 就像查询本身一样.
CREATE OR REPLACE FUNCTION data_of(integer)
RETURNS text AS
$BODY$
DECLARE
sensors varchar(100); -- holds list of column names
type varchar(100); -- holds name of table
result text; -- holds SQL query
-- declare more variables
BEGIN
-- do some crazy stuff
result := 'SELECT\r\nDatahora,' || sensors ||
'\r\n\r\nFROM\r\n' || type ||
'\r\n\r\nWHERE\r\id=' || $1 ||'\r\n\r\nORDER BY Datahora;';
RETURN result;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION data_of(integer) OWNER TO postgres;
Run Code Online (Sandbox Code Playgroud)
sensors …
我不确定如何实现以下内容:
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;
Run Code Online (Sandbox Code Playgroud)
即将值插入到具有动态生成名称的表中.
执行上面的代码会产生:
ERROR: relation "shadowname" does not exist
LINE 1: INSERT INTO shadowname VALUES(OLD.*)
Run Code Online (Sandbox Code Playgroud)
它似乎表明变量不会作为表名扩展/允许.我在Postgres手册中没有发现这个.
我已经尝试过EXECUTE
这样的事情:
EXECUTE 'INSERT INTO ' || quote_ident(shadowname) || ' VALUES ' || OLD.*;
Run Code Online (Sandbox Code Playgroud)
但没有运气:
ERROR: syntax error at or near ","
LINE 1: INSERT INTO personenshadow VALUES (1,sven,,,)
Run Code Online (Sandbox Code Playgroud)
该RECORD
类型似乎失去了:OLD.*
似乎被转换为字符串,并得到的重新解析,导致各种各样的类型的问题(例如NULL
值). …
我需要将存储在我的数据库中的字符串转换为数字值.结果可以是Integer(首选)或Bigint.此转换将在PL/pgSQL函数的数据库端完成.
有人可以指点一些算法或任何可用于实现此目的的API吗?
我一直在Google上搜索这几个小时,到目前为止找不到任何有用的东西:(
我有一个URL表.他们包含
(id int主键,url字符变化唯一,内容字符变化,最后分析日期).
我想创建触发器或其他东西(规则可能是),所以每次我从我的java程序插入时,如果存在具有这种URL的行,它会更新一些单行.否则它应该执行插入.
请你能在Postgresql中提供完整的代码吗?谢谢.
plpgsql ×10
postgresql ×10
sql ×4
dynamic-sql ×2
triggers ×2
arrays ×1
database ×1
function ×1
loops ×1