oracle 带参数存储过程无法执行

michael0208 2015-01-22 03:51:05
我创建了一个存储过程,不过执行的时候报错,请教大神原因何在?
还有个次要问题,我的程序中用的是System.Data.OracleClient 但是OracleType中没有VARCHAR2,如何自己添加一个?

create or replace procedure customise(datefrom in varchar2, dateto in varchar2)
Authid Current_User as
vn_ctn number(2);
begin
select count(*) into vn_ctn from user_all_tables a where a.table_name like upper('customise1');
if vn_ctn > 0 then
execute immediate 'drop table customise1';
end if;
execute immediate 'create table customise1 as SELECT 关口点全名,电能量类型,数据 FROM 表底 WHERE datetime BETWEEN to_date(''datefrom'',''yyyy/mm/dd'') AND to_date(''dateto'',''yyyy/mm/dd'') and (电能量类型=''正向有功'' or 电能量类型=''反向有功'') GROUP BY 关口点全名,电能量类型,数据 HAVING COUNT(关口点全名)=trunc((To_date(''dateto'' , ''yyyy/mm/dd hh24-mi-ss'') - To_date(''datefrom'' , ''yyyy/mm/dd hh24-mi-ss'')+2))';
end ;


报错如下
*
第一行出现错误:
ORA-01841:(完整) 年份值必须介于 -4731 和 +9999 之间,且不为 0
ORA-06512: 在 "ORACLE.CUSTOMISE", line 9
OEA-06512: 在 line 1
...全文
563 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
UPC子夜 2015-01-22
  • 打赏
  • 举报
回复
引用 3 楼 michael0208 的回复:
[quote=引用 2 楼 z_shousi 的回复:]

execute immediate 'create table customise1 as SELECT 关口点全名,电能量类型,数据 FROM 表底 WHERE datetime BETWEEN to_date('''||datefrom||''',''yyyy/mm/dd'') AND to_date('''||dateto||''',''yyyy/mm/dd'') and (电能量类型=''正向有功'' or 电能量类型=''反向有功'') GROUP BY 关口点全名,电能量类型,数据 HAVING COUNT(关口点全名)=trunc((To_date('''||dateto||''' , ''yyyy/mm/dd hh24-mi-ss'') - To_date('''||datefrom||''' , ''yyyy/mm/dd hh24-mi-ss'')+2))';

确实有用,在下新手一个不知 "" 和 || 有何区别,好人做到底解释一下吧,或者告诉我这属于数据库那部分,我去查查,学习一下,基础太差了啊[/quote] 楼主啊,两个字符串怎么连接啊? 不是用||去连接吗 比如 “ab”||"cd"的结果就是“abcd” 但是你这个sql本身就用单引号引起来了 然后单引号内部 两个单引号被当成一个单引号去解析 所以你的datatime就被当成字符串 而不是变量了 这根java代码中的变量一个用法 java中的变量你要和字符串连接起来,不也得用+连接吗?
michael0208 2015-01-22
  • 打赏
  • 举报
回复
引用 2 楼 z_shousi 的回复:

execute immediate 'create table customise1 as SELECT 关口点全名,电能量类型,数据 FROM 表底 WHERE datetime BETWEEN to_date('''||datefrom||''',''yyyy/mm/dd'') AND to_date('''||dateto||''',''yyyy/mm/dd'') and (电能量类型=''正向有功'' or 电能量类型=''反向有功'') GROUP BY 关口点全名,电能量类型,数据 HAVING COUNT(关口点全名)=trunc((To_date('''||dateto||''' , ''yyyy/mm/dd hh24-mi-ss'') - To_date('''||datefrom||''' , ''yyyy/mm/dd hh24-mi-ss'')+2))';

确实有用,在下新手一个不知 "" 和 || 有何区别,好人做到底解释一下吧,或者告诉我这属于数据库那部分,我去查查,学习一下,基础太差了啊
  • 打赏
  • 举报
回复

execute immediate 'create table customise1 as SELECT 关口点全名,电能量类型,数据 FROM 表底 WHERE datetime BETWEEN to_date('''||datefrom||''',''yyyy/mm/dd'') AND to_date('''||dateto||''',''yyyy/mm/dd'') and (电能量类型=''正向有功'' or 电能量类型=''反向有功'') GROUP BY 关口点全名,电能量类型,数据 HAVING COUNT(关口点全名)=trunc((To_date('''||dateto||''' , ''yyyy/mm/dd hh24-mi-ss'') - To_date('''||datefrom||''' , ''yyyy/mm/dd hh24-mi-ss'')+2))';

  • 打赏
  • 举报
回复
楼主 datefrom  和 dateto传入参数在动态sql里面没有用到而是用一个字符串去to_date。。。

17,382

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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