存储过程动态创建sql语句—求教

流水小树 2014-12-16 05:43:33
1、已经创建了一个存储过程,参数是sql

2、根据参数sql,生成一个新的存储过程

问题:
程序调用存储过程的时候,有问题
a、. sql为单独一句的增删改查是可以生成存储过程的,
比如
insert into T_NKFX_MBXX t1
(t1.mb_bh,t1.sjfw_dm)
values
('1','1');

b、 . 但是超过一句的时候就报"正确,但是编译出错"
insert into T_NKFX_MBXX t1
(t1.mb_bh,t1.sjfw_dm)
values
('1','1');
insert into T_NKFX_MBXX t1
(t1.mb_bh,t1.sjfw_dm)
values
('2','2');

直接将sql放到存储过程测试,是可以生成的,没有问题


请问这是我存储过程的问题吗?
...全文
341 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
流水小树 2014-12-17
  • 打赏
  • 举报
回复
报了6楼那个问题后,再点击一下执行就好了。 1、sql语句首先是好的,plsql里面可以执行的 2、sql在存储过程里面测试也是好的 3、程序调用的时候,语句超过两个就有问题了。报上面的错误,但是再次点击一下执行就好了
bw555 2014-12-17
  • 打赏
  • 举报
回复
SQL> create table t_nkls_jgfxjg(fxfz number,temp1 number,temp2 number,temp3 number,temp4 number,fxms varchar2(4000));

表已创建。

SQL> create or replace procedure USP_ZB_2321000ZB000048_CS (  as_fxpc in varchar2,
  2  as_znfw in varchar2,
  3  as_begin in varchar2,
  4  as_end in varchar2,
  5  err_code out number,
  6  err_msg out varchar2)
  7     is
  8    begin
  9       err_code:=0;
 10       err_msg :='ok';
 11         update t_nkls_jgfxjg jg
 12  set jg.fxfz = (case when jg.temp3 <= 0.5 then 90
 13  when (jg.temp3 > 0.5 and jg.temp3 <=0.9 ) then 70
 14  when jg.temp3 > 0.9 then 50 end),
 15  jg.fxms = '该纳税人[' || to_char(to_date('2012-01-01', 'yyyy-mm-dd'), 'yyyy') ||
 16  '] 工资之处税收金额为[' || jg.temp2 || ']元,全员申报申报表中工资支出合计为['  ||
 17  jg.temp1 || '],差额为[' || jg.temp4 || ']元';
 18
 19  update t_nkls_jgfxjg jg
 20  set jg.fxfz = (case when jg.temp3 <= 0.5 then 90
 21  when (jg.temp3 > 0.5 and jg.temp3 <=0.9 ) then 70
 22  when jg.temp3 > 0.9 then 50 end),
 23  jg.fxms = '该纳税人[' || to_char(to_date('2012-01-01', 'yyyy-mm-dd'), 'yyyy') ||
 24  '] 工资之处税收金额为[' || jg.temp2 || ']元,全员申报申报表中工资支出合计为['  ||
 25  jg.temp1 || '],差额为[' || jg.temp4 || ']元';
 26    end USP_ZB_2321000ZB000048_CS;
 27  /

过程已创建。

SQL>
实际测试了下,没啥问题啊
流水小树 2014-12-17
  • 打赏
  • 举报
回复
对照六楼的图片两句一样的update,程序调用的时候如果只跑一句是可以的,两句就不行了。 如果直接在存储过程里面测试,是好的 create or replace procedure USP_ZB_2321000ZB000048_CS ( as_fxpc in varchar2, as_znfw in varchar2, as_begin in varchar2, as_end in varchar2, err_code out number, err_msg out varchar2) is begin err_code:=0; err_msg :='ok'; update t_nkls_jgfxjg jg set jg.fxfz = (case when jg.temp3 <= 0.5 then 90 when (jg.temp3 > 0.5 and jg.temp3 <=0.9 ) then 70 when jg.temp3 > 0.9 then 50 end), jg.fxms = '该纳税人[' || to_char(to_date('2012-01-01', 'yyyy-mm-dd'), 'yyyy') || '] 工资之处税收金额为[' || jg.temp2 || ']元,全员申报申报表中工资支出合计为[' || jg.temp1 || '],差额为[' || jg.temp4 || ']元'; update t_nkls_jgfxjg jg set jg.fxfz = (case when jg.temp3 <= 0.5 then 90 when (jg.temp3 > 0.5 and jg.temp3 <=0.9 ) then 70 when jg.temp3 > 0.9 then 50 end), jg.fxms = '该纳税人[' || to_char(to_date('2012-01-01', 'yyyy-mm-dd'), 'yyyy') || '] 工资之处税收金额为[' || jg.temp2 || ']元,全员申报申报表中工资支出合计为[' || jg.temp1 || '],差额为[' || jg.temp4 || ']元'; end USP_ZB_2321000ZB000048_CS;
bw555 2014-12-17
  • 打赏
  • 举报
回复
要生成的过程的代码
bw555 2014-12-17
  • 打赏
  • 举报
回复
看语法没啥问题,估计是某些细节的东西 只是看我是找不到问题了,需要实际去测试下 你把你这个出错的代码贴出来,我可不想去敲一边去测试
流水小树 2014-12-17
  • 打赏
  • 举报
回复
存储过程代码如下 -----存储sql语句,产生存储过程(测试用) procedure usp_zb_sqlyj_cs(pro_name in varchar2, sqlyj in varchar2, code out number, errmsg out varchar2) is dyn_pro varchar2(4000); begin code := 0; errmsg := 'SUCCESS'; dyn_pro := 'create or replace procedure nk_fxfx.' || pro_name || '_CS ( as_fxpc in varchar2, as_znfw in varchar2, as_begin in varchar2, as_end in varchar2, err_code out number, err_msg out varchar2) is begin err_code:=0; err_msg :=''ok''; '|| sqlyj ||' end ' || pro_name || '_CS;'; -- create procedure execute immediate dyn_pro; --execute immediate 'recompile nk_fxfz.'||pro_name; --更新指标表sql语句名称 update t_fx_fxmxqd t set t.mxjk = pro_name where t.fxmxid = substr(pro_name,8,20); -- invoke this procedure: do not forget begin/end --execute immediate 'begin ' || pro_name || '(:first, :2); end;' ; commit; exception when others then dbms_output.put_line(-1); code := 400; errmsg := 'FAILED:' || sqlerrm; rollback; return; end usp_zb_sqlyj_cs;
流水小树 2014-12-17
  • 打赏
  • 举报
回复

上图,单独一句就是可以生成的,再次复制一遍,就有问题了
问题如下:
PROCEDURE NK_FXFX.USP_ZB_2321000ZB000048_CS 编译错误

错误:PLS-00103: 出现符号 ""在需要下列之一时:
begin case declare end
exception exit for goto if loop mod null pragma raise return
select update while with <an identifier>
<a double-quoted delimited-identifier> <a bind variable> <<
close current delete fetch lock insert open rollback
savepoint set sql execute commit forall merge pipe
行:17
文本:jg.temp1 || '],差额为[' || jg.temp4 || ']元';
bw555 2014-12-17
  • 打赏
  • 举报
回复
把代码贴出来,我这执行下试试
流水小树 2014-12-17
  • 打赏
  • 举报
回复

bw555 2014-12-17
  • 打赏
  • 举报
回复
还不行的话,就把你生成的存储过程的代码导出来,看看具体哪出问题了
select text from user_source
where  type='PROCEDURE' and name='你的存储过程' 
order by line;
bw555 2014-12-17
  • 打赏
  • 举报
回复
一般情况下动态语句拼接的时候最容易出问题的是单引号,由于单引号是特殊字符,如果拼接的语句中存在单引号,需要用两个单引号替换1个单引号进行转义 你拼接的语句 sqlyj变量中存在单引号,因此在拼接到整体语句中的时候应该使用replace替换
||replace(sqlyj,'''','''''')||
流水小树 2014-12-16
  • 打赏
  • 举报
回复
求教大家,感激不尽

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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