簡體   English   中英

如何要求用戶在PostgresSQL / plpgsql中輸入輸入?

[英]How can I ask user to enter the input in PostgresSQL/plpgsql?

嗨,我想在我的DO BEGIN和END塊中接受用戶的輸入...

我試圖在內部使用/ prompt,但是它不起作用。

我們還有其他方法可以在函數內部使用它還是可以在postgres中使用它?

重要說明:PLpgSQL是服務器端唯一的語言-不可能進行任何用戶交互操作。 在啟動PLpgSQL代碼之前,您必須在客戶端收集輸入,並將用戶輸入壓入那里作為參數。

DO語句是服務器端的語句,因此您不能在那里執行任何交互操作。

DO語句不支持參數,因此不容易將任何參數推入DO語句,但是可以使用自定義配置變量:

\prompt 'enter some text: ' psqlvar
\o /dev/null
select set_config('psql.psqlvar', :'psqlvar', false);
\o
do $$
  DECLARE var text = current_setting('psql.psqlvar');
BEGIN
  RAISE NOTICE 'entered text is: %', var;
END;
$$;

函數set_config用於將客戶端變量:psqlvar的內容移動到服務器端會話變量psql.psqlvar 該服務器端變量的內容由函數current_setting

您必須將服務器端和客戶端的內容分開。 DO語句在服務器端評估。 psql \\prompt命令在客戶端評估。

不好的想法是,使用用戶名作為會話標識符在存儲過程中要求用戶輸入。 這是一個非常非常糟糕的主意。 是的,某些環境中有一些方法可以做到這一點。 但是,僅僅因為您可以做,並不意味着您應該做。 例如,我聽說有人使用pl / python建立與客戶端計算機的網絡連接並詢問更多信息。 但是,坦率地說,這是DailyWTF的領土。 它還假定客戶端上有協議和偵聽器來請求此請求,因此在pgadmin中不起作用。

現在,DO創建一個沒有參數的匿名函數並立即執行它。 這似乎是您真正的問題所在。

  1. 最好的解決方案是只創建一個帶有參數的實際函數,並在那里接受輸入。 然后可以在任何地方使用。 您可以重復使用,修改安全性等。聽起來這正是您所需要的。

  2. 未能在發送do塊之前對其進行預處理。

想要在輸入中重用PL / PGSQL代碼的最佳設計是使用一個函數(請參見CREATE FUNCTION )而不是DO (請注意,如果您擔心,可以將它們放在另一個模式中)。

暫無
暫無

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

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