如何在 Postgres 中为 table 中的虚拟列创建数据库链接?
How to Create DB links in Postgres for Virtual Columns in a table?
我有一个使用 dblink 的 Oracle 查询,
SELECT * FROM SSP2_PCAT.PRODUCT_TYPES WHERE ( PRODUCT_TYPE) IN
(SELECT PRODUCT_TYPE FROM SSP2_PCAT.PRODUCT_TYPES
MINUS
SELECT PRODUCT_TYPE FROM SSP2_PCAT.PRODUCT_TYPES@FPORDDEV);
现在我使用 dblink 将它转换为 Postgres,
SELECT * FROM SSP2_PCAT.PRODUCT_TYPES WHERE (PRODUCT_TYPE) IN
(SELECT PRODUCT_TYPE FROM SSP2_PCAT.PRODUCT_TYPES
EXCEPT
SELECT * from dblink
('dbname=NTE5OFF port=5432 host=xxxxx
user=yyyyy password=zzzzz','SELECT PRODUCT_TYPE FROM
SSP2_PCAT.PRODUCT_TYPES')
as t (PRODUCT_TYPE character varying(60)) );
现在一切正常!
现在,我如何将下面相同的 Oracle sql 转换为虚拟列,如下所示,
SELECT 'ITO' FRM, SALES_CD, SALES_CODE_DESC, ACTIVE_IND
FROM SSP2_PCAT.ACCT_LVL_SALES_CDS
EXCEPT
SELECT 'ITO' FRM, SALES_CD, SALES_CODE_DESC, ACTIVE_IND
FROM SSP2_PCAT.ACCT_LVL_SALES_CDS@FPORDDEV;
我在 Postgres 中尝试了如下代码,但显然在给定虚拟列的情况下会抛出错误,
SELECT 'ITO' FRM, SALES_CD, SALES_CODE_DESC, ACTIVE_IND FROM
SSP2_PCAT.ACCT_LVL_SALES_CDS
EXCEPT
SELECT * FROM dblink
('dbname=NTE5OFF port=5432 host=xxxxx
user=yyyyy password=zzzzz',
'SELECT FRM, SALES_CD, SALES_CODE_DESC, ACTIVE_IND FROM
SSP2_PCAT.ACCT_LVL_SALES_CDS')
as t ( FRM varchar,
sales_cd character varying(15),
sales_code_desc character varying(150),
active_ind character varying(3) ) );
如果我遗漏了什么,有人可以告诉我吗?
你必须
SELECT 'ITO' FRM ...
在 dblink 查询中,但由于它在字符串中,因此您必须将单引号加倍以转义它们:
'SELECT ''ITO'' FRM ...'
但是在postgres_fdw中使用外部表会简单得多。
我有一个使用 dblink 的 Oracle 查询,
SELECT * FROM SSP2_PCAT.PRODUCT_TYPES WHERE ( PRODUCT_TYPE) IN
(SELECT PRODUCT_TYPE FROM SSP2_PCAT.PRODUCT_TYPES
MINUS
SELECT PRODUCT_TYPE FROM SSP2_PCAT.PRODUCT_TYPES@FPORDDEV);
现在我使用 dblink 将它转换为 Postgres,
SELECT * FROM SSP2_PCAT.PRODUCT_TYPES WHERE (PRODUCT_TYPE) IN
(SELECT PRODUCT_TYPE FROM SSP2_PCAT.PRODUCT_TYPES
EXCEPT
SELECT * from dblink
('dbname=NTE5OFF port=5432 host=xxxxx
user=yyyyy password=zzzzz','SELECT PRODUCT_TYPE FROM
SSP2_PCAT.PRODUCT_TYPES')
as t (PRODUCT_TYPE character varying(60)) );
现在一切正常!
现在,我如何将下面相同的 Oracle sql 转换为虚拟列,如下所示,
SELECT 'ITO' FRM, SALES_CD, SALES_CODE_DESC, ACTIVE_IND
FROM SSP2_PCAT.ACCT_LVL_SALES_CDS
EXCEPT
SELECT 'ITO' FRM, SALES_CD, SALES_CODE_DESC, ACTIVE_IND
FROM SSP2_PCAT.ACCT_LVL_SALES_CDS@FPORDDEV;
我在 Postgres 中尝试了如下代码,但显然在给定虚拟列的情况下会抛出错误,
SELECT 'ITO' FRM, SALES_CD, SALES_CODE_DESC, ACTIVE_IND FROM
SSP2_PCAT.ACCT_LVL_SALES_CDS
EXCEPT
SELECT * FROM dblink
('dbname=NTE5OFF port=5432 host=xxxxx
user=yyyyy password=zzzzz',
'SELECT FRM, SALES_CD, SALES_CODE_DESC, ACTIVE_IND FROM
SSP2_PCAT.ACCT_LVL_SALES_CDS')
as t ( FRM varchar,
sales_cd character varying(15),
sales_code_desc character varying(150),
active_ind character varying(3) ) );
如果我遗漏了什么,有人可以告诉我吗?
你必须
SELECT 'ITO' FRM ...
在 dblink 查询中,但由于它在字符串中,因此您必须将单引号加倍以转义它们:
'SELECT ''ITO'' FRM ...'
但是在postgres_fdw中使用外部表会简单得多。