簡體   English   中英

EDB Postgresql 中的 \\set 命令

[英]\set command in EDB Postgresql

在 EDB Postgres 中, \\set命令用於設置變量,例如\\set detpno 80並且在插入時我們可以使用:deptno instaed 實際值,如

insert into dept values (:deptno, 'SALES', 'HYD');

它工作正常,但是當我在程序或匿名塊中使用它時,它會拋出錯誤。

簡單的匿名塊

begin
insert into dept values (:deptno, 'SALES', 'LONDON');
end;

當我執行此塊時,出現以下錯誤

錯誤:“:”處或附近的語法錯誤
第 2 行:插入 dept1 值 (:deptno, 'SALES', 'BAN');

請幫助我在過程或函數中使用 \\set 變量。

將 :varname 替換為以前的 \\set 是特定數據庫客戶端的一個特性,即“psql”(盡管其他客戶端可能已經模擬了這種行為)。 它不是數據庫本身的特性。 數據庫看不到 :varname,它只看到它被替換的內容。

當您使用匿名代碼塊時,您繞過了客戶端的替換行為。

也許您應該創建一個函數,它以適當的方式聲明它接受哪些參數,而不是使用類似 shell 的變量插值。

psql 變量不能在服務器端代碼中使用 - 匿名塊。 這是不允許的 - 替換被阻止在字符串中。 您可以使用一種解決方法。

  1. 設置自定義 guc 變量(自定義配置值)。 請求前綴“xx”。

     postgres=# \\set myval AHOJ postgres=# select set_config('xx.myval', :'myval', false); ┌────────────┐ │ set_config │ ╞════════════╡ │ AHOJ │ └────────────┘ (1 row)
  2. 現在您可以通過服務器端的current_setting函數讀取值

    postgres=# do $$ begin raise notice '%', current_setting('xx.myval'); end; $$; NOTICE: AHOJ DO

目前沒有任何其他方法可以做到這一點。 這是 Postgres - 但 EDB 在這種情況下非常相似。

暫無
暫無

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

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