簡體   English   中英

在sql函數中執行prepare語句

[英]Execute prepare statement in a sql function

CREATE OR REPLACE FUNCTION my_function2()
      RETURNS VOID
      LANGUAGE plpgsql AS
      $func$
      BEGIN
        PREPARE "my-statement7" (text, text) AS
        INSERT INTO "table" (key, a_id)
        VALUES ($1, $2);

        EXECUTE format('EXECUTE "my-statement7" (%1, %2)', 'value1', 'value2');
      END;
      $func$;
SELECT my_function2();

但是,這將返回錯誤。

我在命令行中執行prepare語句時運行成功,但是在函數中執行時會提示錯誤。 有人說execute語句在execute語句或函數中會產生歧義,所以需要把execute改成execute格式。 但是,它也不起作用。 我想執行插入的准備語句,因為我有很多數據要以相同的格式插入,但數據可能需要插入到不同的表(數據也不同),所以我不能只插入 multi 或 COPY for它。 我認為 prepare 語句對我來說是解決方案,但它不能在函數中工作。 如果我想在一個函數中做很多“執行准備語句”,這會困擾我。

在 PL/SQL 中,查詢已經准備好並緩存起來,因此您不必這樣做。

由於每個表達式和 SQL 命令首先在函數中執行,PL/pgSQL 解釋器使用 SPI 管理器的 SPI_prepare 函數解析和分析命令以創建准備好的語句。 對該表達式或命令的后續訪問將重用准備好的語句。

如果你嘗試過,你會這樣寫。 請注意在名稱中使用_而不是-以避免引用問題; 無需格式化。

CREATE OR REPLACE FUNCTION my_function2()
      RETURNS VOID
      LANGUAGE plpgsql AS
      $func$
      BEGIN
        PREPARE my_statement7 (text, text) AS
        INSERT INTO example (key, a_id)
        VALUES ($1, $2);

        EXECUTE my_statement7( 'value1', 'value2');
      END;
      $func$;

然而,第一次它會失敗(原因我不完全理解): ERROR: function my_statement7(unknown, unknown) does not exist 第二次調用它也會失敗: ERROR: prepared statement "my_statement7" already exists

暫無
暫無

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

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