Postgresql Postgress函数在循环和进入时未按预期工作
我有以下程序Postgresql Postgress函数在循环和进入时未按预期工作,postgresql,function,plpgsql,Postgresql,Function,Plpgsql,我有以下程序 CREATE OR REPLACE FUNCTION createtestdata( ) RETURNS boolean LANGUAGE 'plpgsql' COST 100 VOLATILE AS $BODY$ DECLARE proj RECORD; ruleid integer; emailtemplateid integer; otherTemplates
CREATE OR REPLACE FUNCTION createtestdata(
)
RETURNS boolean
LANGUAGE 'plpgsql'
COST 100
VOLATILE
AS $BODY$
DECLARE
proj RECORD;
ruleid integer;
emailtemplateid integer;
otherTemplates RECORD;
markdoenTemplateId integer;
pdfTemplateId integer;
jsonTemplateId integer;
BEGIN
FOR proj IN
SELECT p.id AS project_id FROM project p
WHERE p.id != 10409 and p.projecttype='software'
ORDER BY p.id
LOOP
select "ID" from "TEST_TEMPLATES"
where "PROJECT_ID" = proj.project_id AND "TYPE" =1 ORDER BY RANDOM() LIMIT 1
INTO emailtemplateid;
RAISE NOTICE 'template id is %...', emailtemplateid;
select "ID", "TYPE" from "TEST_TEMPLATES"
where "PROJECT_ID" = proj.project_id AND "TYPE" IN (2,4,5)
ORDER BY RANDOM() LIMIT 1
INTO otherTemplates;
RAISE NOTICE 'OTHER TEMPLATES %', otherTemplates;
RAISE NOTICE 'inserting records for project id %...', proj.project_id;
pdfTemplateId = NULL;
markdoenTemplateId = NULL;
jsonTemplateId = NULL;
IF otherTemplates."TYPE" = 2 THEN
pdfTemplateId = otherTemplates."ID";
ELSIF otherTemplates."TYPE" = 4 THEN
markdoenTemplateId = otherTemplates."ID";
ELSIF otherTemplates."TYPE" = 5 THEN
jsonTemplateId = otherTemplates."ID";
END IF;
RAISE NOTICE 'PDF TEMP IS %... MKDN TEMP IS %... JSON TEMP IS %',
pdfTemplateId, markdoenTemplateId, jsonTemplateId;
INSERT INTO "TEST_RULES"(
"BEFORE_NOF_DAYS", "CREATED", "CREATED_BY", "CRON_EXPRESSION", "IS_ACTIVE",
"IS_DELETED", "MODIFIED", "MODIFIED_BY", "NAME",
"PROJECT_ID", "SCHEDULE_TIME", "TRIGGER_TYPE", "VERSION_PATTERN")
VALUES (null, now(), 'admin', null, true,
false, now(), 'admin', 'rule for release project ' || proj.project_id,
proj.project_id, null, 2, null)
RETURNING "ID" INTO ruleId;
RAISE NOTICE 'Inserting email action for Rule id just created is %...', ruleId;
INSERT INTO "TEST_RULE_ACTIONS"(
"ACTION_TYPE", "CONFLUENCE_INSTANCE_ID", "CREATED", "CREATED_BY", "EMAIL_FROM",
"EXTERNAL_USERS", "IS_DELETED", "JIRA_GROUPS", "JIRA_USERS", "JSON_TEMPLATE_ID", "MARKDOWN_TEMPLATE_ID",
"MODIFIED", "MODIFIED_BY", "NAME",
"PAGE_LABEL", "PARENT_ID", "PDF_TEMPLATE_ID", "PORTAL_ID", "POST_END_POINT", "POST_PASSWORD",
"POST_TEMPLATE_TYPE", "POST_TYPE", "POST_USER_NAME", "REPLY_TO", "RULE_ID",
"SEND_EMAIL_AS_BCC", "SEQUENCE_NUMBER", "SPACE_KEY", "TEMPLATE_ID", "TEMPLATE_TYPE_ID")
VALUES (1, NULL, NOW(), 'admin', 'stest@test.com',
'', false, 'arn-users', 'admin', jsonTemplateId, markdoenTemplateId,
now(), 'admin', 'email action configured for project ' || proj.project_id,
NULL, 0, pdfTemplateId, 0, NULL, NULL,
NULL, 'page', NULL, 'stest@test.com', ruleId,
false, 1, NULL, emailtemplateid, 1);
END LOOP;
RETURN true;
END;
$BODY$;
当我运行函数时,我得到输出
psql:dproc.sql:122: NOTICE: template id is 3425...
psql:dproc.sql:122: NOTICE: project id 10494...
psql:dproc.sql:122: NOTICE: OTHER TEMPLATES (1709,5)
psql:dproc.sql:122: NOTICE: PDF TEMP IS <NULL>... MKDN TEMP IS <NULL>... JSON TEMP IS 1709
psql:dproc.sql:122: NOTICE: inserting records for project id 10497...
**psql:dproc.sql:122: NOTICE: Inserting email action for Rule id just created is <NULL>...**
psql:dproc.sql:122:注意:模板id是3425。。。
psql:dproc.sql:122:注意:项目id 10494。。。
psql:dproc.sql:122:注意:其他模板(1709,5)
注意:PDF临时文件是。。。MKDN温度是。。。JSON温度是1709
psql:dproc.sql:122:注意:插入项目id 10497的记录。。。
**注意:为刚刚创建的规则id插入电子邮件操作是**
最后一行“为刚刚创建的规则id插入电子邮件操作”是错误的,insert语句在我的本地SQL上正常工作。但这对AWS博士后不起作用
另外,如果我将insert语句放在循环中的第一个语句中,它也可以工作。但是,另外两种说法与您的问题无关,但是:您应该真正避免那些可怕的引用标识符。他们的麻烦远比他们值得的多。你确定你发布的代码就是正在运行的代码吗?您的
通知
行中的PDF TEMP是代码>和插入项目id的记录代码>在您的输出中出现问题。当您将INSERT
移动到顶部时,哪两条语句不起作用?当您说is在本地工作但不在AWS上工作时,您是指整个函数还是仅指INSERT
?另外,这与在函数中移动插入
有什么关系?问题在于ruleid integer;语句中使用的是ruleId。此函数在本地windows postgres上工作,但在AWS rds postgresql上失败。我纠正了变量的情况,它起了作用