Unable to wrap a simple CTE in plpgsql loop
For a test database, I would like to create a bunch of test users (all with "default" values). There is a table called users
, and another called user_properties
. For each test user, I need to make corresponding entries in both these tables. I already have a nicely working CTE to do this, but I am unable to wrap this CTE in a loop.
CREATE OR REPLACE FUNCTION ins()
returns void as
$BODY$
BEGIN
--RETURN record;
FOR Loopid IN 0..10 LOOP
with
user as (
insert into user
values(default)
returning id
)
,user_property as (
insert into user_property (property_of)
select id from user
returning id
)
select id from user_property;
END LOOP;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
It creates the function, but on running it complains
ERROR: query has no destination for result data
HINT: If you want to discard the results of a SELECT, use PERFORM instead.
But it doesn't seem possible to replace the last select
of the CTE with a perform
instead - that's a syntax error. So how can I do this?
The few questions (example) which have very similar titles have their answer that a loop/cte isn't really necessary, so they don't help me. Unless there's a very creative way of doing the exact same thing 10 times without a loop :-)
postgresql plpgsql cte
add a comment |
For a test database, I would like to create a bunch of test users (all with "default" values). There is a table called users
, and another called user_properties
. For each test user, I need to make corresponding entries in both these tables. I already have a nicely working CTE to do this, but I am unable to wrap this CTE in a loop.
CREATE OR REPLACE FUNCTION ins()
returns void as
$BODY$
BEGIN
--RETURN record;
FOR Loopid IN 0..10 LOOP
with
user as (
insert into user
values(default)
returning id
)
,user_property as (
insert into user_property (property_of)
select id from user
returning id
)
select id from user_property;
END LOOP;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
It creates the function, but on running it complains
ERROR: query has no destination for result data
HINT: If you want to discard the results of a SELECT, use PERFORM instead.
But it doesn't seem possible to replace the last select
of the CTE with a perform
instead - that's a syntax error. So how can I do this?
The few questions (example) which have very similar titles have their answer that a loop/cte isn't really necessary, so they don't help me. Unless there's a very creative way of doing the exact same thing 10 times without a loop :-)
postgresql plpgsql cte
add a comment |
For a test database, I would like to create a bunch of test users (all with "default" values). There is a table called users
, and another called user_properties
. For each test user, I need to make corresponding entries in both these tables. I already have a nicely working CTE to do this, but I am unable to wrap this CTE in a loop.
CREATE OR REPLACE FUNCTION ins()
returns void as
$BODY$
BEGIN
--RETURN record;
FOR Loopid IN 0..10 LOOP
with
user as (
insert into user
values(default)
returning id
)
,user_property as (
insert into user_property (property_of)
select id from user
returning id
)
select id from user_property;
END LOOP;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
It creates the function, but on running it complains
ERROR: query has no destination for result data
HINT: If you want to discard the results of a SELECT, use PERFORM instead.
But it doesn't seem possible to replace the last select
of the CTE with a perform
instead - that's a syntax error. So how can I do this?
The few questions (example) which have very similar titles have their answer that a loop/cte isn't really necessary, so they don't help me. Unless there's a very creative way of doing the exact same thing 10 times without a loop :-)
postgresql plpgsql cte
For a test database, I would like to create a bunch of test users (all with "default" values). There is a table called users
, and another called user_properties
. For each test user, I need to make corresponding entries in both these tables. I already have a nicely working CTE to do this, but I am unable to wrap this CTE in a loop.
CREATE OR REPLACE FUNCTION ins()
returns void as
$BODY$
BEGIN
--RETURN record;
FOR Loopid IN 0..10 LOOP
with
user as (
insert into user
values(default)
returning id
)
,user_property as (
insert into user_property (property_of)
select id from user
returning id
)
select id from user_property;
END LOOP;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
It creates the function, but on running it complains
ERROR: query has no destination for result data
HINT: If you want to discard the results of a SELECT, use PERFORM instead.
But it doesn't seem possible to replace the last select
of the CTE with a perform
instead - that's a syntax error. So how can I do this?
The few questions (example) which have very similar titles have their answer that a loop/cte isn't really necessary, so they don't help me. Unless there's a very creative way of doing the exact same thing 10 times without a loop :-)
postgresql plpgsql cte
postgresql plpgsql cte
asked 3 mins ago
YogeschYogesch
312210
312210
add a comment |
add a comment |
0
active
oldest
votes
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "182"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fdba.stackexchange.com%2fquestions%2f233095%2funable-to-wrap-a-simple-cte-in-plpgsql-loop%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
0
active
oldest
votes
0
active
oldest
votes
active
oldest
votes
active
oldest
votes
Thanks for contributing an answer to Database Administrators Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fdba.stackexchange.com%2fquestions%2f233095%2funable-to-wrap-a-simple-cte-in-plpgsql-loop%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown