在存储过程中将输入参数作为值传递

Posted

技术标签:

【中文标题】在存储过程中将输入参数作为值传递【英文标题】:Pass input parameter as value in stored procedure 【发布时间】:2020-10-13 20:18:49 【问题描述】:

我正在使用 SQL (plpgsql)。我创建了一个存储过程,它接收像这样的“DUMMYVAR”的varchar 值。我想使用输入值 ('DUMMYVAR') 来填充表的整个列,然而,当我尝试运行它时出现输出错误,存储过程发出信号'DUMMYVAR ' 不是列。

这是一个示例存储过程:

CREATE OR REPLACE PROCEDURE my_procedure(myvar VARCHAR)
AS $$
BEGIN
    INSERT INTO mytable (var1, var2, dummyvar)
        SELECT 'HELLO', 'WORLD', myvar
        FROM othertable;
END;
$$

假设othertablemyvar = 'DUMMYVAR' 中有 5 条记录,我期望的是以下输出:

var1    var2    dummyvar
HELLO   WORLD   DUMMYVAR
HELLO   WORLD   DUMMYVAR
HELLO   WORLD   DUMMYVAR
HELLO   WORLD   DUMMYVAR
HELLO   WORLD   DUMMYVAR

【问题讨论】:

INSERT 语句指的是dummvar 而不是dummyvar——或者这是一个错字?如果手动运行INSERT 语句,是否有效? 【参考方案1】:

对我来说似乎很好用

CREATE TEMP TABLE test_source (
      row_id INTEGER IDENTITY 
    , col_1 VARCHAR
);
INSERT INTO test_source (col_1)
VALUES ('hello world')
     , ('hello world')
     , ('hello world')
     , ('hello world')
     , ('hello world')
;
CREATE TEMP TABLE test_target (
      row_id INTEGER 
    , col_1 VARCHAR
    , col_2 VARCHAR
);
CREATE OR REPLACE PROCEDURE sp_insert_test( test_value VARCHAR)
AS $$
BEGIN
    INSERT INTO test_target (row_id, col_1, col_2)
    SELECT *, test_value
    FROM test_source;
END;
$$ LANGUAGE plpgsql;
;
CALL sp_insert_test ('test-test-test')
;
SELECT * FROM test_target ORDER BY 1
;
 row_id |    col_1    |     col_2
--------+-------------+----------------
      1 | hello world | test-test-test
      2 | hello world | test-test-test
      3 | hello world | test-test-test
      4 | hello world | test-test-test
      5 | hello world | test-test-test

【讨论】:

以上是关于在存储过程中将输入参数作为值传递的主要内容,如果未能解决你的问题,请参考以下文章

在 Sql Server 中将 xml 文档作为存储过程的参数传递是不是安全?

如何在 Oracle SQL Developer 的存储过程中将表名列表作为参数传递?如何使用 PLSQL VARRAY 或嵌套表?

在 PL/SQL 存储过程中将多个变量传递给 WHERE 条件

java字符串数组作为参数传递oracle存储过程

SQL Server存储过程中使用表值作为输入参数示例

在 azure synapse 存储过程中将表名作为参数传递时将查询结果分配给变量