我有个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麻烦大牛看下,谢谢了。

解决方案 »

  1.   

    你别让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;
      

  2.   

    你表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, 
      

  3.   

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

  4.   

    虽然问题解决了,但是为啥是这样啊,我看了下to_date是按照客户端来解析的,这样就只有7字节了,是这个原因么?如果你不想修改代码的话,可以在过程的最开始加上
    execute immediate 'alter session set nls_date_format=''dd-Mon-yy''';或许也可以。
      

  5.   

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

  6.   

    虽然问题解决了,但是为啥是这样啊,我看了下to_date是按照客户端来解析的,这样就只有7字节了,是这个原因么?
    啥 7  字节啊
    http://blog.oracle.com.cn/html/07/t-110907.html
    这个是查询的时候看到的,说是产生这个问题的原因
      

  7.   

    我喜欢用to_char 格式化我想要的格式日期型。