eg:
string Mysql
Mysql = "CREATE TABLE Employee "&
+"(emp_id integer not null,"&
+"dept_id integer not null, "&
+"emp_fname char(10) not null, "&
+"emp_lname char(20) not null)"
EXECUTE IMMEDIATE :Mysql ;
2.Dynamic SQL format 2
PREPARE DynamicStagingArea FROM SQLStatement {USING TransactionObject} ;
EXECUTE DynamicStagingArea USING {ParameterList} ;
eg:
INT Emp_id_var = 56
PREPARE SQLSA
FROM "DELETE FROM employee WHERE emp_id=?" ;
EXECUTE SQLSA USING :Emp_id_var ;
3.Dynamic SQL format 3
DECLARE Cursor | Procedure DYNAMIC CURSOR | PROCEDURE FOR DynamicStagingArea ;
PREPARE DynamicStagingArea FROM SQLStatement {USING TransactionObject} ;
OPEN DYNAMIC Cursor {USING ParameterList} ;
EXECUTE DYNAMIC Procedure {USING ParameterList} ;
FETCH Cursor | Procedure INTO HostVariableList ;
CLOSE Cursor | Procedure ;
eg:
integer Emp_id_var
DECLARE my_cursor DYNAMIC CURSOR FOR SQLSA ;
PREPARE SQLSA FROM "SELECT emp_id FROM employee" ;
OPEN DYNAMIC my_cursor ;
FETCH my_cursor INTO :Emp_id_var ;
CLOSE my_cursor ;
4.Dynamic SQL format 4
DECLARE Cursor | Procedure DYNAMIC CURSOR | PROCEDURE FOR DynamicStagingArea ;
PREPARE DynamicStagingArea FROM SQLStatement {USING TransactionObject} ;
DESCRIBE DynamicStagingArea INTO DynamicDescriptionArea ;
OPEN DYNAMIC Cursor | Procedure USING DESCRIPTOR DynamicDescriptionArea ;
EXECUTE DYNAMIC Cursor | Procedure USING DESCRIPTOR DynamicDescriptionArea ;
FETCH Cursor | Procedure USING DESCRIPTOR DynamicDescriptionArea ;
CLOSE Cursor | Procedure ;
eg:
string Stringvar, Sqlstatement
integer Intvar
Sqlstatement = "SELECT emp_id FROM employee"
PREPARE SQLSA FROM :Sqlstatement ;
DESCRIBE SQLSA INTO SQLDA ;
DECLARE my_cursor DYNAMIC CURSOR FOR SQLSA ;
OPEN DYNAMIC my_cursor USING DESCRIPTOR SQLDA ;
FETCH my_cursor USING DESCRIPTOR SQLDA ;
// If the FETCH is successful, the output
// descriptor array will contain returned
// values from the first row of the result set.
// SQLDA.NumOutputs contains the number of
// output descriptors.
// The SQLDA.OutParmType array will contain
// NumOutput entries and each entry will contain
// an value of the enumerated data type ParmType
// (such as TypeInteger!, or TypeString!).
CHOOSE CASE SQLDA.OutParmType[1]
CASE TypeString!
Stringvar = GetDynamicString(SQLDA, 1)
CASE TypeInteger!
Intvar = GetDynamicNumber(SQLDA, 1)
END CHOOSE
CLOSE my_cursor ;
昕晨工作室jiangjeffrey@163.com
晕?晕!
在pb 中利用execute immediate :ssql,即可执行后台数据库的语句,本人通过查阅资料及通过不断的实验,获得了一种通过读取*.sql文 件生成 sql server 7 的数据库的方法,现公布如下,以对大家起到抛砖引玉的作用:
因为pb的限制,不能一次性读入大于32KB的sql脚本文件,需要修改fileread代码,利用循环将整个文件读入,
f_readfile的代码
参数:string str_file[]为实例变量
参数:str_filenameinteger li_FileNum, loops,i
long flen, bytes_read, new_pos
blob b
string str_sqlexecute
SetPointer(HourGlass!)
flen = FileLength(str_filename)
li_FileNum = FileOpen(str_filename, StreamMode!, Read!, LockRead!)
IF flen > 32765 THEN
IF Mod(flen, 32765) = 0 THEN
loops = flen/32765
ELSE
loops = (flen/32765) + 1
END IF
ELSE
loops = 1
END IF
new_pos = 1
FOR i = 1 to loops
bytes_read = FileRead(li_FileNum, b)
str_file[i]=string(b)
NEXT
FileClose(li_FileNum)
利用ms sql sever 7.0 enterprise manager 生成sql文件(注意要将options->file format 选为ms-dos text(oem),默认格式是 internation text(unicode),此格式不能被pb 的 fileread函数正确读出。)
再用以下代码生成数据库的对象:
integer i,li_postion,l_upper
l_upper=upperbound(str_file)
for i=1 to l_upper
li_postion=pos(str_file[i],"GO",1)
do while li_postion<>0
str_sqlexecute=trim(mid(str_file[i],1,li_postion - 1))
execute immediate :str_sqlexecute;
str_file[i]=mid(str_file[i],li_postion+2)
li_postion=pos(str_file[i],"GO",1)
loop
if i<l_upper then
str_file[i+1]=str_file[i]+str_file[i+1]
end if
next
///////////////////
只要是生成了*.sql文件, 数据库中的任何对象都可以生成