我的尝试代码:
declare pic dynamic cursor for sqlsa;
prepare sqlsa from :ls_sql using sqlca;
open dynamic pic;
fetch pic into :lb_pic;
close pic;
在open时sqlerrtext="ORA-24333 零迭代计数"
...全文
5796打赏收藏
动态SQL语句如何返回值?
如ls_sql="selectblob a from b where c=1"如何获取a的值。 我的尝试代码: declare pic dynamic cursor for sqlsa; prepare sqlsa from :ls_sql using sqlca; open dynamic pic; fetch pic into :lb_pic; close pic; 在open时sqlerrtext="ORA-24333 零迭代计数"
一、动态由sql语法创建:
// 连接到pb的example数据库
string ls_sql,ls_syntax,ls_error
ls_syntax = 'select * from department'
ls_syntax = sqlca.SyntaxFromSQL(ls_sql,'style(type=grid)',ls_error)
if len(ls_error) >0 then
messagebox('Error','SyntaxFromSQL Error:~r'+ls_error)
else
dw_new.create(ls_syntax,ls_error)
if len(ls_error) >0 then
MessageBox("Error", "Create have these errors: ~r" + ls_error)
else
dw_new.settransobject(sqlca)
dw_new.retrieve()
end if
end if
二、由另一个数据窗的syntax来创建
string ls_syntax,ls_error
ls_syntax = dw_test.describe('datawindow.syntax')
dw_new.create(ls_syntax,ls_error)
if ls_error <> '' then
messagebox('Create Error',ls_error)
else
dw_new.settransobject(sqlca)
dw_new.retrieve()
end if
三、读取psr文件来创建
string ls_syntax,ls_error,ls_ret
ls_ret = char(13)+char(10) //回车键
int li_fileNum
long li_length
li_FileNum = FileOpen("efef.psr",Streammode!, read!, shared!, Replace!)
if li_filenum >0 then
FileSeek(li_FileNum, 158, FromBeginning!)
li_length = fileRead(li_filenum,ls_syntax)
end if
fileclose(li_filenum)
if li_length = 0 then return
ls_syntax = "release 5;"+ls_ret+ls_syntax
//截掉ls_syntax中的数据部分,5.0以"sparse(names="dept_name?) "作为参考位置
//6.0以html(作为参考位置
long pos1,pos2
pos1 = pos(ls_syntax,'sparse(names="',1)
pos2 = pos(ls_syntax,'"',pos1 +16)
ls_syntax = left(ls_syntax,pos1) + mid(ls_syntax,pos1 +1,pos2 - pos1 +1)
dw_New.create(ls_syntax,ls_error)
if ls_error <> '' then
messagebox('Create Error',ls_error)
else
dw_new.settransobject(sqlca)
dw_new.retrieve()
end if
//pb6,pb7的代码可以参照pb5自己写,只是文件头和数据窗结束标记不同而已。
三、创建动态数据窗口的一般步骤
创建动态数据窗口的一般步骤如下:
1、在某窗口(如w_main)上用鼠标点建一个数据窗口控件(如dw_1),其DataObject为空。
2、构造SyntaxFromSQL()函数的语法字符串。这是PowerBuilder动态数据窗口的关键,稍为复杂一些,具体做法请见下面实例。
3、用Create()函数创建动态数据窗口dw_1,并用SetTransObject()函数为其分配事务对象,具体做法请见下面实例。
这种方法的主要缺点是必须在设计阶段先建数据窗口控件,运行时无法增减,这对于一些较为特殊的应用(如设计阶段尚不知需几个数据窗口)
就不太适合了。那如何解决这个问题呢?经过一番摸索并查阅了一些资料,终于找到了二种解决方法,现分别介绍如下: 1、创建一个标准可视数据窗口用户对象u_d_sample
PowerBuilder6.0/6.5中步骤为:点击工具栏上的UserObject图标,在弹出的Select User Object窗口中点击New按钮,出现New User Object窗口,双击其中Visual下的Standard图标, 在弹出的Select Standard Visual Type窗口中双击datawindow选项,即出现User Object(Untitled)窗口,点击工具栏上的Save图标,弹出的Save User Object窗口,在User Objects: 中输入u_d_sample回车即进入User Object---u_d_sample窗口,关闭该窗口,标准可视数据窗口用户对象u_d_sample即告建成。
PowerBuilder7.0中步骤为:点击工具栏上的New图标,在弹出的New窗口中选择Object页面,双击其中的Standard Visual图标, 在弹出的Select Standard Visual Type窗口中双击datawindow选项,出现User Object(Untitled)inherited from datawindow窗口,将其右边的Title栏中的none删除,再点击左边空白区,然后点击工具栏上的Save图标,以后的操作步骤与PowerBuilder6.0/6.5大致相同。至于PowerBuilder8.0则与PowerBuilder7.0大体相同,不再赘述。
//动态数据窗口dw_1创建实例
string lserr,lsSQLstr,lsDWsyntax,lserrC
SQLCA.DBMS="ODBC"
SQLCA.DBParm="ConnectString='DSN=FoxPro25'" //本例使用FoxPro25数据库,可根据需要用其他数据库
Connect;
//下面3条语句即为关键,若dw_1为鼠标点建请删除这3条语句,否则会出错。
DataWindow dw_1 //若采用数据窗口用户对象u_d_sample,则可改为:u_d_sample dw_1
dw_1=Create DataWindow //若采用数据窗口用户对象u_d_sample,此句应去除。
OpenUserObject(dw_1)
//Select…As…的As可将列标题显示为As之后的字符,较为灵活方便。
//可根据实际情况设计生成Select语句及Where子句的可视化界面
lsSQLstr="Select A12 As 主管部门,A01 As 法人代码,mc As 企业名称,A06 From bb Where A12<'1'"
lsDwsyntax=SQLCA.SyntaxFromSQL(lsSQLstr,"style(type=Grid)",lserr) //构造SyntaxFromSQL()函数
If Len(lserr)>0 Then
//如果构造SyntaxFromSQL()函数失败,则显示错误信息并退出
messagebox("错误信息!",lserr)
Return
end if
dw_1.Create(lsDwsyntax,lserrC) //创建动态数据窗口dw_1
If Len(lserrC)>0 Then
//如果创建动态数据窗口dw_1失败,则显示错误信息并退出
messagebox("错误信息!",lserrC)
Return
end if
//以下设置dw_1的一些属性,可根据实际需要设置。
dw_1.X=5
dw_1.Y=5
dw_1.width=1500
dw_1.height=650
dw_1.Visible=True
dw_1.Enabled=True
dw_1.HScrollBar=True
dw_1.VScrollBar=True
//为dw_1分配事务对象SQLCA
dw_1.SetTransObject(SQLCA)
//提取数据
dw_1.Retrieve()