簡體   English   中英

如何從函數 1 中返回函數 2 的值

[英]How to return the value of function 2 from within function 1

我將如何從函數內部返回函數的返回值(例如foo()調用bar() )?

create or replace function bar ()
    returns text
    as $$
    begin
        select md5(random()::text);
    end
    $$ language 'plpgsql';

create or replace function foo ()
    returns text
    as $$
    begin
        return select bar ();
    end
    $$ language 'plpgsql';

我不斷收到錯誤,例如query has no destination for result data

您需要提供一些東西來接受查詢的輸出:

CREATE OR REPLACE FUNCTION public.bar()
 RETURNS text
 LANGUAGE plpgsql
AS $function$
    declare
        md5_val text;
    begin
        select into md5_val md5(random()::text);
        return md5_val;
    end
    $function$
;
create or replace function foo ()
    returns text
    as $$
    declare
      md5_val2 text;
    begin
        select into md5_val2 bar();
        return md5_val2;
    end
    $$ language 'plpgsql';

select * from foo();
               foo                
----------------------------------
 ac6a4910fac3472d226dc54bb147336e

看:

https://www.postgresql.org/docs/current/plpgsql-statements.html#PLPGSQL-STATEMENTS-SQL-ONEROW

你的兩個函數都是“plpgsql”語言和“sql”語言函數的一些不允許的混合。 此外,這與從另一個調用一個無關,即使您直接調用 bar() 也會被破壞,一旦修復,則 foo() 會獨立於 bar() 被破壞而被破壞。

這里什么都不需要在plpgsql中,所以最簡單的修復就是把它們變成'sql'語言函數。

create or replace function bar ()
returns text
as $$
    select md5(random()::text);
$$ language 'sql';      

create or replace function foo ()
returns text
as $$
    select bar();
$$ language 'sql';

如果你希望它們是 plpgsql,那么在第一種情況下你需要return一些東西,它不會像 SQL 語言函數那樣自動返回最后一個查詢的結果。 而在第二個中,“返回選擇”無效。 您可以選擇一個臨時變量,然后返回該臨時變量,但只需將第一個中的“選擇”更改為“返回”,並在第二個中刪除任性的“選擇”就更容易了。

create or replace function bar ()
returns text
as $$
begin
    return md5(random()::text);
end
$$ language 'plpgsql';

create or replace function foo ()
returns text
as $$
begin
    return bar();
end
$$ language 'plpgsql';

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM