使用单个 .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>
<...>
有没有办法连接到多个进度数据库。 在当前情况下,我们所做的是使用多个 .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>
<...>