首页 > 解决方案 > 为什么 RETURN QUERY 返回字符串而不是 TABLE

问题描述

这个 MWE不是你通常解决这个问题的方式,但是,它就像我可以解释我遇到的问题一样简单。我只是想指出两件事

  1. 我所做的不仅仅是返回表格的内容
  2. 返回的不是作为表返回,而是作为字符串返回

支持 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),]

标签: sqlpostgresqlpsycopg2

解决方案



推荐阅读