亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

表名作為PostgreSQL函數參數

表名作為PostgreSQL函數參數

MMTTMM 2019-05-31 13:11:44
表名作為PostgreSQL函數參數我想在Postgres函數中傳遞一個表名作為參數。我試過這個代碼:CREATE OR REPLACE FUNCTION some_f(param character varying) RETURNS integer  AS $$     BEGIN     IF EXISTS (select * from quote_ident($1) where quote_ident($1).id=1) THEN      return 1;     END IF;     return 0;     END;$$ LANGUAGE plpgsql;select some_f('table_name');我得到了這個:ERROR:  syntax error at or near "."LINE 4: ...elect * from quote_ident($1) where quote_ident($1).id=1)...     ^********** Error **********ERROR: syntax error at or near "."這是我在更改為這個時所犯的錯誤select * from quote_ident($1) tab where tab.id=1:ERROR:  column tab.id does not exist LINE 1: ...T EXISTS (select * from quote_ident($1) tab where tab.id...很可能,quote_ident($1)有效,因為如果沒有where quote_ident($1).id=1我得到了1,這意味著某些東西被選中了。為什么第一個quote_ident($1)工作和第二次不是同時進行嗎?這怎么能解決呢?
查看完整描述

3 回答

?
jeck貓

TA貢獻1909條經驗 獲得超7個贊

在plpgsql代碼中,執行語句必須用于表名或列來自變量的查詢。還有IF EXISTS (<query>)構造不允許在query是動態生成的。

這是您的函數,兩個問題都解決了:

CREATE OR REPLACE FUNCTION some_f(param character varying) RETURNS integer 
AS $$DECLARE
 v int;BEGIN
      EXECUTE 'select 1 FROM ' || quote_ident(param) || ' WHERE '
            || quote_ident(param) || '.id = 1' INTO v;
      IF v THEN return 1; ELSE return 0; END IF;END;$$ LANGUAGE plpgsql;


查看完整回答
反對 回復 2019-05-31
  • 3 回答
  • 0 關注
  • 3270 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號