0

我有以下功能(返回一组自定义类型)

CREATE OR REPLACE FUNCTION myfunction(in_myvar integer)
  RETURNS SETOF my_type AS
$BODY$

DECLARE
    v_data my_type%rowtype;
    v_another_var text;
BEGIN
    FOR v_data IN (

        -- I want to be able to do a SELECT INTO v_another_var in each iteration
        -- of the loop, ideally so I can use this value throughout the select
        -- statement e.g.:
        -- SELECT INTO v_another_var regex_replace(col3, '[^a-zA-Z0-9 ]', '');

        SELECT DISTINCT 
            col1
            col2,
            -- v_another_var AS some_column
            -- etc.
            -- perhaps use this v_another_var again here
            -- as part of something else.
          FROM mytable
          WHERE v_another_var = 'test' + some_function() = 'something'
                    -- want to use the variable again here.
    ) LOOP
        RETURN NEXT v_data;
    END LOOP;
    RETURN;
$BODY$

是否可以分配一个变量并以这种方式在每个选择语句中作为循环的一部分使用它?即使这是可能的,SELECT INTO 语句是否可以在我拥有它的地方工作(col3 可以访问吗?)

postgres 有没有办法实现这种变量的使用?

4

2 回答 2

3

您需要在控制循环的查询中选择 v_another_var 的值,或者在LOOP/END LOOP构造内部,如果您希望在循环的每次迭代中使用不同的值。如果需要,您总是可以有额外的查询来分配循环内的其他值。

如果没有更具体的例子,很难提出更具体的建议。

于 2012-04-20T12:44:19.560 回答
1

你的问题一团糟。其中大部分根本没有任何意义。

是否可以分配一个变量并以这种方式在每个选择语句中作为循环的一部分使用它?

  • 您的问题中只有一个SELECT 语句。你没有道理。

  • SELECT 语句中没有“循环”。您可以遍历 SELECT 语句产生的行。

即使这是可能的,INSERT INTO 语句是否可以在我拥有它的地方工作(col3 可以访问吗?)

  • 它根本不会。无论你在哪里拥有它,也不是你在那里拥有什么。
    • 也许你的意思是 SELECT INTO?
    • 没有FROM子句,col3是未定义的。
    • FOR 循环中只有一个语句。更多关于这进一步。

此外 ...

  • FOR 循环的 SELECT 不需要括号。

  • regexp_replace(),不是regex_replace()

  • PostgreSQL 中的文本连接:'test' || some_function()
    不是'test' + some_function()

  • 你需要括号WHERE x = (a || b)

  • 缺少语言声明。language plpgsql在最后添加。


可能会问FOR什么(疯狂猜测):是的,您可以在一个循环中分配多个变量。我在这里引用手册:

目标是记录变量、行变量或以逗号分隔的标量变量列表。

但是,您不能像您尝试的那样混合记录变量和标量变量。你必须...

a) 将复合类型拆分v_data为标量变量并按顺序列出它们,然后附加v_another_var到 FOR 目标列表。

v_another_var或 b)向复合类型添加一个文本列(而不是) my_type。但是,在这种情况下,您必须重新组织RETURN NEXT语句。由于我只是猜测您的问题可能是什么,因此我不会详细说明。

如果您想要一个准确的答案,请清理您的问题并提出一个准确的问题。

于 2012-04-20T16:15:30.907 回答