这个问题是不是很简单?可是我就是不会,快死人了。

anakine 2002-05-27 02:28:07
PB8.0+ORACLE8.16, 我想知道动态调用存储过程怎么做?
以前一直用SQL Server,怎么到ORACLE里怎么声明都不对啊?(faint!!!)


下面的例子我试过了, 没有用,为什么?

// The syntax of emp_select is:

// "SELECT emp_id

// FROM employee WHERE emp_state=@stateparm".

DECLARE my_proc DYNAMIC PROCEDURE FOR SQLSA ;

integer Emp_id_var

string Emp_state_var

PREPARE SQLSA FROM "emp_select @stateparm=?" ;

Emp_state_var = "MA"

EXECUTE DYNAMIC my_proc USING :Emp_state_var ;

FETCH my_proc INTO :Emp_id_var ;

CLOSE my_proc ;
...全文
38 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
anakine 2002-05-27
  • 打赏
  • 举报
回复
谢谢上面几位热心的兄弟,我全试过了,还到Sybase和Oracle(奇差的网站)的网站上看了一下, 都没有找到说明, 我定义动态Cursor运行起来一点问题都没有,就是动态Procedure有问题,怪事! 用SQL Server的存储过程一点问题都没有的!也是动态调用,可能是Sybase没有做好Oracle的接口,也许又是什么未公开的秘密吧,妈妈的。

结贴了。
HJZ2970 2002-05-27
  • 打赏
  • 举报
回复
完整的代码
========================
// 计算非输入项的值

string ls_empno, ls_expr , ls_tmp
String ls_year ,ls_month
String ls_updatefield , ls_field , ls_values ,ls_sign
Long i , expr_length
Real le_values

ls_year = ddlb_year.text
ls_month = ddlb_month.text

DECLARE stan_cur CURSOR FOR // 工资设置表中的计算项目
SELECT stancode,stanexpr
FROM gwbstand
WHERE stancode != ' '
AND stanexpr != ' '
ORDER BY stancode;

DECLARE gong_cur CURSOR FOR // 工资表中的当前年月数据
SELECT gongempno
FROM gwgongzi
WHERE gongyearr = :ls_year
AND gongmonth = :ls_month
ORDER BY gongempno ;

// 从工资表中依次读取数据

OPEN gong_cur;

FETCH gong_cur INTO :ls_empno ;

DO WHILE sqlca.sqlcode = 0

OPEN stan_cur; // 调出计算项目

FETCH stan_cur INTO :ls_updatefield,:ls_expr;

DO WHILE sqlca.sqlcode = 0
// 根据公式转换成相应的计算式
if isnull(ls_expr) then continue

expr_length = Len(trim(ls_expr))

For i = 1 to expr_length
ls_tmp = mid(ls_expr,i,1)
if (ls_tmp <> " " and ls_tmp <> "+" and ls_tmp <> "-" and ls_tmp <> "*" and ls_tmp <> "/" and &
ls_tmp <> "(" and ls_tmp <> ")" ) then
ls_field = ls_field + ls_tmp
else
if ls_tmp <> "" then
le_values = f_strtofield(ls_empno,ls_year,ls_month,ls_field)
ls_values = ls_values + string(le_values) + ls_tmp
ls_field = ""
end if
end if
Next

le_values = f_strtofield(ls_empno,ls_year,ls_month,ls_field) // 最后一个字段
ls_values = ls_values + string(le_values)

// 计算

ls_values ="select " + ls_values + " from gwjisuan where isuavals = 'X'"

DECLARE jisuan_cur DYNAMIC CURSOR FOR SQLSA ;
PREPARE SQLSA FROM :ls_values ;
OPEN DYNAMIC jisuan_cur ;
FETCH jisuan_cur INTO :le_values ;
CLOSE jisuan_cur ;

// 修改表中的数据
f_update(ls_empno,ls_year,ls_month,ls_updatefield,le_values)

// 初始化
ls_updatefield = ""
ls_values = ""
ls_field = ""

FETCH stan_cur INTO :ls_updatefield,:ls_expr ;

LOOP

CLOSE stan_cur; // 关闭计算项目



FETCH gong_cur INTO :ls_empno ;
LOOP

CLOSE gong_cur;
HJZ2970 2002-05-27
  • 打赏
  • 举报
回复
// 动态公式计算
ls_values ="select " + ls_values + " from gwjisuan where isuavals = 'X'"

DECLARE jisuan_cur DYNAMIC CURSOR FOR SQLSA ;
PREPARE SQLSA FROM :ls_values ;
OPEN DYNAMIC jisuan_cur ;
FETCH jisuan_cur INTO :le_values ;
CLOSE jisuan_cur ;
anakine 2002-05-27
  • 打赏
  • 举报
回复
我换了好几种写法最好的一种就提示没有返回值, 但我的存储过程是有返回值的,
p1、p2、p3、p4为四个string变量
//DECLARE p_kl_read DYNAMIC PROCEDURE FOR SQLSA;

//PREPARE SQLSA FROM "p_kl_read (:p1,:p2,:p3)";

EXECUTE p_kl_read USING :p1,:p2,:p3;

if SQLCA.sqlcode=0 then
FETCH p_kl_read INTO :p4;
end if
messagebox(string(SQLCA.sqlcode),p4) //sqlcode=100? 我只调一次时是正确的,现在放到一个循环中(不动态调肯定会错),运行了无返回值!

jackygan 2002-05-27
  • 打赏
  • 举报
回复
给一个例子你参考:
服务器里:

asa 7 的语法,MSSQL以及oracle差不多的:
假定表单为:
sys_sequence (table_name varchar(40) not null,cur_sequence numeric(15) not null,attribute varchar(2));
存储过程:

create procedure dba.sys_get_sequence(@as_table_name varchar(40))
as
begin
declare @next_sequence numeric(15)
select @next_sequence=cur_sequence from sys_sequence where sys_sequence.table_name=@as_table_name
if @next_sequence is null
begin
insert into sys_sequence(table_name,cur_sequence,seq_type) values(@as_table_name,1,'A')
select @next_sequence=1
select @next_sequence
end
else
begin
select @next_sequence=@next_sequence+1
update sys_sequence set cur_sequence=@next_sequence where sys_sequence.table_name=@as_table_name
select @next_sequence
end
end

这个存储过程可以在PB或Sybase Central中创建,你也可以加入事务控制来保证唯一性。
创建完毕后,分配权限:grant execute on sys_get_sequence to public;然后就可以在程序中调用了:
PB中,创建一个全局函数:
long gf_get_sequence(string as_table_name)
Decimal ld_seq_id
DECLARE get_seq_id procedure for sys_get_sequence :as_seq_name;
EXECUTE get_seq_id;
FETCH get_seq_id INTO :ld_seq_id ;
Close get_seq_id ;
Return ld_seq_id



存储过程的语法你稍微改一下就可以了。
akeewww 2002-05-27
  • 打赏
  • 举报
回复
错误的提示是什么?
lws0472 2002-05-27
  • 打赏
  • 举报
回复
我看你的程序没什么错误,系统有提示错误吗?
anakine 2002-05-27
  • 打赏
  • 举报
回复
不会吧?这里没有一个人用过ORACLE? 没用过动态存储过程?快帮忙啊,兄弟们。


滴水之恩,涌泉相报!
anakine 2002-05-27
  • 打赏
  • 举报
回复
人呢?

1,075

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 相关问题讨论
社区管理员
  • 基础类社区
  • WorldMobile
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧