1.过程调用
上一篇文章里简单提到调用一个内部的子过程只需要 run procedure-name(parameters). 并且子过程是不要预先声明的。
一个progress文件可以保存为.p结尾,表示是一个procedure文件。
简单地,你可以在命令行模式下:
prowin32 -p my.p

如果你的子过程比较大,或者需要反复调用,这时候你不可能每次在你的主程序里定义它,怎么办呢,可以把一个子过程存储为一个单独的.p文件,
调用的时候采用:
run 相对路径/my_subproc.p(parameters)

如果my_subproc.p和你的主程序在同一目录下,并且主程序所在目录为当前工作目录,则可以直接run my_subproc.p. 如果它是在一个子目录下,比如MySubs.目录结构如下:
main.p
MySubs
MySubsmy_subproc.p
那么你可以run MySubs/my_subproc.p(parameters). 这里的路径分隔符之所以使用/而不是是为了让其也可以在unix环境中运行。

下面具个例子,这些例子都存储在和主程序同目录:
/* 文件名:proc1.p */
/*注释是使用 “/*你的注释*/" 来注明的,并且可以嵌套*/
define input parameter p1 as int no-undo.
define input parameter p2 as int no-undo.
define output parameter sum as int no-undo.
sum = p1 + p2.

/*main.p*/

define variable mi as int no-undo.
run pro1.p(1,2,output mi).
message mi. /*mi = 3*/

注意:
如果输入参数类型是input,则在调用是实参可以省略。但是如果是input-output或者output是不可以省略的。

那么如果是函数怎么办呢?不要紧,好友另外一种文件类型 .i文件。

.i文件是一个include文件。比如说有一个 init.i:
define variable l_i as int no-undo.

function msum return int (input p1 as int,input p2 as int):
return p1 + p2.
end function.

procedure showint:
define input parameter pi as int no-undo.

message pi.
end procedure.

则在你的主程序文件里可以这样引用它 {init.i}. 这样就相当于在这个地方定义了变量l_i和函数以及子过程。这一点有点像c语言里的宏定义。

比如main.p:
{init.i}
l_i = msum(1,2).
run showint(l_i).

这个完全等价与main2.p
define variable l_i as int no-undo.

function msum return int (input p1 as int,input p2 as int):
return p1 + p2.
end function.

procedure showint:
define input parameter pi as int no-undo.

message pi.
end procedure.

l_i = msum(1,2).
run showint(l_i).

2.高级过程调用
有的时候你所使用的外部过程要使用中间变量,比如说引用参数;或者一系列的过程具有要共同完成一个任务,怎么办呢?
不要紧,你可以把这一系列的变量,过程还有函数都写在一个.p文件里。不过呢,要先说明一下几个关键字。
run前面说过了是用来调用过程的,现在在介绍它更多的属性。
run { proc_name | value(proc_name) } persistent set proc-handle (parameter1,parameter2,...,parametern).
run { proc_name | value(proc_name) } in proc-handle.
proc_name可以直接是过程的名字,也可以是一个字符串表达式, 比如 run my.p. 就等价于 run value("my.p").这个好处接下来再讲。
persistent表明你所调用的外部过程(这个属性只对外部过程调用有效,内部子过程无效)会一直存在,你若想要再次引用它内部的其他子过程时,就可以使用句柄proc-handle并且采用第二种方法.

dynamic-function("func-name" in proc-handle, param1,param2,...)是用来调用持久过程的内部函数的。

现在我们有一个外部过程文件mysubs.p,它包含了一个子过程,一个子函数:
/*----------------------------------------------------*/
define input parameter pi as int no-undo.

define variable li as int no-undo.

li = pi.
MESSAGE li.

procedure add1:
li = li + 1.
end procedure.

function multi return int(input p1 as int):
return li * p1.
end function.

/*-----------------------------------------------------------*/
当你要调用的时候,可以用如下方法main3.p:

define variable h1 as handle no-undo.
run mysubs.p persistent set h1(2). /*注意,这个时候mysubs.p中的li已经被初始化为2了*/

define variable mi as int no-undo.
mi = dynamic-function("multi" in h1,3). /*调用*/
MESSAGE mi . /*mi = 6 = 2*3 */

run add1 in h1. /*li = 3*/

mi = dynamic-function("multi" in h1,3).
MESSAGE mi. /*mi = 6*/

delete procedure h1. /*使用完删除对象释放内存*/

3.高级过程调用(续)
上面讲到了调用的时候过程名可以是一个字符串表达式。我想因为没有函数指针之类的东西,这样子可以近似的代替函数指针吧。
define variable func-names as char extent 3. /*定义了一个维数为3的字符串数组*/
func-names[1] = "addd".
func-names[2] = "minus".
func-names[3] = "product".

function addd return int (input p1 as int, input p2 as int):
return p1 + p2.
end function.

function minus return int (input p1 as int, input p2 as int):
return p1 - p2.
end function.

function product return int (input p1 as int, input p2 as int):
return p1 * p2.
end function.

define variable i as int no-undo.

do i = 1 to 3:
message dynamic-function(func-names[i],1,2).
end.

func-names[1] = "proc1".
func-names[2] = "proc2".
func-names[3] = "proc3".

procedure proc1:
message 1.
end procedure.

procedure proc2:
message 2.
end procedure.

procedure proc3:
message 3.
end procedure.

do i = 1 to 3:
run value(func-names[i]).
end.
/*----------------------------------------------*/
另 外一个大大的好处就是你可以直接把一个过程的名字作为参数传送进来,当然前提是这个文件存在。 c语言的解决方法是把过程或者函数写在一个dll文件里,通过loadlibrary和getProcAddress实现。比如你可以在数据库中存储被调 用过程的名字,对不同的客户开发不同的程序,设置不同的名字即可。
当然你说也可以用select(vb用)或者switch(c/c++/java用),不过一旦编译之后就不能添加新的了吧。

4.全局变量

progress的全局变量的定义是这样的:
define [[new [global]] shared] variable g_my_Variable as dataType no-undo.
不带global参数的称谓局部共享变量。两者的区别是,局部共享变量可以被被调用程序访问,并且可以继承。
比如p1.p定义了define new shared variable mshare as char no-undo. 接着p1.p调用了p2.p,p2.p又调用了p3.p,那么在p2.p和p3.p里都是可以访问到mshare的。
全 局共享变量的不同之处在于,如果定义一个全局共享变量在p2.p,p1.p在调用p2.p之后调用p4.p,那么p4.p是仍然可以访问全局共享变量的, 即使创建它的程序p2.p已经结束了。为什么呢,是因为它存在于全局共享内存里。所以一旦创建,它就一直在那里,直到整个应用程序结束。
p1.p
/*----------------------------------------------*/
define new shared variable mshare as char.
mshare = "shared".
run p2.p.
run p4.p.

p2.p
/*---------------------------------------------*/
define new global shared gvar as char.
define shared variable mshare as char. /*你需要声明这个共享变量*/
gvar = "global".
message mshare + " in p2.p".

p3.p
/*----------------------------------------------*/
define shared variable mshare as char.
define shared variable gvar as char.
message mshare + " in p3.p" + gvar + " in p3.p".

p4.p
/*-----------------------------------------------*/
define shared variable gvar as char.
message gvar + " in p4.p".[@more@]http://blog.csdn.net/wwwabc0001/archive/2008/11/21/3346366.aspx

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/93029/viewspace-1018011/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/93029/viewspace-1018011/

PAD存储过程以及相关的高级调用相关推荐

  1. mysql面试题:什么是存储过程?用什么来调用?

    什么是存储过程?用什么来调用? 存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次.如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句 ...

  2. 电子工程计算机职称跟什么有关,电子与智能化工程相关专业高级职称包括哪些...

    canhaijiang 高能答主 05-30 TA获得超过2304个赞 名称方面: 由"电子工程专业承包资质"和"建筑智能化工程专业承包资质"合并为:" ...

  3. c# 连接数据库的步骤,和相关的方法调用

    c# 连接数据库的步骤,和相关的方法调用 //第一步:创建Connection 数据库连接对象SqlConnection conn = new SqlConnection("server = ...

  4. oracle数据库procedure(存储过程)的创建与调用

    说明: 该文为网络视频课程整理笔记 视频链接:https://www.bilibili.com/video/BV1Bb411E74d?spm_id_from=333.788.header_right. ...

  5. MySQL存储过程分支语句_mysql 高级语句--存储过程(PROCEDURE)

    mysql 高级语句 一.存储过程 1.什么是存储过程: 就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能. ps:存储过程跟触发器有点类似,都是一组SQL集,但是存储过程是主动调用的, ...

  6. 存储过程--分页与C#代码调用

    存储过程: SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ========================================== ...

  7. mysql存储过程queue_mysql – 在Sequelize中调用输入/输出类型存储过程

    我在 MySQL中创建了一个存储过程,它期望一些输入并返回一些输出. 要在MySQL中调用存储过程,我正在运行 CALL createCoupon(1236,321, @message); SELEC ...

  8. java使用集合存储过程_详解java调用存储过程并封装成map

    详解java调用存储过程并封装成map 发布于 2020-5-1| 复制链接 摘记: 详解java调用存储过程并封装成map           本文代码中注释写的比较清楚不在单独说明,希望能帮助到大 ...

  9. 转:WF中的跟踪服务(1):Sql跟踪数据库表,视图,存储过程等相关说明

    使用WF 中的SqlTrackingService 跟踪服务,我们可以记录有关工作流及其关联活动的跟踪信息到Sql Server数据库库中.SqlTrackingQuery 类提供对包含在跟踪数据库中 ...

最新文章

  1. UOJ #395 BZOJ 5417 Luogu P4770 [NOI2018]你的名字 (后缀自动机、线段树合并)
  2. Visual Studio 批量注释 快捷键
  3. android动态获取输入值,Android实现动态自动匹配输入内容
  4. 为什么喜欢听钢琴+小提琴
  5. Android之SubsamplingScaleImageView加载长图不能放缩问题
  6. 网页控制台调用click()失败_C# 调用百度AI 人脸识别
  7. MySQL 中 count(*) 和 count(1) 有什么区别?哪个性能最好?
  8. php 用js 封装,JavaScript使用封装
  9. Android 应用开发---API Level对应Android版本一览表
  10. Typecho安装后后台界面和文章链接均为404错误的解决方法
  11. FunctionalInterface注解
  12. 三星真机云测平台可能是最好的云测平台,因为他免费。
  13. 免费证件照换底色微信小程序
  14. 招商证券交易系统宕机上热搜,遭深圳证监局责令整改
  15. 如何用PS制作一寸照片
  16. QQ浏览器赵俊:解读腾讯扶持HTM5游戏政策
  17. 用html5做一个视频网页,如何使用HTML5在网页上制作交互式视频?
  18. 使用EditPlus技巧,提高工作效率(附英文版、自动完成文件、语法文件下载)
  19. java实用教程第五版电子书,爱了爱了
  20. vs2017c语言程序打包,VS2017桌面应用程序打包成.msi或者.exe

热门文章

  1. python柱形图绘制_Python数据分析:柱形图的绘制方法
  2. (Win10+vs2017)配置OpenCV开发环境
  3. eclipes安装lombok
  4. 生信工作流框架搭建 | 02-nextflow 实战
  5. 家用宽带搭建个人服务器(二)
  6. ASP.NET Core : 八.图说管道,唐僧扫塔的故事
  7. 【无标题】 R语言下载keras最新方法
  8. DNSPod十问袁志远:智慧园区,被严重低估的To B赛道?
  9. 仿携程oracle课程设计,一个不错的仿携程自定义数据下拉选择select
  10. SpringBoot里参数校验/参数验证