【问题标题】:How to use stored procedure parameter as the select column value in Postgres? [duplicate]如何使用存储过程参数作为 Postgres 中的选择列值? [复制]
【发布时间】:2022-01-07 11:05:29
【问题描述】:

我正在尝试在 Postgres 中编写一个存储过程,在其中我将使用传递给 SP 的参数作为 SELECT 中的列值(而不是列名):

CREATE OR REPLACE PROCEDURE create_log
    (_contractCode varchar,
    _signedOn timestamp,
    _contractAmount numeric,
    _feePercentage numeric,
    _fee numeric,
    _projectCode varchar,
    _contractType varchar)
AS $$

BEGIN
    
INSERT INTO Contracts (ContractCode, SignedOn, ContractAmount, FeePercentage, Fee, ProjectId, ContractType)
SELECT _contractCode, _signedOn, _contractAmount, _feePercentage, _fee, p.Id AS ProjectId, _contractType
  FROM Projects p WHERE p.Code = _projectCode LIMIT 1;
END;
$$
LANGUAGE plpgsql ;

当我调用它时:

CALL public.create_log("contractcode",'2021-12-24T02:55:39',1000.7,3.2,3.232,'test','New');

我来了

SQL 错误 [42703]:错误:列“contractcode”不存在位置:24

这意味着它正在尝试使用参数值作为列名。我想使用参数值作为 SELECT 返回的值。

谢谢

【问题讨论】:

  • 哪些参数是列名,哪些是要插入表contracts的常量值?另请注意,不带引号的名称在 Postgresql 中会转换为小写。
  • 当然没有名为“ContractCode”的列。这是我要插入到 Contracts 表中的值,而不是任何列名。所有参数名称前面都有下划线。

标签: postgresql stored-procedures string-constant


【解决方案1】:

问题在于你是如何调用函数的,而不是在函数内部。

您在contract_code 周围加上了双引号,因此需要一个列名,但找不到它。您必须使用单引号

CALL public.create_log('contractcode','2021-12-24T02:55:39',1000.7,3.2,3.232,'test','New');
select "a";
ERROR:  column "a" does not exist
LINE 1: select "a";
               ^
select 'b';
 ?column?
----------
 b
(1 row)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-16
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多