PowerBuilder(PB)和Oracle分别是前端开发工具和RDBMS的主流产品PB提供了两种与Oracle连接的接口PowerSoft内置的数据库接口(Native Database Interface)和ODBC接口
PowerBuilder与Oracle的连接
假定已安装Oracle客户端应用程序可用Sqlplus或Tnsping等是否能连接到Oracle数据库确定在SQL*NET配置文件中使用的数据库别名(Database Alias又称服务器名Server Name)如有疑问可在Oracle客户端程序目录下tnsnameora文件中找到另外保证搜索路径已包括SQL*NET应用程序的安装目录(如C:\ORAWIN\BIN)
进入PB的Database Profiles画笔可看到所有已安装的数据库接口(PB 缺省安装的是Oracle 版的接口如使用低版本的Oracle需在安装时指定)选择O Oracle 点击New按钮进入Database Profile Setup对话框在Connection页输入下列信息Profile Name:为该Database Profile起一个有意义的名称Server:@TNS:ServerName其中ServerName为上述数据库别名(服务器名)如@TNS:ORA;注意PB 则没有前面那个@TNS:!!!
Login ID:Oracle数据库中实际的用户名由于PB初次连接到数据库时要自动建立五个系统表(PowerBuilder Catalog Table:PBCATTBLPBCATCOLPBCATEDTPBCATFMTPBCATVLD存储表的扩展属性)因此第一个连接到Oracle的用户必须具有建表给PUBLIC角色授权等权限例如可用SYSTEM用户进行第一次连接此后的连接对用户则无特殊要求
Password:该用户的口令
设置上述内容后即可连上Oracle为优化数据库连接还可设置下列选项
Prompt for Database Information:连接时是否提示用户输入用户名和口令
Generate Trace:启动DB跟蹤工具跟蹤连接
Thread Safe:开发需要多线程环境支持的分布式应用时选择该项缺省为未选适用于非分布应用
PBDBMS:与存储过程调用方式有关的参数Oracle为或更高版本时清除该选项此时带IN OUT参数的存储过程可作为数据窗口数据源版本以下选择该项调用PBDBMSPutLine建立存储过程的SQL语句缺省是选中
Commit on Disconnect:断开连接时指定提交或回退未提交的事务
Case Sensitive:连接的Oracle服务器是否区分大小写注意该项选中时所有主键包含主键的表名外键须全为大写字符
PowerBuilder Catalog Tables Owner:指定拥有PB系统表的用户缺省为SYSTEM如果要使用多种显示格式或有效性规则可以在不同的用户下建立几套系统表
Table Criteria:指定满足哪些条件的表视图和同义词可在Select Tables对话框中显示出来例如DEV用户下销售子系统的表都以SALE开头则可以用SALE%DEVTABLEVIEW指定只显示DEV用户以SALE开头的表和视图
Asynchronous:选择该项可在一个复杂的SQL语句执行过程中返回第一行结果前切换到其他操作
Number of Seconds to Wait:若上一项选中还可进一步通过该项指定检索数据时等待数据库响应的时间
Retrieve Blocking Factor:决定数据窗口对象一次可从数据库取出的记录数
Number of SQL Staments Cached:PB可将数据窗口对象产生的SQL语句和嵌入式SQL语句保存在SQL语句缓沖区该参数指定缓沖区为PB保留的SQL语句数目该数值可由下式计算SQLCache=服务器OPENCURSORS数(保留的游标数)本连接预期使用的最大游标数
Disable Bind:指定是否将输入变量与SQL语句绑定此参数影响PB为数据窗口对象生成INSERT语句的方式
Static Bind:数据窗口对象检索数据前是否检测SELECT语句的合法性
在Syntax页还可指定日期时间的格式等在Preview页可查看Database Profile设置对应的PowerScript写法
Oracle存储过程的使用
归纳起来PB 中调用Oracle存储过程有以下四种方法
方法一以关键字RPCFUNC声明存储过程
方法二以DECLARE PROCEDURE语句声明存储过程
方法三以动态SQL语句实现
方法四调用函数PBDBMSPutLine
一般情况下方法一能得到较好的运行效率和更完善的功能因此推荐使用方法一但是某些类型的存储过程只能使用其他方法以下重点介绍方法一和方法二
两种方法比较起来有以下几点主要区别
)方法一适用于具有INOUT和IN OUT参数的存储过程而方法二仅支持IN和OUT参数不支持IN OUT参数
)方法一对参数的数目无限制方法二最多支持个参数
)方法一不支持记录(Recorder)的传递方法二可传递和接收记录
方法一操作步骤
)在用户对象画笔中创建一个ClassStandard类型的从Transaction继承的用户对象
)在此用户对象中声明Local External Functions将存储过程以RPCFUNC关键字声明为外部函数在Declare Local External Functions对话框中按Procedures按钮选择要调用的后台存储过程或直接输入类似subroutine TEST(long idref string name)RPCFUNC ALIAS FOR DEVTEST的语句例如DEVTEST的参数为(id IN NUMBERname IN OUT VARCHAR)
)保存该用户对象
)在Application画笔中进入应用属性对话框在Variable Types页将上Transaction用户对象设置为缺省的全局变量SQLCA
)脚本中编码调用相应的外部函数形式SQLCA函数名(参数)如可用SQLCATEST(lnidlsname)调用例子中定义的DEVTEST存储过程其中lnidlsname为调用参数
方法一注意事项
)由于PB中String类型的数据长度是动态分配的因此对Ref String类型的参数每次调用前需要申请足够的空间例如上例从输入的id值检索name后台声明的NAME数据类型为VARCHAR()每次调用SQLCATEST前需要用lsname=SPACE()置lsname为足够长度的空串
[] []