嘗試執行標題中指定的操作時,我已經使 upsert 功能正常作業,但是當我嘗試對其進行引數化時,我只是超出了我的深度并且無法除錯它。
我的查詢:
CREATE OR REPLACE FUNCTION custom_upsert(target_value_input text,
target_table_input text,
target_column_input text,
OUT pk_output int)
LANGUAGE plpgsql AS
$func$
BEGIN
LOOP
execute 'SELECT id '
' FROM ' || target_table_input ||
' WHERE ' || target_column_input || ' = ' || target_value_input ||
' INTO pk_output';
EXIT WHEN FOUND;
execute 'INSERT INTO ' || target_table_input || 'AS o ( ' || target_column_input || ' )'
' VALUES ( ' || target_value_input || ' ) '
' ON CONFLICT ( ' || target_column_input || ' ) DO NOTHING '
' RETURNING o.id'
' INTO pk_output';
EXIT WHEN FOUND;
END LOOP;
END
$func$;
現在,當我嘗試使用該功能時,我得到:
ERROR: syntax error at or near "INTO"
LINE 1: ...module WHERE artifact_id = artifact_id_example_1 INTO pk_ou...
^
QUERY: SELECT id FROM maven_module WHERE artifact_id = artifact_id_example_1 INTO pk_output
CONTEXT: PL/pgSQL function custom_upsert(text,text,text) line 4 at EXECUTE
令我困惑的是,這種語法在非引數化版本中運行良好:
https://dbfiddle.uk/?rdbms=postgres_14&fiddle=765389a746d3a392bc646fbedb7ed3b3
我在引數化方面的嘗試:
https://dbfiddle.uk/?rdbms=postgres_14&fiddle=1bffab45d8a9587342a7c3253ea35fc8
https://dbfiddle.uk/?rdbms=postgres_14&fiddle=de6ba235aa21dae33b922f8fddac3b63
非常感謝您,第一次發帖,所以如果我在提問時有什么不同的地方,我很高興收到反饋
編輯:這是我的函式呼叫:
-- should return pk of existing artifact_id
SELECT custom_upsert('artifact_id_example_1', 'maven_module', 'artifact_id');
-- should return pk of new artifact_id
SELECT custom_upsert('artifact_id_example_2', 'maven_module', 'artifact_id');
uj5u.com熱心網友回復:
不要像這樣連接字串。該功能format()使您的生活更輕松(更安全),例如
EXECUTE format('INSERT INTO %1$I AS o (%2$I)
VALUES (%3$L) ON CONFLICT (%2$I) DO NOTHING RETURNING o.id',
target_table_input,
target_column_input,
target_value_input) INTO pk_output;
%I將用雙引號包裹識別符號,這在表或列區分大小寫或包含特殊字符時很方便。%L將用單引號包裹文字1$,2$并3$在所提供的變數位置format()呼叫,如果一個變數被多次使用會非常方便。
演示: db<>fiddle
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/380038.html
標籤:sql 数据库 PostgreSQL的 参数传递 plpgsql
下一篇:列重復時如何從表中選擇行?
