通过OpenEdge ODBC和PHP交叉加入Progress数据库

时间:2012-10-22 19:20:39

标签: php odbc progress-4gl openedge

我目前在我的网络服务器上设置了2个ODBC连接。一个连接到我们的企业QAD数据库,另一个连接到我们的自定义数据库,用于扩展我们的数据库。在这个特例中,我在QAD数据库中有我的员工记录,然后是自定义数据库中另一个表中的员工编号。

有没有办法在php中设置两个odbc连接之间的交叉连接,这样我就不必遍历第一个查询的结果,并根据返回的结果发送几个查询来绑定我的在php数组中一起记录?

我能想到的最好的方法是从我的自定义数据库的第一个查询中构建一个IN子句,将第二个查询发送到QAD数据库,然后在php中进行数组合并。但是,与普通的SQL连接相比,这是一个非常缓慢的过程。

3 个答案:

答案 0 :(得分:1)

不确定您是否已找到解决方案,但有一篇关于如何执行此操作的进度文章。

Quick Guide To Setting Up MultiDatabase ODBC Connectivity

我有类似的要求 - 我想在主要QAD数据库中的表和自定义数据库中的自定义表之间创建连接。虽然我的设置略有不同,但我已经对它进行了测试并且效果很好。我需要从Microsoft SSRS连接到QAD以创建针对QAD数据的报告 - 我需要创建一些标准QAD报告设计者无法处理的报告。

我在Progress 10.1c上测试了这个(此方法仅在10.1b +中支持)。

所以我采取的步骤是:

  1. 根据与主数据库和自定义数据库相关的文章创建oesql.properties配置文件。
  2. 在客户端计算机上创建ODBC系统DSN(在我的情况下是运行带有SSRS的SQL Server 2008 R2的Windows Server 2008 R2计算机),并根据文章使用其他数据库引用。
  3. 通过ODBC DSN在SQL Server中创建链接服务器
  4. 创建一个视图,该视图使用OpenQuery语法通过链接服务器从QAD(在我的情况下,这是在ReportServer数据库中创建)中提取数据。
  5. 使用第3点中的视图作为数据源创建标准T-SQL查询。这最终是我的SSRS报告的数据源。
  6. 我认为OS / Database和ODBC驱动程序的位版本匹配但尚未确认这一点很重要。

    虽然我的要求与您的要求不同,但最重要的是QAD服务器配置和ODBC设置是关键。只要您的PHP客户端可以在OpenQuery命令方面执行类似的功能,您就可以使用它。我没有任何PHP经验,所以无法帮助你。

    看起来有点复杂,但实际上效果非常好,在很多情况下,使用QAD浏览实际上优于查询数据!

    希望这有帮助。

    修改 这是一个OpenQuery命令的示例 - 您可以看到该表以正常方式连接工作,但只是需要和表引用中的其他部分。

    CREATE VIEW [dbo].[vQADData] AS SELECT * FROM OPENQUERY(LinkedServerName,
    '
    SELECT custTable.item_date AS DESP_DATE, so_mstr.so_site AS SITE, so_mstr.so_po AS PO_NO, so_mstr.so_inv_nbr AS INV_NO,
          ad_mstr.ad_name AS ADNAME, ad_mstr.ad_city AS ADCITY, ad_mstr.ad_state AS ADSTATE
    FROM customdbname.pub.customtable custTable
    INNER JOIN pub.so_mstr ON so_mstr.so_nbr = custTable.so_nbr
    INNER JOIN pub.ad_mstr ON ad_mstr.ad_addr = so_mstr.so_ship
    INNER JOIN pub.sod_det ON sod_det.sod_nbr = custTable.so_nbr
    WHERE so_mstr.so_site = ''SiteName'' AND so_mstr.so_shipvia = ''SHIPPER'' AND custTable.item_date IS NULL
    ')
    

    然后只使用普通的SQL语法访问视图。

    SELECT * FROM vQADData
    

答案 1 :(得分:1)

感谢Tiran的建议解决方案。对于那些试图通过SQL服务器引用多个表的人,正如Tiran所做的那样,我有额外的输入。

我正在尝试从多个源(Progress)中提取数据,同时从同一个表结构中提取数据并将其插入到我们的数据仓库(SQL Server)中。所以我只是想在不同的数据库中建立多个相同结构化表的联合。 Tiran的解决方案让我走上了同样的道路,但是Progress数据库的链接是一个繁琐的过程,需要我找到一个具有2-3天空闲时间(他的引用)的Progress DBA来将它们放在一起。当我直接与Progress的人交谈时,他们还指出如果我在Progress侧创建了一个带有union的视图,它将依次从视图中的每个源中提取数据,而不是同时提取。然而,这使我得到了另一个发现,看起来它将解决我们的需求并完全跳过处理在Progress方面链接表。

这是一个包含三个源的示例,相同的表(这应该适用于交叉源加入不同的表)。此处的所有名称仅为了清楚起见而提供。

Source 1 - Table_A
Source 2 - Table_A
Source 3 - Table_A
  • 创建名为source1的Source 1的ODBC连接。
  • 创建名为source2的Source 2的ODBC连接。
  • 创建名为source3的Source 3的ODBC连接。 (注意,您通常希望确保将连接设置设置为Read Uncommitted。)

在SQL Server中,创建到每个源的链接服务器连接。

ls_source1
ls_source2
ls_source3

在您需要引用Progress数据库的SQL Server数据库中,创建一个视图,使用union将三个不同的链接服务器连接连接在一起。链接的服务器引用将需要使用openquery。此示例使用来自每个链接服务器源的select *,假定所有列都是从每个源命名和结构相同的。

CREATE VIEW table_name_v as 
SELECT *
FROM 
(SELECT *
FROM OPENQUERY(ls_source1,
'select *
from source1.dbo.Table_A
')
union
SELECT *
FROM OPENQUERY(ls_source2,
'select *
from source2.dbo.Table_A
'
union
SELECT *
FROM OPENQUERY(ls_source3,
'select *
from source3.dbo.Table_A
'
)
) x

创建视图后,您现在可以同时查询不同Progress源中的所有三个表。无需在进度方面进行额外设置。

有一个重要的警告,我正在努力解决这个问题。如果您使用64位SQL Server的64位计算机,则需要使用64位驱动程序通过链接服务器选项连接到Progress数据库。我的需求要求我在同一台机器上同时拥有32位和64位驱动程序并遇到问题,因为显然它们在同一台机器上不能很好地协同工作。我已经能够在同一台机器上安装64位和32位驱动程序(在Progress'网站上有一个小故障本应该给我发送该驱动程序的链接但是我能够让那里的某人指引我到正确的地方检索64位odbc驱动程序。普通人不应该只需要两个驱动程序,只能使用64位。作为替代工作,如果我不能让两个驱动程序共存于同一台机器上,我发现并确认Connx公司提供的驱动程序提供64位/ 32位桥接器,可以解决该问题。理想情况下,不需要第三方软件。

现在不幸出现了一个新问题,因为我设置和使用的链接服务器不再正常运行。向前迈出两步,退一步......

我以为我会分享我的发现,因为我确信还有其他人在寻找。

答案 2 :(得分:0)

简答:两个连接之间不能有JOIN个表。

场景(所有这些都在一个连接中)

  • 默认情况下,在大多数数据库中,您可以通过在表之前添加模式名称前缀来连接不同模式中的表,如下所示:

(...) FROM defaultDB.TableA INNER JOIN extensionDB.TableA ON ({Condition}) (...)

  • 根据您的数据库(我不深入了解Progress DB),您可能无法加入属于不同服务器中的模式的表。

  • 在不同的数据库中连接表(例如:Progress x MySQL),它更加复杂。我听说过Oracle Gateway,一种专有的解决方案(不太确定)可以实现最后一种情况。

总结:

如果您的情况不适合第一种情况(指出最明显的方法),我想最短的解决方案是分析您的代码并优化可能的性能瓶颈。调整parallel processing的代码可能会有更大胆的改进。