【问题标题】:PostgreSQL: Create foreign table with string and variablePostgreSQL:使用字符串和变量创建外部表
【发布时间】:2021-03-13 21:07:45
【问题描述】:

我的问题:我需要动态定义外部表,并且每次都设置不同的 where 条件。我在函数中执行此操作,但在创建外部表(通过 oracle_fdw)期间遇到对我没有意义的错误。

创建有效的外部表:

CREATE FOREIGN TABLE MYFOREIGNTABLE 
(
column1 int,
column2 text
)
SERVER fwdb
OPTIONS (table $$(
  select
    column1,
    column2
  from
    table1
  where 
   column3 = 5
   and column4 = 'a'
)$$);

现在,如果我尝试拆分字符串以放置我的变量(而不是变量,我将数字留在那里以便任何人都可以尝试),它会停止工作并且我收到错误

[代码:0,SQL 状态:42601] 错误:“||”处或附近的语法错误

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); 但都没有奏效。这里的正确语法是什么?

x86_64-pc-linux-gnu 上的 PostgreSQL 11.10,由 gcc (GCC) 4.8.5 编译 20150623(红帽 4.8.5-39),64 位

【问题讨论】:

  • 您使用的是哪个外部数据包装器? oracle_fdw?
  • 是oracle_fdw连接oracle数据库

标签: postgresql foreign-data-wrapper oracle-fdw


【解决方案1】:

您必须使用字符串文字作为 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)) 正确引用。

【讨论】:

  • 谢谢你,它有效,但你能解释一下开头的E是什么意思吗?是否可以将 ' 替换为 $$ 作为字符串引用?
  • E 是一个“扩展字符串文字”,我使用它只是为了可以写\n 换行。如果需要,您可以将整个查询写在一行中。当然,您可以使用美元报价,但您需要使用与周围 $$ 不同的引号,例如 $query$。这可能会更好,因为你只有一层双引号。
猜你喜欢
  • 2014-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-24
  • 2013-04-12
  • 1970-01-01
相关资源
最近更新 更多