求助,ORACLE存储过程~动态SQL

java1105 2011-12-30 09:04:55
说:有12张表,table01到table12。按月查表格,规则如下:例3月份查table02,4月份查table03类推。
每个表都有字段5个:字段1,字段2,字段3,字段4,字段5,用存储过程怎么写呢?


CREATE OR REPLACE PROCEDURE "test1"
(
vo_resultcode OUT NUMBER ,
vo_resultinfo OUT VARCHAR2
)
IS
字段1 VARCHAR2(30);
字段2 VARCHAR2(30);
字段3 VARCHAR2(30);
字段4 VARCHAR2(30);
字段5 VARCHAR2(30);
v_sql VARCHAR2(1500);
BEGIN
v_sql := ‘SELECT * FROM TABLE’||TO_CHAR(sysdate,‘MM’);
EXECUTE IMMEDIATE v_sql INTO 字段1,字段2,字段3,字段4,字段5;


请高手帮我看看有没有错呢?谢谢啦,新手求指导。
...全文
92 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
java1105 2011-12-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xpingping 的回复:]

select的结果集有多少条数据……只能是一条……
[/Quote]不是一条记录啊,头疼了。游标不会用
怎么添加呢?代码如下:
CREATE OR REPLACE PROCEDURE "zengzhi_xingweimingxi_yi"
(
vo_resultcode OUT NUMBER,
vo_resultinfo OUT VARCHAR2
)
IS
START_DATE VARCHAR2(8);
MSISDN VARCHAR2(15);
OTHER_PARTY VARCHAR2(30);
CALL_TYPE VARCHAR2(2);
START_TIME VARCHAR2(20);
END_TIME VARCHAR2(20);
CALL_DURATION INTEGER;
v_sql VARCHAR2(1500);
BEGIN
v_sql:='SELECT START_DATE,MSISDN,OTHER_PARTY,CALL_TYPE,to_char(TO_DATE(START_DATE||'' ''||START_TIME,''yyyymmdd hh24miss''),''yyyymmdd hh24miss'')
,to_char(TO_DATE(START_DATE||'' ''||START_TIME,''yyyymmdd hh24miss'') + CALL_DURATION / 24 / 60 / 60,''yyyymmddhh24miss''),CALL_DURATION FROM TG_CDR'
||to_char(add_months(sysdate,-1),'mm');


EXECUTE IMMEDIATE v_sql INTO START_DATE,MSISDN,OTHER_PARTY,CALL_TYPE,START_TIME,END_TIME,CALL_DURATION;

END;



我是按别人修改的,用toad运行时候报“OUT is not a valid INTEGER"错误,请问那个
vo_resultcode OUT NUMBER,
vo_resultinfo OUT VARCHAR2

这两句是在说系统的结果返回吗??不明白是做什么的啊?


java1105 2011-12-31
  • 打赏
  • 举报
回复
这是代码,返回的不是一条结果,是多条记录,请问怎么调呢?
呵呵,调成这样了。比较复杂,能帮修改下嘛,谢啦:

CREATE OR REPLACE PROCEDURE "zengzhi_xingweimingxi_yi"
(
vo_resultcode OUT NUMBER,
vo_resultinfo OUT VARCHAR2
)
IS
START_DATE VARCHAR2(8);
MSISDN VARCHAR2(15);
OTHER_PARTY VARCHAR2(30);
CALL_TYPE VARCHAR2(2);
START_TIME VARCHAR2(20);
END_TIME VARCHAR2(20);
CALL_DURATION INTEGER;
v_sql VARCHAR2(1500);
BEGIN
v_sql:='SELECT START_DATE,MSISDN,OTHER_PARTY,CALL_TYPE,to_char(TO_DATE(START_DATE||'' ''||START_TIME,''yyyymmdd hh24miss''),''yyyymmdd hh24miss'')
,to_char(TO_DATE(START_DATE||'' ''||START_TIME,''yyyymmdd hh24miss'') + CALL_DURATION / 24 / 60 / 60,''yyyymmddhh24miss''),CALL_DURATION FROM TG_CDR'
||to_char(add_months(sysdate,-1),'mm');


EXECUTE IMMEDIATE v_sql INTO START_DATE,MSISDN,OTHER_PARTY,CALL_TYPE,START_TIME,END_TIME,CALL_DURATION;

END;

我是按别人修改的,用toad运行时候报“OUT is not a valid INTEGER"错误,请问那个
vo_resultcode OUT NUMBER,
vo_resultinfo OUT VARCHAR2

这两句是在说系统的结果返回吗??不明白是做什么的啊?






[Quote=引用 1 楼 tx2730 的回复:]

语法没有问题,问题是table01..12这些表中都只有一条数据吗?
如果不是的话就有问题了,就必须要用游标来接这些数据。
[/Quote]
我心飞翔 2011-12-31
  • 打赏
  • 举报
回复
如果返回结果只有一条记录,可以考虑修改如下:

v_sql := 'SELECT * FROM TABLE' || TO_CHAR(sysdate,'MM') ||
'INTO 字段1, 字段2, 字段3, 字段4, 字段5';

如果返回结果有多条记录需要使用光标,其实一个带参光标就搞定了。
xpingping 2011-12-30
  • 打赏
  • 举报
回复
select的结果集有多少条数据……只能是一条……
007-x 2011-12-30
  • 打赏
  • 举报
回复
语法没有问题,问题是table01..12这些表中都只有一条数据吗?
如果不是的话就有问题了,就必须要用游标来接这些数据。

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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