首页 新闻 赞助 找找看

oracle 写一个存储过程,测试时报警,不知道sql语句哪里出来问题,请大神帮忙看看,新手请多指教

0
悬赏园豆:20 [已解决问题] 解决于 2020-01-16 16:31

--存储过程
create or replace procedure prc_cl_szyl_shbx_02(p_date in varchar2,
p_nreturn out number)
AUTHID CURRENT_USER IS

v_task_pos varchar2(256);
v_sqlerrm varchar2(256);
v_sqlerrcode varchar2(256);
v_sp_name varchar2(50);
v_sql varchar2(32767);
v_tablename varchar2(50);
v_flag number;
v_no number;
v_gzm varchar2(10);

begin
v_task_pos := '程序运行开始';
v_sp_name := 'prc_cl_01_check_date';
--sp_record_log(v_serial_no,v_sp_name,sysdate,v_task_pos,'');
-- 设置初始成功标志
p_nreturn := 200;
v_no := 1;

v_tablename := 'SHFFJL_P1';
v_gzm :='P1';
v_sql := 'create table ' || v_tablename ||
'as select s.jsq,s.dwm,s.bmdm,s.tbr,s.xm,s.shbzh,min(jsq)as jsq,t.dwm,t.tyymd,t.txymd
from shffjl s left join txda t
on s.tbr = t.tbr
group by s.jsq,s.dwm,s.bmdm,s.tbr,s.xm,s.shbzh,jsq,t.dwm,t.tyymd,t.txymd
having s.dwm =t.dwm and s.tbr =s.tbr and s.jsq < nvl(t.tyymd,t.txymd)';
v_no := v_no + 1;
delete from qx_log_ywlj_wt;
select count()
into v_flag
from user_tables
where table_name = v_tablename;
/
if v_flag = 0 then
execute immediate v_sql;
else
execute immediate 'drop table ' || v_tablename || '';
execute immediate v_sql;
end if;*/
execute immediate v_sql;
insert into qx_log_ywlj_wt
(yno, ytablename, gzm)
values
(v_no, v_tablename, v_gzm);

commit;
v_task_pos := '程序运行成功';
exception
when others then
rollback;
v_task_pos := '程序运行失败';
v_sqlerrm := substr(sqlerrm, 0, 800);
dbms_output.put_line(v_sqlerrm);
v_sqlerrcode := sqlcode;
-- sp_record_log(v_serial_no,v_sp_name,sysdate,v_task_pos,v_sqlerrm||v_sqlerrcode);
p_nreturn := v_no;

END prc_cl_szyl_shbx_02;

--测试页面
-- Created on 2020/1/2 by ADMINISTRATOR
declare
-- Local variables here
i integer;
pdate integer;
pnreturn integer;
begin
-- Test statements here
pdate :=0;
prc_cl_szyl_shbx_02(p_date => pdate,p_nreturn => pnreturn);
end;

--报警信息
ORA-00922: 选项缺失或无效

路漫修远兮的主页 路漫修远兮 | 初学一级 | 园豆:2
提问于:2020-01-03 14:05
< >
分享
最佳答案
0

赞@12不懂3 的答案。我再告诉你一个简单的方法,适用用代码比较少的时候,你可以先删除一部分代码,然后看还有警告吗,如果有,继续删除一部分代码,如果没有,看另一部分代码,用此二分法,很容易定位问题。

收获园豆:20
会长 | 专家六级 |园豆:12401 | 2020-01-03 15:35

我找到问题了,谢谢会长

路漫修远兮 | 园豆:2 (初学一级) | 2020-01-03 15:51
其他回答(2)
0

第一:别着急这是一个简单的小问题 让我来教你如何解决这个问题

首先:我们先在oracle 见一个临时的log表
然后:在你的存储过程了 insert 日志信息到Log表里面
最后:定位到具体sql语句,基本上这个问题已经排查到了 那么也就很好解决了
一定要自己学会动手哦,而不是直接拿到答案

12不懂3 | 园豆:22 (初学一级) | 2020-01-03 14:57

我找到问题了,谢谢

支持(0) 反对(0) 路漫修远兮 | 园豆:2 (初学一级) | 2020-01-03 15:50

你这种方法是不是适合这种问题,我不知道我的存储过程那个地方出了问题,然后每隔一句sql向Log表中添加一次,看哪一步没有添加就是那个地方出的问题。我是把sql语句打印了出来,发现的问题

支持(0) 反对(0) 路漫修远兮 | 园豆:2 (初学一级) | 2020-01-03 15:57
0

表名和sql相互拼接,中间没有加空格

路漫修远兮 | 园豆:2 (初学一级) | 2020-01-03 16:14
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册