debugsqlModerate
cannot insert multiple commands into a prepared statement
Viewed 0 times
cannotinsertstatementcommandsintopreparedmultiple
Problem
This query works for me when I tried in PG admin query tool:
Later I implemented in my code like this:
it says:
cannot insert multiple commands into a prepared statement
Can some one guide me here?
UPDATE bankdetails SET bank_details = 'mysore' ,"PAN"= 123,bank_acc = 456,
"UAN"=789,tax = 'myy'
WHERE user_id = 79;
INSERT INTO bankdetails (user_id,bank_details,"PAN",bank_acc,"UAN",tax)
SELECT 79,'mysore',123,456,789,'myy'
WHERE NOT EXISTS (SELECT 1 FROM bankdetails WHERE user_id=79);Later I implemented in my code like this:
db.query('UPDATE bankdetails SET bank_details = $2 ,"PAN"= $3,bank_acc = $4,"UAN"=$5,tax = $6 WHERE user_id = $1; INSERT INTO bankdetails (user_id,bank_details,"PAN",bank_acc,"UAN",tax) SELECT $1,$2,$3,$4,$5,$6 WHERE NOT EXISTS (SELECT 1 FROM bankdetails WHERE user_id = $1);', [companyuser.rows[0]._id, data.bankDetails.bank_details, data.bankDetails.PAN, data.bankDetails.bank_acc, data.bankDetails.UAN, data.bankDetails.tax],function(err,bank) {
if (err) return callback(new Error('error'));
})it says:
cannot insert multiple commands into a prepared statement
Can some one guide me here?
Solution
You can do that in a single query using a writeable CTE:
The
You can even avoid writing the values twice:
I don't know which programming language you are using, but for e.g. a JDBC PreparedStatement you can replace the data in the
with updated as (
UPDATE bankdetails
SET bank_details = 'mysore',
"PAN"= 123,
bank_acc = 456,
"UAN" = 789,
tax = 'myy'
WHERE bankdetails.user_id = 79
returning *
)
INSERT INTO bankdetails (user_id,bank_details,"PAN",bank_acc,"UAN",tax)
SELECT 79,'mysore',123,456,789,'myy'
WHERE NOT EXISTS (SELECT * FROM updated);The
insert will only be executed if the update did not change a row. You can even avoid writing the values twice:
with data (user_id, bank_details, pan, bank_acc, uan, tax) as (
values (79, 'mysore', 123, 456, 789, 'myy')
), updated as (
UPDATE bankdetails
SET bank_details = d.bank_details,
"PAN"= d.pan,
bank_acc = d.bank_acc,
"UAN" = d.uan,
tax = d.tax
FROM data d
WHERE user_id = d.user_id
returning *
)
INSERT INTO bankdetails (user_id,bank_details,"PAN",bank_acc,"UAN",tax)
SELECT user_id, bank_details, pan, bank_acc, uan, tax
FROM data
WHERE NOT EXISTS (SELECT * FROM updated);I don't know which programming language you are using, but for e.g. a JDBC PreparedStatement you can replace the data in the
values(..) part with parameter placeholder: with data (user_id, bank_details, pan, bank_acc, uan, tax) as (
values (?, ?, ?, ?, ?, ?)
)
...Code Snippets
with updated as (
UPDATE bankdetails
SET bank_details = 'mysore',
"PAN"= 123,
bank_acc = 456,
"UAN" = 789,
tax = 'myy'
WHERE bankdetails.user_id = 79
returning *
)
INSERT INTO bankdetails (user_id,bank_details,"PAN",bank_acc,"UAN",tax)
SELECT 79,'mysore',123,456,789,'myy'
WHERE NOT EXISTS (SELECT * FROM updated);with data (user_id, bank_details, pan, bank_acc, uan, tax) as (
values (79, 'mysore', 123, 456, 789, 'myy')
), updated as (
UPDATE bankdetails
SET bank_details = d.bank_details,
"PAN"= d.pan,
bank_acc = d.bank_acc,
"UAN" = d.uan,
tax = d.tax
FROM data d
WHERE user_id = d.user_id
returning *
)
INSERT INTO bankdetails (user_id,bank_details,"PAN",bank_acc,"UAN",tax)
SELECT user_id, bank_details, pan, bank_acc, uan, tax
FROM data
WHERE NOT EXISTS (SELECT * FROM updated);with data (user_id, bank_details, pan, bank_acc, uan, tax) as (
values (?, ?, ?, ?, ?, ?)
)
...Context
StackExchange Database Administrators Q#174426, answer score: 12
Revisions (0)
No revisions yet.