假设我有一个 Windows 用户环境变量 SOME_STRING。
是否可以在 PL/pgSQL 函数中使用它的值?
如果没有,我是否需要使用不受信任的语言(如 PL/pythonu),或者我可以使用受信任的语言吗?
我在 PG 9.2
我运行PostgreSQL-9.2.4
是否可以从触发器调用 2 个函数?
假设以下触发器触发时,我有两个函数可以执行两个不同的表:
扳机:
CREATE TRIGGER start ON system_status FOR EACH ROW
WHEN ((new.event = start_task))
EXECUTE PROCEDURE ...()
Run Code Online (Sandbox Code Playgroud)
功能 1:( 当任务开始时 => 删除任何先前为此系统分配的下一个任务)
CREATE FUNCTION void_next_task() RETURNS trigger AS $$
BEGIN
DELETE FROM tasks_status ts
WHERE ts.system = NEW.system
AND ts.event = 'next_task';
RETURN NEW;
END;
$$
LANGUAGE plpgsql
Run Code Online (Sandbox Code Playgroud)
功能 2:(
如果插入的组合task和system已经出现在表中=> 将此组合标记为任何较早的记录deleted)
CREATE FUNCTION void_dup_task() RETURNS trigger AS $$
BEGIN
UPDATE system_status ss
SET deleted = 'TRUE'
WHERE ss.system …Run Code Online (Sandbox Code Playgroud) 我有一系列 ETL 作业,在这些作业中我swap使用CREATE TABLE table1_swap LIKE table1. 为了使填充table1_swap更快,我不包括索引。但是,当我完成加载时,我需要将这些索引重新应用于新填充的表。这些索引是在这些 ETL 作业范围之外创建的,因此CREATE INDEX如果我不需要,我宁愿不必对调用进行硬编码。
是否可以将一组索引从一个表“转移”或“复制”到另一个表?
我无法让 INSTEAD OF 触发器正常工作,而且我想我误解了如何使用 NEW。考虑以下简化场景:
CREATE TABLE Product (
product_id SERIAL PRIMARY KEY,
product_name VARCHAR
);
CREATE TABLE Purchase (
purchase_id SERIAL PRIMARY KEY,
product_id INT REFERENCES Product,
when_bought DATE
);
CREATE VIEW PurchaseView AS
SELECT purchase_id, product_name, when_bought
FROM Purchase LEFT JOIN Product USING (product_id);
Run Code Online (Sandbox Code Playgroud)
我希望能够创建INSTEAD OF触发器以允许我直接插入到 中PurchaseView,例如:
INSERT INTO Product(product_name) VALUES ('foo');
INSERT INTO PurchaseView(product_name, when_bought) VALUES ('foo', NOW());
Run Code Online (Sandbox Code Playgroud)
我的想法是这样的:
CREATE OR REPLACE FUNCTION insert_purchaseview_func()
RETURNS trigger AS
$BODY$
BEGIN
INSERT INTO Purchase(product_id, when_bought) …Run Code Online (Sandbox Code Playgroud) 我正在将大量大文件导入到要使用匿名 plpgsql 代码块中的循环进行分区的多个表中$do$。
$do$
BEGIN
FOR yyyy in 2012..2016 THEN
EXECUTE $$COPY table$$||yyyy||$$ FROM 'E:\data\file$$||yyyy||$$.csv DELIMITER ',' CSV;$$;
END LOOP;
END;
$do$ LANGUAGE plpgsql
Run Code Online (Sandbox Code Playgroud)
整个过程大约需要 15 个小时,我希望如果在某个时候出现导入错误,所有导入都不会回滚。
IIRCCOMMIT在存储函数中不起作用,因为整个函数被视为单个事务。
代码块被视为没有参数的函数体,返回 void。它被解析和执行一次。
我假设这意味着整个$do$事务是一个事务,因此块内的提交将不起作用。我对么?
我在 PostgreSQL 9.1 中有一个名为fun_test. 它有一个复合类型作为输入参数,我在调用它时不断收到转换错误。
CREATE OR REPLACE FUNCTION netcen.fun_test(myobj netcen.testobj)
RETURNS boolean AS
$BODY$
DECLARE
tmp_code smallint;
cur_member refcursor;
BEGIN
-- Check if the member exists first
OPEN cur_member FOR
EXECUTE 'SELECT testkey FROM netcen.test WHERE testkey=' || myobj.testkey ;
FETCH cur_member INTO tmp_code;
CLOSE cur_member;
CASE tmp_code
WHEN COALESCE(tmp_code,0)=0 THEN
-- Record not found INSERT a new record
-- will skip user defined validation for now
insert into netcen.test values(myobj.testkey,
myobj.tes,
myobj.testname);
ELSE
-- Record found …Run Code Online (Sandbox Code Playgroud) 我有一个存储过程,RETURNS SETOF ct_custom_type我在里面做
RETURN QUERY EXECUTE 'some dynamic query'
Run Code Online (Sandbox Code Playgroud)
我想这样做:如果这个“动态查询”返回 >= 10 行,我想返回它们,但如果它只返回 < 10 行,我不想返回任何东西(空集ct_custom_type)。
我试过:
RETURN QUERY EXECUTE 'some dynamic query'
GET DIAGNOSTICS variable = ROW_COUNT;
IF variable < 10 THEN
# I don't know what to do here or how to accomplish this
END IF;
Run Code Online (Sandbox Code Playgroud)
如果我RETURN QUERY SELECT 0, 0, ''::text;在IF块中执行(因为ct_custom_type是 的复合类型(integer, integer, text),它只是将这个“空行”添加到先前的查询结果中,但在这种情况下我不想返回任何内容,我可以这样做RETURN;,但它会返回先前的结果,我想丢弃它。
我有这样的:
EXECUTE 'dynamic query';
GET DIAGNOSTICS variable = ROW_COUNT; …Run Code Online (Sandbox Code Playgroud) 我有多个具有相同列名的表,它们仅在列值上有所不同,例如:
tbl_log_a
tbl_log_b
tbl_log_c
...
Run Code Online (Sandbox Code Playgroud)
从 a 到 z 的 26 个表。每个表都有一个触发器,它调用一个触发器函数,它执行完全相同的操作:
SELECT columnname FROM tbl_log_a
Run Code Online (Sandbox Code Playgroud)
除此之外,我所有的触发器功能都做同样的事情。它们的不同之处在于:
select columnname FROM tbl_log_a
select columnname FROM tbl_log_b
select columnname FROM tbl_log_c
...
Run Code Online (Sandbox Code Playgroud)
所以我必须创建 26 个触发函数,每个tbl_log_%letter%. 有没有办法告诉触发器函数:
SELECT columnname FROM %currenttable%
Run Code Online (Sandbox Code Playgroud)
通过%currenttable%我的意思是当触发放在桌子上。或者:
SELECT columnname FROM tbl_log_%letter%
Run Code Online (Sandbox Code Playgroud)
在Postgres 9.1 中可能吗?我正在阅读动态确定的表。有什么线索吗?我想将表名本身存储在一个变量中,而不是该表中的列,因为触发器函数适用于该表中的多个列。
TG_TABLE_NAME
TG_TABLE_SCHEMA
Run Code Online (Sandbox Code Playgroud) 我在 PostgreSQL 9.5 中编写了一个 PL/pgSQL 函数。它编译得很好,但是当我从 pgAdmin3 调用它时,它给了我一个错误。似乎用函数中传递的参数替换列的动态查询不起作用。
下面是我的功能:
CREATE OR REPLACE FUNCTION insertRecordsForNotification(username text, state text, district text, organizationId text, bloodGroup text, status text, approveRejectStatus text, emailSubject text, emailBody text, notificationStatus text) RETURNS boolean AS $$
DECLARE
id int;
r moyadev.user%rowtype;
_where text :=
concat_ws(' AND '
, CASE WHEN state IS NOT NULL THEN 'state = $2' END
, CASE WHEN district IS NOT NULL THEN 'district = $3' END
, CASE WHEN bloodGroup IS NOT NULL THEN …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 Postgres 中创建一个函数,该函数可以遍历给定jsonb对象中的每个键/值对。
create or replace function myFunction
(input jsonb)
returns jsonb as $$
BEGIN
// foreach(key in input)
// do some math operation on its corresponding value
returns input;
END; $$
Run Code Online (Sandbox Code Playgroud)
参数输入应为 jsonb 对象,例如{"a":1, "b":2, "c":3}.
我想遍历对象中的每个键/值对。从我的评论中可以看出,我曾经使用更通用的编程语言(如 c、java 等)编写后端代码。所以我不擅长 SQL。我曾尝试在线搜索,但他们谈论如何遍历jsonb数组而不是对象。所以真的卡在这里了。
plpgsql ×10
postgresql ×10
dynamic-sql ×4
functions ×3
trigger ×3
ddl ×1
index ×1
json ×1
parameter ×1
syntax ×1
transaction ×1
upsert ×1