如何在“EXECUTE format()”中使用 unnest 参数在 plpgsql 中?

发布于 2025-01-13 03:01:01 字数 1736 浏览 3 评论 0原文

我试图在“unnest”内发送一个数组,但在“EXECUTE format()”中使用它,我该怎么做?

CREATE TABLE IF NOT EXISTS table_xvx(
    row_id SERIAL NOT NULL PRIMARY KEY,
    open FLOAT(36),
    high FLOAT(36),
    low FLOAT(36),
    close FLOAT(36),
    volume FLOAT(36),
    capital FLOAT(36),
    transactions FLOAT(36)
)

类型

CREATE TYPE type_ohlcvct AS(
type_open float,
type_high float,
type_low float,
type_close float,
type_volume float,
type_capital float,
type_transactions float
);

函数

CREATE OR REPLACE FUNCTION insert_data_ohlcvct(table_name_ varchar(70) , data_list type_ohlcvct[]) 
RETURNS VOID AS
$$
DECLARE
    error_message varchar;
BEGIN
    EXECUTE format(
        'INSERT INTO %I(open,high,low,close,volume,capital,transactions)
        SELECT * FROM unnest(%s)',table_name_ , data_list); 
END;
$$ LANGUAGE plpgsql;

调用方式

SELECT insert_data_ohlcvct('table_xvx' ,'{"(10,10,10,10,10,10,10)","(10,10,10,10,10,10,10)"}'::type_ohlcvct[]);
SELECT insert_data_ohlcvct('table_xvx' , (ARRAY['(10,10,10,10,10,10,10)','(10,10,10,10,10,10,10)'])::type_ohlcvct[]);
SELECT insert_data_ohlcvct('table_xvx' , ARRAY['(10,10,10,10,10,10,10)'::type_ohlcvct,'(10,10,10,10,10,10,10)']);

错误总是一样

ERROR:  syntax error at or near "{"
LINE 2:   SELECT * FROM unnest({"(10,10,10,10,10,10,10)","(10,10,10,...
                               ^
QUERY:  INSERT INTO table_xvx(open,high,low,close,volume,capital,transactions)
        SELECT * FROM unnest({"(10,10,10,10,10,10,10)","(10,10,10,10,10,10,10)"})
CONTEXT:  PL/pgSQL function insert_data_ohlcvct(character varying,type_ohlcvct[]) line 5 at EXECUTE
SQL state: 42601

Im trying to send an array inside a "unnest" but using it in an a "EXECUTE format()" , how can i do that?

Table

CREATE TABLE IF NOT EXISTS table_xvx(
    row_id SERIAL NOT NULL PRIMARY KEY,
    open FLOAT(36),
    high FLOAT(36),
    low FLOAT(36),
    close FLOAT(36),
    volume FLOAT(36),
    capital FLOAT(36),
    transactions FLOAT(36)
)

Type

CREATE TYPE type_ohlcvct AS(
type_open float,
type_high float,
type_low float,
type_close float,
type_volume float,
type_capital float,
type_transactions float
);

Function

CREATE OR REPLACE FUNCTION insert_data_ohlcvct(table_name_ varchar(70) , data_list type_ohlcvct[]) 
RETURNS VOID AS
$
DECLARE
    error_message varchar;
BEGIN
    EXECUTE format(
        'INSERT INTO %I(open,high,low,close,volume,capital,transactions)
        SELECT * FROM unnest(%s)',table_name_ , data_list); 
END;
$ LANGUAGE plpgsql;

Ways to call

SELECT insert_data_ohlcvct('table_xvx' ,'{"(10,10,10,10,10,10,10)","(10,10,10,10,10,10,10)"}'::type_ohlcvct[]);
SELECT insert_data_ohlcvct('table_xvx' , (ARRAY['(10,10,10,10,10,10,10)','(10,10,10,10,10,10,10)'])::type_ohlcvct[]);
SELECT insert_data_ohlcvct('table_xvx' , ARRAY['(10,10,10,10,10,10,10)'::type_ohlcvct,'(10,10,10,10,10,10,10)']);

The error is always the same

ERROR:  syntax error at or near "{"
LINE 2:   SELECT * FROM unnest({"(10,10,10,10,10,10,10)","(10,10,10,...
                               ^
QUERY:  INSERT INTO table_xvx(open,high,low,close,volume,capital,transactions)
        SELECT * FROM unnest({"(10,10,10,10,10,10,10)","(10,10,10,10,10,10,10)"})
CONTEXT:  PL/pgSQL function insert_data_ohlcvct(character varying,type_ohlcvct[]) line 5 at EXECUTE
SQL state: 42601

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

埋情葬爱 2025-01-20 03:01:01

不要将参数作为字符串传递给动态 SQL - 将它们作为参数传递:

EXECUTE format(
    'INSERT INTO %I(open,high,low,close,volume,capital,transactions)
    SELECT * FROM unnest($1)',table_name_)
USING data_list;  --<< passes the value to the $1 placeholder

Don't pass parameters to dynamic SQL as strings - pass them as parameters:

EXECUTE format(
    'INSERT INTO %I(open,high,low,close,volume,capital,transactions)
    SELECT * FROM unnest($1)',table_name_)
USING data_list;  --<< passes the value to the $1 placeholder
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文