使用单个 .p 文件连接到多进程数据库

Connecting to Multiple Progress Database using single .p file

有没有办法连接到多个进度数据库。 在当前情况下,我们所做的是使用多个 .p 文件来获取数据。 例子: 第一个程序将从客户数据库中获取数据,并使用我们用来连接到第二个数据库的 运行 命令。 第二个程序我们使用输入参数来映射值。

我的问题是,有没有一种方法可以在一个程序中做到这一点? 下面是示例程序:

/*FIRST Program***/  

在 customer.cust-id EQ "v456" NO-LOCK NO-ERROR 处找到第一个客户。 IF AVAILABLE 客户 THEN 运行 /HOME/dbconnect.p(输入 customer.cust-id,“帐户”)。 运行 /HOME/program-2.p(输入 customer.cust-id).

/第二个节目**/ 将输入参数 ipcCust-id 定义为字符。

FOR EACH billing WHERE billing.cust-id EQ ipcCust-id NO-LOCK: 显示 billing.DATE。 结束。

对于静态查询,没有。您始终需要在 运行 .p 之前连接数据库。对于动态查询,由于在 r 代码中没有对数据库的引用,您可以从单个 .p.

中做任何您想做的事情

您可以在 运行 时使用 CONNECT 语句连接到数据库。您不能在同一过程中连接和访问新连接的数据库 - 使用新连接的代码必须在子过程中 运行。

例如,您可以这样做:

define variable dbList as character no-undo.

define variable i as integer no-undo.
define variable n as integer no-undo.

dbList = "db1,db2,db3".

n = num-entries( dbList ).

do i = 1 to n:

  connect value( entry( i, dbList )) no-error.

  run "./p1.p".
  current-language = current-language.    /* forces the r-code cache to be cleared */

  disconnect value( entry( i, dbList )) no-error.

end.

和p1.p:

/* p1.p
 */

define variable i as integer no-undo.

for each _field no-lock:  /* count the number of fields defined in the schema */
  i = i + 1.
end.

display pdbname(1) i.

pause.

p1.p 只是一个愚蠢的小程序,用于演示数据访问实际上来自 3 个不同的数据库。

如果同一过程将 运行 针对多个不同的数据库,则“current-language = current-language”很重要。如果没有那个小块,该过程可能会被缓存,并且它会记住它连接到的以前的数据库。

或者如果您更喜欢 Stefan 的动态查询方法:

define variable dbList as character no-undo.

define variable i as integer no-undo.
define variable n as integer no-undo.

define variable b as handle no-undo.
define variable q as handle no-undo.

create query q.

dbList = "db1,db2,db3".

n = num-entries( dbList ).

do i = 1 to n:

  connect value( entry( i, dbList )) no-error.

  create buffer b for table "_field".

  q:set-buffers( b ).
  q:query-prepare( "preselect each _field no-lock" ).
  q:query-open().

  display pdbname( 1 ) q:num-results.
  pause.

  q:query-close.

  delete object b.

  disconnect value( entry( i, dbList )) no-error.

end.

是否需要动态连接(在 .p 内)? 如果没有,在启动程序时连接数据库可能更容易...

(我在windows,但应该可以识别)

prowin -pf <path-to>\connect.pf -p <path-to>\program.p

where connect.pf contains:
-db <connection settings for db 1>
-db <connection settings for db 2>
<...>