读书人

Oracle存储过程时间参数有关问题。

发布时间: 2013-10-11 14:52:39 作者: rapoo

Oracle存储过程时间参数问题求救。。。。。
我有个Oracle存储过程,使用了时间参数,用的是date,貌似不好使,然后使用了string,在存储过程里面转成date,但是执行结果不正确,麻烦大牛给看看啥问题。

create or replace procedure MY_TEST_1(P_TABLE_CALC   IN VARCHAR2,
P_TABLE_RESULT IN VARCHAR2,
P_APPKEY IN VARCHAR2,
P_CALC_DEC IN VARCHAR2,
P_CALC_DATE IN VARCHAR2) IS
V_SQL VARCHAR2(500);
V_DATE VARCHAR2(30);
BEGIN
V_DATE := to_date(P_CALC_DATE,'yyyy-mm-dd HH24:MI:SS');
V_SQL := ' INSERT INTO ' || P_TABLE_CALC || ' (CTIME,
APPKEY,
GAMECHANNEL,
GAMEREALM,
GAMEVERSION,
RESULT_CNT,
RESULT_DEC)
SELECT ''' || to_date( P_CALC_DATE ,'yyyy-mm-dd HH24:MI:SS') || ''',
''' || P_APPKEY || ''',
GAMECHANNEL,
GAMEREALM,
GAMEVERSION,
NVL(SUM(AMOUNT), 0),''' || P_CALC_DEC || ''' FROM ' ||
P_TABLE_RESULT || ' T
WHERE T.CTIME >= ''' || to_date( P_CALC_DATE ,'yyyy-mm-dd HH24:MI:SS') || '''
GROUP BY T.GAMECHANNEL, T.GAMEVERSION, T.GAMEREALM';
EXECUTE IMMEDIATE 'COMMIT';
DBMS_OUTPUT.put_line('The result is ' || V_SQL);
DBMS_OUTPUT.put_line('The date is ' || V_DATE);
COMMIT;
END MY_TEST_1;


在执行的过程中看了输出,日期格式是:‘16-9月 -13’这样的,同样的语句我不用存储过程,直接赋值执行就没有问题,这个是执行输出:
The result is  INSERT INTO mbi_Test_calc_tmp (CTIME,
APPKEY,
GAMECHANNEL,
GAMEREALM,
GAMEVERSION,
RESULT_CNT,
RESULT_DEC)
SELECT '16-9月 -13',
'dddd',
GAMECHANNEL,
GAMEREALM,
GAMEVERSION,
NVL(SUM(AMOUNT), 0),'fffff' FROM mbi_test_role_recharge T
WHERE T.CTIME >= '16-9月 -13'
GROUP BY T.GAMECHANNEL, T.GAMEVERSION, T.GAMEREALM
The date is 16-9月 -13


麻烦大牛看下,谢谢了。
[解决办法]
你表P_TABLE_CALC中CTIME如果是Varchar2类型,你就去掉
V_DATE := to_date(P_CALC_DATE,'yyyy-mm-dd HH24:MI:SS');
SELECT '''
[解决办法]
to_date( P_CALC_DATE ,'yyyy-mm-dd HH24:MI:SS')
[解决办法]
''', 改为
SELECT P_CALC_DATE,
如果是date类型:
SELECT '''
[解决办法]
to_date( P_CALC_DATE ,'yyyy-mm-dd HH24:MI:SS')
[解决办法]
''', 改为
SELECT V_DATE,

------解决方案--------------------


引用:
Quote: 引用:

你别让to_date给解析了啊,下面给你一个例子。。自己对照修改吧

create table t (day date);
/

declare
v_sql varchar2(200);
v_date varchar2(10):='20130102';
begin
v_sql:= 'insert into t values(to_date('''
[解决办法]
v_date
[解决办法]
''',''yyyymmdd''))';

dbms_output.put_line(v_sql);
execute immediate v_sql;
commit;
end;

虽然问题解决了,但是为啥是这样啊,我看了下to_date是按照客户端来解析的,这样就只有7字节了,是这个原因么?



啥 7 字节啊

读书人网 >oracle

热点推荐