SQL> SELECT TO_NUMBER(TO_CHAR(TO_DATE('01/01/03','mm/dd/yy'),'J'),'9999999') FROM DUAL
  2  ;TO_NUMBER(TO_CHAR(TO_DATE('01/
------------------------------
                       2452641SQL> create or replace function get_rundom_day(d1 in number,d2 in number) return date is result date;
  2  begin
  3       SELECT TO_DATE(TRUNC(DBMS_RANDOM.VALUE(d1,d2)),'J') into result FROM DUAL;
  4       return result;
  5  end get_rundom_day;
  6  /Function createdSQL> var result date
SQL> exec :result:=get_rundom_day(2452641,2452641+364);PL/SQL procedure successfully completed
result
---------
2003/4/2这样都没问题
可是如果我想要输入两个日期期间,随机生成一个日期,怎么就不行?SQL> create or replace function get_day(fromd in varchar2(8),tod in varchar(8),d1 number,d2 number) return date is result date;
  2  begin
  3       SELECT TO_NUMBER(TO_CHAR(TO_DATE(fromd,'mm/dd/yy'),'J'),'9999999') into d1 FROM DUAL;
  4       SELECT TO_NUMBER(TO_CHAR(TO_DATE(tod,'mm/dd/yy'),'J'),'9999999') into d2 FROM DUAL;
  5       SELECT TO_DATE(TRUNC(DBMS_RANDOM.VALUE(d1,d2)),'J') into result FROM DUAL;
  6       return result;
  7  end get_day;
  8  /Warning: Function created with compilation errors不知道这上面哪里出错了。本人很菜,刚接触oracle,不知道变量是不是这样写,其实我想要的d1,d2只是个临时变量而已,但是是不是要声明成参数的,不能像MS-SQL那也声明变量?

解决方案 »

  1.   

    create or replace function get_day(fromd in varchar2,tod in varchar2) return date is 
    d1 number;
    d2 number;
    result date;
       begin
       SELECT TO_NUMBER(TO_CHAR(TO_DATE(fromd,'mm/dd/yy'),'J'),'9999999') into d1 FROM DUAL;
       SELECT TO_NUMBER(TO_CHAR(TO_DATE(tod,'mm/dd/yy'),'J'),'9999999') into d2 FROM DUAL;
       SELECT TO_DATE(TRUNC(DBMS_RANDOM.VALUE(d1,d2)),'J') into result FROM DUAL;
       return result;
       end get_day;
       /