PostgreSQL:使用字符串和变量创建外部 table
PostgreSQL: Create foreign table with string and variable
我的问题:我需要动态定义外部 table 并且每次都设置不同的 where 条件。我正在执行此操作,但在创建外国 table(via oracle_fdw).
期间出现错误,这对我来说没有意义
创建有效的外国 table:
CREATE FOREIGN TABLE MYFOREIGNTABLE
(
column1 int,
column2 text
)
SERVER fwdb
OPTIONS (table $$(
select
column1,
column2
from
table1
where
column3 = 5
and column4 = 'a'
)$$);
现在,如果我尝试拆分字符串以将我的变量放在那里(而不是我留下数字的变量,以便任何人都可以尝试),它会停止工作并且出现错误
[Code: 0, SQL State: 42601] ERROR: syntax error at or near "||"
CREATE FOREIGN TABLE MYFOREIGNTABLE
(
column1 int,
column2 text
)
SERVER fwdb
OPTIONS (table $$(
select
column1,
column2
from
table1
where
column3 = $$ || 5 || $$
and column4 = 'a'
)$$);
可以肯定的是,我在 select 中尝试了我的字符串,以确保我没有犯任何语法错误并且它没有问题
select $$(
select
column1,
column2
from
table1
where
column3 = $$ || 5 || $$
and column4 = 'a'
)$$
我尝试了一些其他的方法,比如使用 concat() 或将我的整个字符串放入变量 OPTIONS (table myvariable);
但都没有用。这里的正确语法是什么?
PostgreSQL 11.10 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5
20150623 (Red Hat 4.8.5-39), 64-bit
您必须使用字符串文字作为 FDW 选项的值,不允许使用您尝试使用的字符串连接等表达式。
您必须使用动态 SQL 构建完整的语句,例如
DO
$$DECLARE
var integer := 5;
BEGIN
EXECUTE
format(
E'CREATE FOREIGN TABLE MYFOREIGNTABLE (\n'
' column1 int,\n'
' column2 text\n'
') SERVER fwdb OPTIONS (\n'
' table ''(SELECT column1,\n'
' column2\n'
' FROM table1\n'
' WHERE column3 = %s\n'
' AND column4 = ''''a'''')'')',
var
);
END;$$;
对于字符串变量,您必须使用 quote_literal(quote_literal(var))
.
来正确引用
我的问题:我需要动态定义外部 table 并且每次都设置不同的 where 条件。我正在执行此操作,但在创建外国 table(via oracle_fdw).
期间出现错误,这对我来说没有意义创建有效的外国 table:
CREATE FOREIGN TABLE MYFOREIGNTABLE
(
column1 int,
column2 text
)
SERVER fwdb
OPTIONS (table $$(
select
column1,
column2
from
table1
where
column3 = 5
and column4 = 'a'
)$$);
现在,如果我尝试拆分字符串以将我的变量放在那里(而不是我留下数字的变量,以便任何人都可以尝试),它会停止工作并且出现错误
[Code: 0, SQL State: 42601] ERROR: syntax error at or near "||"
CREATE FOREIGN TABLE MYFOREIGNTABLE
(
column1 int,
column2 text
)
SERVER fwdb
OPTIONS (table $$(
select
column1,
column2
from
table1
where
column3 = $$ || 5 || $$
and column4 = 'a'
)$$);
可以肯定的是,我在 select 中尝试了我的字符串,以确保我没有犯任何语法错误并且它没有问题
select $$(
select
column1,
column2
from
table1
where
column3 = $$ || 5 || $$
and column4 = 'a'
)$$
我尝试了一些其他的方法,比如使用 concat() 或将我的整个字符串放入变量 OPTIONS (table myvariable);
但都没有用。这里的正确语法是什么?
PostgreSQL 11.10 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39), 64-bit
您必须使用字符串文字作为 FDW 选项的值,不允许使用您尝试使用的字符串连接等表达式。
您必须使用动态 SQL 构建完整的语句,例如
DO
$$DECLARE
var integer := 5;
BEGIN
EXECUTE
format(
E'CREATE FOREIGN TABLE MYFOREIGNTABLE (\n'
' column1 int,\n'
' column2 text\n'
') SERVER fwdb OPTIONS (\n'
' table ''(SELECT column1,\n'
' column2\n'
' FROM table1\n'
' WHERE column3 = %s\n'
' AND column4 = ''''a'''')'')',
var
);
END;$$;
对于字符串变量,您必须使用 quote_literal(quote_literal(var))
.