sql - 为什么 RETURN QUERY 返回字符串而不是 TABLE
问题描述
这个 MWE不是你通常解决这个问题的方式,但是,它就像我可以解释我遇到的问题一样简单。我只是想指出两件事
- 我所做的不仅仅是返回表格的内容
- 返回的不是作为表返回,而是作为字符串返回
支持 SQL 语句:
DROP DATABASE IF EXISTS test;
CREATE DATABASE test;
\c test
CREATE TABLE credit_card(
id BIGSERIAL PRIMARY KEY,
balance BIGINT
);
功能:
CREATE FUNCTION get_credit_card(
p_id BIGINT
)
RETURNS TABLE(
id BIGINT,
balance BIGINT
)
AS $$
DECLARE
BEGIN
RETURN QUERY
SELECT
credit_card.id,
credit_card.balance
FROM
credit_card
WHERE
credit_card.id = p_id;
END $$ LAnguage 'plpgsql';
CREATE FUNCTION pay_with_card(
p_id BIGINT,
p_amount BIGINT
)
RETURNS TABLE(
id BIGINT,
balance BIGINT
)
AS $$
DECLARE
v_balance BIGINT;
BEGIN
SELECT
credit_card.balance
FROM
credit_card
INTO
v_balance
WHERE
credit_card.id = p_id;
IF v_balance < p_amount
THEN
RETURN;
END IF;
UPDATE
credit_card
SET
balance = credit_card.balance - p_amount;
RETURN QUERY
SELECT get_credit_card (p_id);
END $$ LAnguage 'plpgsql';
填充表和调用函数:
INSERT INTO credit_card
(balance)
VALUES
(100);
SELECT
pay_with_card (1, 100);
错误:
DROP DATABASE
CREATE DATABASE
You are now connected to database "test" as user "postgres".
CREATE TABLE
CREATE FUNCTION
CREATE FUNCTION
INSERT 0 1
psql:test.sql:74: ERROR: structure of query does not match function result type
DETAIL: Returned type record does not match expected type bigint in column 1.
CONTEXT: PL/pgSQL function pay_with_card(bigint,bigint) line 24 at RETURN QUERY
我花了很长时间才弄清楚这pay_with_card
是返回一个字符串,或者看起来是一个字符串,而不是一个TABLE(id BIGINT, balance BIGINT)
. 使用 Pythonpsycopg2
库,返回的查询是
[('(1,100)'),]
所以我的整个代码都被破坏了,因为我无法获取值(除非我破解它并使用字符串操作。
问题:
我该如何修复它,以便它像这样返回正确的查询
[(1,100),]
解决方案
推荐阅读
- shell - 如何删除目录的每个文件中的空行?
- r - knitr:使用 fig.width 设置图形尺寸时显示多个图形的图形标题
- sql-server - INSERT INTO,如果已经存在 UPDATE。从现有查询。被放在 SQL 代理工作上
- reactjs - 如何将道具传递给 React Picker
- text - 我无法使用 text2vec 为我的测试数据创建 tf-idf 矩阵
- c# - 响应 URL 正在返回以前的 Imgur 图片 URL 而不是当前图片 URL
- docker - 如何将错误修复到我的 docker compose 文件中
- excel - 仅选择范围的 VBA 代码,当前出现多个错误
- css - 如何在 Angular 5 中为打字稿中的字符串添加颜色
- operating-system - Minix/Microkernel 中系统调用和内核调用的区别