FAQ
Hi

I am using dynamic sql in a stored procedure which inserts dates into a
table.

The procedure is as follows:

create or replace procedure ins_date
is

l_date date := sysdate;
l_sql varchar2(1000);
begin

l_sql := 'insert into kk ' || chr(10) ||
'select '|| l_date ||' from dual';

dbms_output.put_line(l_sql);
execute immediate l_sql;
end;
/

kk is a table with a column (datatype date)

whenever I execute I get this error

SQL> exec ins_date
insert into kk
select 20070125 17:11:47 from dual
BEGIN ins_date; END;

*
ERROR at line 1:

ORA-00923: FROM keyword not found where expected
ORA-06512: at "LSC.INS_DATE", line 9
ORA-06512: at line 1

If I change the procedure to

create or replace procedure ins_date
is

l_date date := sysdate;
l_sql varchar2(1000);
begin

l_sql := 'insert into kk ' || chr(10) ||
'select sysdate from dual';

dbms_output.put_line(l_sql);
execute immediate l_sql;
end;
/

it runs perfectly

exec ins_date
insert into kk
select sysdate from dual

PL/SQL procedure successfully completed.

Anyone know what can be wrong?

TIA

Search Discussions

  • Mercadante, Thomas F \(LABOR\) at Jan 25, 2007 at 5:59 pm
    Cheng,

    First, get rid of the chr(10).

    Secondly, did you try and debug the sql statement you are generating?

    Did you try and run this through sqlplus?



    Insert into kk select 20070125 17:11:47 from dual;



    Does this look like a sql statement that will work? Give it a try and
    see what happens.

    Tom





    This transmission may contain confidential, proprietary, or privileged information which is intended solely for use by the individual or entity to whom it is addressed. If you are not the intended recipient, you are hereby notified that any disclosure, dissemination, copying or distribution of this transmission or its attachments is strictly prohibited. In addition, unauthorized access to this transmission may violate federal or State law, including the Electronic Communications Privacy Act of 1985. If you have received this transmission in error, please notify the sender immediately by return e-mail and delete the transmission and its attachments.

    From: oracle-l-bounce_at_freelists.org
    On Behalf Of LS Cheng
    Sent: Thursday, January 25, 2007 11:13 AM
    To: oracle-l
    Subject: dynamic sql and dates



    Hi

    I am using dynamic sql in a stored procedure which inserts dates into a
    table.

    The procedure is as follows:

    create or replace procedure ins_date
    is

    l_date date := sysdate;
    l_sql varchar2(1000);
    begin

    l_sql := 'insert into kk ' || chr(10) ||
    'select '|| l_date ||' from dual';

    dbms_output.put_line(l_sql);
    execute immediate l_sql;
    end;
    /

    kk is a table with a column (datatype date)

    whenever I execute I get this error

    SQL> exec ins_date
    insert into kk
    select 20070125 17:11:47 from dual
    BEGIN ins_date; END;

    *
    ERROR at line 1:

    ORA-00923: FROM keyword not found where expected
    ORA-06512: at "LSC.INS_DATE", line 9
    ORA-06512: at line 1

    If I change the procedure to

    create or replace procedure ins_date
    is

    l_date date := sysdate;
    l_sql varchar2(1000);
    begin

    l_sql := 'insert into kk ' || chr(10) ||
    'select sysdate from dual';

    dbms_output.put_line(l_sql);
    execute immediate l_sql;
    end;
    /

    it runs perfectly

    exec ins_date
    insert into kk
    select sysdate from dual

    PL/SQL procedure successfully completed.

    Anyone know what can be wrong?

    TIA
  • Pabba, Chandra at Jan 25, 2007 at 6:22 pm
    Hi Cheng,


    I am not sure if I can explain this behavior, but I do have a work
    around. You just need to have a single-tick for l_date in the dynamic
    sql.


    create or replace procedure ins_date
    is

    l_date date := sysdate;
    l_sql varchar2(1000);
    begin

    l_sql := 'insert into kk ' || chr(10) ||
    'select '''|| l_date ||''' from dual';

    dbms_output.put_line(l_sql);
    dbms_output.put_line(sysdate);
    execute immediate l_sql;
    end;
    /

    I think, what is happening here is when you are assigning the sysdate
    value to l_date, it is getting assigned the literal value, as you will
    notice in your output (select 20070125 17:11:47 from dual ). But when
    you use sysdate it is not getting translated into a literal value and it
    is just inserting the SYSDATE. But, one caveat, if you use the above
    approach, you will lose the time factor in the date, it will be some
    thing like 25-01-07 00:00:00. If you use the SYSDATE, it will have the
    time component as well some thing like - 25-01-07 11:52:56.


    HTH



    Thanks
    Chandra Pabba
    972-584-2289



    From: oracle-l-bounce_at_freelists.org
    On Behalf Of LS Cheng

    Sent: Thursday, January 25, 2007 10:13 AM
    To: oracle-l
    Subject: dynamic sql and dates

    Hi

    I am using dynamic sql in a stored procedure which inserts dates

    into a table.


    The procedure is as follows:


    create or replace procedure ins_date
    is
    l_date date := sysdate;
    l_sql varchar2(1000);
    begin
    l_sql := 'insert into kk ' || chr(10) ||
    'select '|| l_date ||' from dual';
    dbms_output.put_line(l_sql);
    execute immediate l_sql;
    end;
    /

    kk is a table with a column (datatype date)

    whenever I execute I get this error

    SQL> exec ins_date
    insert into kk
    select 20070125 17:11:47 from dual
    BEGIN ins_date; END;

    *
    ERROR at line 1:
    ORA-00923: FROM keyword not found where expected
    ORA-06512: at "LSC.INS_DATE", line 9
    ORA-06512: at line 1

    If I change the procedure to

    create or replace procedure ins_date
    is
    l_date date := sysdate;
    l_sql varchar2(1000);
    begin
    l_sql := 'insert into kk ' || chr(10) ||
    'select sysdate from dual';
    dbms_output.put_line(l_sql);
    execute immediate l_sql;
    end;
    /

    it runs perfectly

    exec ins_date
    insert into kk
    select sysdate from dual

    PL/SQL procedure successfully completed.

    Anyone know what can be wrong?

    TIA
  • LS Cheng at Jan 25, 2007 at 7:20 pm
    Yea I noticed quotes were missing. Jesus Christ I explicitly used
    dbms_output to debug the code and could not get it right! :-P

    Thanks all

    --
    LSC
    On 1/25/07, Pabba, Chandra wrote:

    Hi Cheng,

    I am not sure if I can explain this behavior, but I do have a work
    around. You just need to have a single-tick for l_date in the dynamic sql.

    create or replace procedure ins_date
    is
    l_date date := sysdate;
    l_sql varchar2(1000);
    begin
    l_sql := 'insert into kk ' || chr(10) ||
    'select *'''|| l_date ||'''* from dual';
    dbms_output.put_line(l_sql);
    dbms_output.put_line(sysdate);
    execute immediate l_sql;
    end;
    /
    I think, what is happening here is when you are assigning the sysdate
    value to l_date, it is getting assigned the literal value, as you will
    notice in your output (select 20070125 17:11:47 from dual ). But when you
    use sysdate it is not getting translated into a literal value and it is just
    inserting the SYSDATE. But, one caveat, if you use the above approach, you
    will lose the time factor in the date, it will be some thing like 25-01-07
    00:00:00. If you use the SYSDATE, it will have the time component as well
    some thing like - 25-01-07 11:52:56.

    HTH


    Thanks
    Chandra Pabba
    972-584-2289


    ------------------------------
    *From:* oracle-l-bounce_at_freelists.org [mailto:
    oracle-l-bounce@freelists.org] *On Behalf Of *LS Cheng
    *Sent:* Thursday, January 25, 2007 10:13 AM
    *To:* oracle-l
    *Subject:* dynamic sql and dates

    Hi

    I am using dynamic sql in a stored procedure which inserts dates into a
    table.

    The procedure is as follows:

    create or replace procedure ins_date
    is
    l_date date := sysdate;
    l_sql varchar2(1000);
    begin
    l_sql := 'insert into kk ' || chr(10) ||
    'select '|| l_date ||' from dual';
    dbms_output.put_line(l_sql);
    execute immediate l_sql;
    end;
    /

    kk is a table with a column (datatype date)

    whenever I execute I get this error

    SQL> exec ins_date
    insert into kk
    select 20070125 17:11:47 from dual
    BEGIN ins_date; END;

    *
    ERROR at line 1:
    ORA-00923: FROM keyword not found where expected
    ORA-06512: at "LSC.INS_DATE", line 9
    ORA-06512: at line 1

    If I change the procedure to

    create or replace procedure ins_date
    is
    l_date date := sysdate;
    l_sql varchar2(1000);
    begin
    l_sql := 'insert into kk ' || chr(10) ||
    'select sysdate from dual';
    dbms_output.put_line(l_sql);
    execute immediate l_sql;
    end;
    /

    it runs perfectly

    exec ins_date
    insert into kk
    select sysdate from dual

    PL/SQL procedure successfully completed.

    Anyone know what can be wrong?

    TIA


    --
    LSC
    --
    http://www.freelists.org/webpage/oracle-l
  • Wolfgang Breitling at Jan 25, 2007 at 6:53 pm
    Violently shaking my head in disbelief. Even if you don't know
    already, a quick trip to the Oracle documentation gives the right solution:

    create or replace procedure ins_date
    is

    l_date date := sysdate;
    l_number number := 99;
    l_sql varchar2(1000);

    begin

    l_sql := 'insert into kk select :dt from dual';
    dbms_output.put_line(l_sql);
    dbms_output.put_line(sysdate);
    execute immediate l_sql using l_date;
    end;
    /
    At 09:12 AM 1/25/2007, LS Cheng wrote:
    Hi

    I am using dynamic sql in a stored procedure which inserts dates into a table.

    The procedure is as follows:

    create or replace procedure ins_date
    is
    l_date date := sysdate;
    l_sql varchar2(1000);
    begin
    l_sql := 'insert into kk ' || chr(10) ||
    'select '|| l_date ||' from dual';
    dbms_output.put_line(l_sql);
    execute immediate l_sql;
    end;
    /

    kk is a table with a column (datatype date)

    whenever I execute I get this error

    SQL> exec ins_date
    insert into kk
    select 20070125 17:11:47 from dual
    BEGIN ins_date; END;

    *
    ERROR at line 1:
    ORA-00923: FROM keyword not found where expected
    ORA-06512: at "LSC.INS_DATE", line 9
    ORA-06512: at line 1

    If I change the procedure to

    create or replace procedure ins_date
    is
    l_date date := sysdate;
    l_sql varchar2(1000);
    begin
    l_sql := 'insert into kk ' || chr(10) ||
    'select sysdate from dual';
    dbms_output.put_line(l_sql);
    execute immediate l_sql;
    end;
    /

    it runs perfectly

    exec ins_date
    insert into kk
    select sysdate from dual

    PL/SQL procedure successfully completed.

    Anyone know what can be wrong?

    TIA

    --
    LSC
    Regards

    Wolfgang Breitling
    Centrex Consulting Corporation
    www.centrexcc.com

    This email has been scanned by the MessageLabs Email Security System.
    For more information please visit http://www.messagelabs.com/email

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
grouporacle-l @
categoriesoracle
postedJan 25, '07 at 4:12p
activeJan 25, '07 at 7:20p
posts5
users4
websiteoracle.com

People

Translate

site design / logo © 2022 Grokbase