[英]Can I pass a variable through $1 to a "NOTIFY" command in PostgreSQL?
我有以下工作代碼:
CREATE EXTENSION IF NOT EXISTS plpython3u;
UPDATE pg_language SET lanpltrusted = true WHERE lanname LIKE 'plpython3u';
CREATE OR REPLACE FUNCTION test_notif_trigger_function() RETURNS trigger AS
$$
updateQuery = """
NOTIFY updateObject;
"""
plan = plpy.prepare(updateQuery)
plpy.execute(plan)
$$ LANGUAGE plpython3u;
DROP TRIGGER IF EXISTS test_notif_trigger ON columnTest;
CREATE TRIGGER test_notif_trigger
AFTER UPDATE OF state
ON columnTest
FOR EACH ROW EXECUTE PROCEDURE test_notif_trigger_function();
UPDATE columnTest C
SET state=8
WHERE C.id=1;
我現在想將一個字符串傳遞給我的 sql 代碼:
CREATE EXTENSION IF NOT EXISTS plpython3u;
UPDATE pg_language SET lanpltrusted = true WHERE lanname LIKE 'plpython3u';
CREATE OR REPLACE FUNCTION test_notif_trigger_function() RETURNS trigger AS
$$
updateQuery = """
NOTIFY updateObject, $1;
"""
plan = plpy.prepare(updateQuery, ["text"])
plpy.execute(plan, ["test"])
$$ LANGUAGE plpython3u;
DROP TRIGGER IF EXISTS test_notif_trigger ON columnTest;
CREATE TRIGGER test_notif_trigger
AFTER UPDATE OF state
ON columnTest
FOR EACH ROW EXECUTE PROCEDURE test_notif_trigger_function();
UPDATE columnTest C
SET state=8
WHERE C.id=1;
但這給了我這個錯誤:
ERROR: spiexceptions.SyntaxError: syntax error at or near "$1"
LINE 3: NOTIFY updateObject, $1;
我不明白我的錯誤:我嘗試了一個簡單的 SELECT 並且它起作用了。 但是我不能在 NOTIFY 上使用 $1。 您有任何想法或方法通過 plpython 通知自定義字符串嗎? (我的代碼應該傳遞一個帶有更新值的鑄造字典,所以我真的需要首先使用 plpython 然后使用 NOTIFY)
我終於通過使用字符串的format
方法找到了一種解決方法。
CREATE EXTENSION IF NOT EXISTS plpython3u;
UPDATE pg_language SET lanpltrusted = true WHERE lanname LIKE 'plpython3u';
CREATE OR REPLACE FUNCTION test_notif_trigger_function() RETURNS trigger AS
$$
updateQueryTemplate = """
NOTIFY updateObject, {value};
"""
updateQuery = updateQueryTemplate.format(value="test")
plan = plpy.prepare(updateQuery)
plpy.execute(plan)
$$ LANGUAGE plpython3u;
DROP TRIGGER IF EXISTS test_notif_trigger ON columnTest;
CREATE TRIGGER test_notif_trigger
AFTER UPDATE OF state
ON columnTest
FOR EACH ROW EXECUTE PROCEDURE test_notif_trigger_function();
UPDATE columnTest C
SET state=8
WHERE C.id=1;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.