Problems with execute immediate

HELLO :
How can I execute a procedure (with input , output parameters ) , in another schema??
I have the following code :
V_SENTENCIA:= 'begin '||v_schema_name|| .DAR_ID('||V_CODE||',:p1); END;';
EXECUTE IMMEDIATE V_SENTENCIA INTO V_Num
and the declaration on my proc is the following :
CREATE PROCEDURE DAR_ID ( p_1 in varchar2 ,p_2 out NUMBER) IS
NUM NUMBER (5,0);
BEGIN
SELECT count (id) INTO p_2 FROM Veh WHERE (Param1=p_1)
END ;
Can anyone help me please ?

Hey,
this one will work:
SQL> create or replace procedure pp(p_arg in varchar2, p_res out number)
2 is
3 begin
4 select 1 into p_res from dual where p_arg = '1';
5 end;
6 /
Procedure created
SQL> set serveroutput on
SQL> declare
2 l_ret number;
3 begin
4 execute immediate 'begin pp(:p_arg, :l_ret); end;' using
5 in '1', out l_ret;
6 dbms_output.put_line(l_ret);
7 end;
8 /
1
PL/SQL procedure successfully completed
from a remote db:
SQL> set serveroutput on;
SQL>
SQL> declare
2 l_ret number;
3 begin
4 execute immediate 'begin pp@to_remote(:p_arg, :l_ret); end;'
5 using in '1', out l_ret;
6 dbms_output.put_line(l_ret);
7 end;
8 /
1
PL/SQL procedure successfully completed
Amiel.

Similar Messages

  • Single quotes problem with execute immediate

    Thanks for considering to solve the issue.
    [i]Situation:
    I am trying to create a procedure to perform a set of operations. As part of that, I am trying to create a table using execute immediate statement. This create table statement has a select sub query where p_LOB3 is the variable for the procedure of datatype varchar2.
    Problem :
    I need to pass the variable p_LOB3 as single quoted as it is of type Varchar2. Also I need to enclose the entire create table query within single quotes. How do I specify this as it is throwing an error when the PL/SQL engine is parsing the single quotes in the query used twice for different purposes as mention earlier.
    Query:
    execute immediate'create table test5 as select min(contract_number)as contract_number,contact_id,max(line_of_business) as line_of_business from mytable group by contact_id having min(contract_number) = max(contract_number) and max(Line_of_business) = 'p_LOB3' ';

    Thank you Todd,
    Is just worked fine.
    New issue is: I am not able to put 2 such statements in a single procedure and execute. Before I give parameters to the procedure, PL/SQL engine is actually creating a view of the mytable and naming is as test5, as a result I am not able to create a table as there is a view with the same name.
    Right now, the workaround I am using is to create three different procedures to create three such tables. I know this is not a good idea....can you please tell me if there is a better way.
    Procedure
    CREATE OR REPLACE PROCEDURE SP_CREATE_0_0(p_LOB1 IN varchar2, p_LOB2 IN varchar2)
    IS
    BEGIN
    execute immediate 'create table test5 as select min(contract_number) as
    contract_number,contact_id,max(line_of_business) as line_of_business from
    mytable group by contact_id having min(contract_number) = max(contract_number)
    and max(Line_of_business) = ' ' ' || p_LOB1 || ' ' ' ';
    execute immediate 'create table test5 as select min(contract_number) as
    contract_number,contact_id,max(line_of_business) as line_of_business from
    mytable group by contact_id having min(contract_number) = max(contract_number)
    and max(Line_of_business) = ' ' ' || p_LOB1 || ' ' ' ';
    END SP_CREATE_0_0;
    /

  • Problem with execute immediate

    hi,
    Oracle gurus,
    when i execute the following statement in a procedure it is not getting executed and it is getting strucked,
    pls provide me some suggestions.
    This is very urgent.
    is there any proble with commented lines?
    EXECUTE IMMEDIATE          'select
                        oh.account_no,
                        p.ord_line_no,
                        o.ord_no,
                        p.lot ,
                        (pr1.each_qty/pr.each_qty),
                        :p_comp_id ,
                        p.cube,
                        sysdate,
                        SYSDATE,--p.pick_date,
                        SYSDATE,--pw.date_time_released,
                        pr.each_qty,
                        :p_ebiz_appown_no,
                        p.ord_cntrl_no,
                        oh.ord_cntrl_no,
                        nvl(p.prod_no,0),
                        :p_ebiz_user_no,
                        nvl(sl.wdth,0) * nvl(sl.dpth,0),
                        decode(s.haz_mat_class,null,''N'',''Y''),
                        ''N'',
                        p.ord_line_no,
                        p.loc,
                        p.lp,
                        (nvl(p.qty,0)/nvl(pr.each_qty,1)),
                        1,
                        (nvl(p.qty,1)/pr1.each_qty),--ceil(nvl(p.qty,1)/pr1.each_qty),
                        oh.ord_prio,
                        oh.ord_type,
                        o.ord_no ,
                        nvl(p.pkg_no,0),
                        :p_task_no,
                        p.pick_line,
                        pl.pickline_type,
                        to_char(nvl(p.transact_id,0)),
                        p.qty ,
                        oh.ord_type,
                        :p_site_id,
                        nvl(s.sku,''SKU ERROR''),
                        s.sku_desc1_35      ,
                        s.prod_fam ,
                        s.prod_cat,
                        o.prod_stat,
                        2 ,
                        SYSDATE,--nvl(p.pick_date,sysdate),
                        bt.task_desc ,
                        bt.task_type,
                        null,--p.pick_date,
                        sl.type_stor_equip ,
                        o.uom,
                        p.wght
                   from      [email protected] pr,
                        mast_abbtype bt,
                        mast_company bc,
                        [email protected] sl,
                        sku@'||l_dblink||' s,
                        picks@'||l_dblink||' p,
                        ordline'||l_dblink||' o,
                        ordhead@'||l_dblink||' oh,
                        prodqty@'||l_dblink||' pr1,
                        pickwave@'||l_dblink||' pw,
                        pickline@'||l_dblink||' pl
                   where      decode(bt.comp_id,null,:p_comp_id,bt.comp_id)=:p_comp_id
                        and decode(bt.site_id,null,:p_site_id,bt.site_id)=:p_site_id
                        and bt.task_type = ''PICK''--decode(null,''PICK'',''PIK'',''PIK'')
                        and bc.delete_flag=''N''
                        and bt.active_flag=''Y''
                        and bc.active_flag=''Y''
                        and bt.delete_flag=''N''                    --and nvl(bc.ebiz_appown_no,-1) = nvl(bt.ebiz_appown_no,-1)
         and nvl(bc.ebiz_appown_no,-1) =1nvl(p_ebiz_appown_no,-1)
                   and nvl(p.failed_pick_flg,''N'') != ''Y''
                   and (bt.site_id =:p_site_id or bt.site_id is null)
                        and p.cmpl_time is not null
                        and p.wave_no = pw.wave_no
                        and s.prod_no = p.prod_no
                   and pr.prod_no = s.prod_no
                        and pr.pkg_no = p.pkg_no
    --and p.ord_cntrl_no in (select ord_cntrl_no from [email protected]  where ord_no = nvl(NULL, ord_no))
    --nvl(p_ebiz_po_no, p.ord_cntrl_no)
    --     and p.ord_cntrl_no = nvl(p_rec_cntrl_no, p.ord_cntrl_no)
         and nvl(p.prod_no,0) = nvl(:p_ebiz_sku_no, nvl(p.prod_no,0))
                   and oh.ord_type = nvl(NULL, oh.ord_type)
                   and nvl(o.prod_stat, ''~'') = nvl(:p_sku_status, nvl(o.prod_stat, ''~''))
                   and p.lp = nvl(:p_lp, p.lp)
                   and nvl(p.lot, ''~'') = nvl(:p_batch_no, nvl(p.lot, ''~''))
                   and pr.logical_case_flg = ''Y''
                   --and nvl(bt.site_id,''~'') = nvl(bc.site_id,''~'')
                   and s.comp_code = p.comp_code
                   and sl.loc = p.loc
              --     and nvl(pick_time,0) != ''9898''
                   and p.ord_cntrl_no = o.ord_cntrl_no
                   and p.ord_line_no = o.ord_line_no
                   and o.ord_cntrl_no = oh.ord_cntrl_no
                   and trunc(p.pick_date) between trunc(nvl(sysdate-10000,p.pick_date)) and trunc(nvl(sysdate,p.pick_date))
                   and nvl(p.pick_date,sysdate)<= nvl(bc.effective_date,sysdate)
                   and p.ord_cntrl_no = decode(null,null,p.ord_cntrl_no,null)
                   and pr1.pkg_no = pr.pkg_no
                   and pr1.prod_no = pr.prod_no
                   and pr1.logical_plt_flg = ''Y'' '
                   --and p.pick_line = pl.line_id      '
         Bulk collect into
                   l_account_no,
                   l_asn_line_no,
                   l_asn_no,
                   l_batch_no,
                   l_cases_per_pallet,
                   l_comp_id,
                   l_cube,
                   l_currdate,
                   l_date_time_ended,
                   l_date_time_started,
                   l_eachs_per_case,
                   l_ebiz_appown_no,
                   l_ebiz_asn_no,
                   l_ebiz_cntrl_no,
                   l_ebiz_sku_no,
                   l_ebiz_user_no,
                   l_footage,
                   l_hazmat_flag,
                   l_intf_conf_flag,
                   l_line_no,
                   l_location,
                   l_lp,
                   l_no_of_cases,
                   l_no_of_units,
                   l_no_plts,
                   l_order_priority,
                   l_order_type,
                   l_ord_no,
                   l_packcode,
                   l_parent_task_no,
                   l_pickline_id,
                   l_pickline_type,
                   l_po_no,
                   l_qty,
                   l_rcv_type,
                   l_site_id,
                   l_sku,
                   l_skudesc1,
                   l_skufam,
                   l_skugroup,
                   l_sku_status,
                   l_status_flag,
                   l_task_date,
                   l_task_desc,
                   l_task_type,
                   l_time,
                   l_type_stor_equip,
                   l_uom_id,
                   l_wght
         using           p_comp_id,p_ebiz_appown_no,p_ebiz_user_no,p_task_no,
                   p_site_id,p_comp_id,p_comp_id,p_site_id,p_site_id,          p_site_id,p_ebiz_sku_no,p_sku_status,p_lp,p_batch_no;
    regards RR.

    hi,
    again iam sending the same query for ur easy reference.
    pls treat it urgent.
    EXECUTE IMMEDIATE 'select
    oh.account_no,p.ord_line_no,     o.ord_no,     p.lot ,
    (pr1.each_qty/pr.each_qty),     :p_comp_id ,p.cube,
    sysdate,     SYSDATE,--p.pick_date,     SYSDATE,--pw.date_time_released,
    r.each_qty,:p_ebiz_appown_no,     p.ord_cntrl_no,oh.ord_cntrl_no,
    nvl(p.prod_no,0),     :p_ebiz_user_no,nvl(sl.wdth,0) * nvl(sl.dpth,0),
    decode(s.haz_mat_class,null,''N'',''Y''),''N'',p.ord_line_no,p.loc,p.lp,
    (nvl(p.qty,0)/nvl(pr.each_qty,1)),     1,
    (nvl(p.qty,1)/pr1.each_qty),--ceil(nvl(p.qty,1)/pr1.each_qty),
    oh.ord_prio,     oh.ord_type,o.ord_no ,nvl(p.pkg_no,0),
    :p_task_no,p.pick_line,pl.pickline_type,     to_char(nvl(p.transact_id,0)),
    p.qty ,     oh.ord_type,:p_site_id,     nvl(s.sku,''SKU ERROR''),
    s.sku_desc1_35      ,     s.prod_fam ,     s.prod_cat,
    o.prod_stat,     2 ,     SYSDATE,--nvl(p.pick_date,sysdate),
    bt.task_desc ,bt.task_type,     null,--p.pick_date,sl.type_stor_equip ,
    o.uom,     p.wght
    FROM
    [email protected] pr,
    mast_abbtype bt,
    mast_company bc,
    [email protected] sl,
    sku@'||l_dblink||' s,
    picks@'||l_dblink||' p,
    ordline'||l_dblink||' o,
    ordhead@'||l_dblink||' oh,
    prodqty@'||l_dblink||' pr1,
    pickwave@'||l_dblink||' pw,
    pickline@'||l_dblink||' pl
    WHERE
    decode(bt.comp_id,null,:p_comp_id,bt.comp_id)=:p_comp_id
    and decode(bt.site_id,null,:p_site_id,bt.site_id)=:p_site_id
    and bt.task_type = ''PICK''--decode(null,''PICK'',''PIK'',''PIK'')
    and bc.delete_flag=''N''
    and bt.active_flag=''Y''
    and bc.active_flag=''Y''
    and bt.delete_flag=''N''
    and nvl(p.failed_pick_flg,''N'') != ''Y''
    and (bt.site_id =:p_site_id or bt.site_id is null)
    and p.cmpl_time is not null
    and p.wave_no = pw.wave_no
    and s.prod_no = p.prod_no
    and pr.prod_no = s.prod_no
    and pr.pkg_no = p.pkg_no
    and nvl(p.prod_no,0) = nvl(:p_ebiz_sku_no, nvl(p.prod_no,0))
    and oh.ord_type = nvl(NULL, oh.ord_type)
    and nvl(o.prod_stat, ''~'') = nvl(:p_sku_status, nvl(o.prod_stat, ''~''))
    and p.lp = nvl(:p_lp, p.lp)
    and nvl(p.lot, ''~'') = nvl(:p_batch_no, nvl(p.lot, ''~''))
    and pr.logical_case_flg = ''Y''
    and s.comp_code = p.comp_code
    and sl.loc = p.loc
    and p.ord_cntrl_no = o.ord_cntrl_no
    and p.ord_line_no = o.ord_line_no
    and o.ord_cntrl_no = oh.ord_cntrl_no
    and trunc(p.pick_date) between trunc(nvl(sysdate-10000,p.pick_date)) and trunc(nvlsysdate,p.pick_date))
    and nvl(p.pick_date,sysdate)<= nvl(bc.effective_date,sysdate)
    and p.ord_cntrl_no = decode(null,null,p.ord_cntrl_no,null)
    and pr1.pkg_no = pr.pkg_no
    and pr1.prod_no = pr.prod_no
    and pr1.logical_plt_flg = ''Y'' '
    Bulk collect into
    l_account_no,
    l_asn_line_no,
                   l_asn_no,
                   l_batch_no,
                   l_cases_per_pallet,
                   l_comp_id,
                   l_cube,
                   l_currdate,
                   l_date_time_ended,
                   l_date_time_started,
                   l_eachs_per_case,
                   l_ebiz_appown_no,
                   l_ebiz_asn_no,
                   l_ebiz_cntrl_no,
                   l_ebiz_sku_no,
                   l_ebiz_user_no,
                   l_footage,
                   l_hazmat_flag,
                   l_intf_conf_flag,
                   l_line_no,
                   l_location,
                   l_lp,
                   l_no_of_cases,
                   l_no_of_units,
                   l_no_plts,
                   l_order_priority,
                   l_order_type,
                   l_ord_no,
                   l_packcode,
                   l_parent_task_no,
                   l_pickline_id,
                   l_pickline_type,
                   l_po_no,
                   l_qty,
                   l_rcv_type,
                   l_site_id,
                   l_sku,
                   l_skudesc1,
                   l_skufam,
                   l_skugroup,
                   l_sku_status,
                   l_status_flag,
                   l_task_date,
                   l_task_desc,
                   l_task_type,
                   l_time,
                   l_type_stor_equip,
                   l_uom_id,
                   l_wght
         using           p_comp_id,p_ebiz_appown_no,p_ebiz_user_no,p_task_no,
         p_site_id,p_comp_id,p_comp_id,p_site_id,p_site_id,          p_site_id,p_ebiz_sku_no,p_sku_status,p_lp,p_batch_no;
    here l_dblink contains database link
    regards
    RR

  • Problem with execute immediate code

    I have the following anonymous block:
    declare
    v_id_char varchar2(50) := '2072018827821663';
    trace_flg number := 0;
    v_exe_imm varchar2(500) := 'univdb.EML_CAMPUS_200605(v_id_char, trace_flg)';
    v_exe_imm2 varchar2(500) := 'univdb.EML_CAMPUS_200605(:v_id_char, :trace_flg)';
    begin
    --1) execute immediate v_exe_imm;
    --2) execute immediate v_exe_imm2 using v_id_char, trace_flg);
    univdb.EML_CAMPUS_200605(v_id_char, trace_flg);
    end;
    The compiled procedure that is getting called is defined like this:
    CREATE OR REPLACE PROCEDURE univdb.eml_campus_200605(
    hist_str IN VARCHAR2,
    trace_flg IN NUMBER := 0) IS ...
    As you might expect, when I execute the block without execute immediate it works.
    But either of the execute immediate statements results in ORA-00900: invalid SQL statment.
    I want to use execute immediate because the procedure that gets called will need to be dynamic.
    Help appreciated,
    ...elsa

    For me, thats crude if you have a procedure thats
    getting created dynamically.
    anyway, you could try a
    execute immediate ' begin ' || your_funny_proc || '
    end;';But for sure the whole stuff is very error prone.Actually, the procedure itself isn't getting built dynamically, only which procedure to call. It's really quite clever in my opinion.
    Anyway, I tried you suggestion:
    declare
    v_id_char varchar2(50) := '2072018827821663';
    trace_flg number := 0;
    v_exe_imm varchar2(500) := 'univdb.EML_CAMPUS_200605(v_id_char, trace_flg)';
    v_exe_imm2 varchar2(500) := 'univdb.EML_CAMPUS_200605(:v_id_char, :trace_flg)';
    begin
    execute immediate 'BEGIN ' || v_exe_imm || '; END;';
    --execute immediate v_exe_imm2 using v_id_char, trace_flg);
    --univdb.EML_CAMPUS_200605(v_id_char, trace_flg);
    end;
    and got
    ORA-06550: line 1, column 32:
    PLS-00201: identifier 'V_ID_CHAR' must be declared
    Did I misunderstand what you were trying for?

  • Disadvantage with 'Execute Immediate'

    What is the disadvantage with 'EXECUTE IMMEDIATE'.

    I think you guys are missing the point here.
    None of the issues listed are 'EXECUTE IMMEDIATE' disadvantages.
    'EXECUTE IMMEDIATE' is a tool. Like DMS_SQL. Like ref cursors. Like explicit cursor. Like implicit cursors.
    A tool, any tool, needs to be used correctly. If you use a hammer and hit a nail so hard that it bents, causing the hammer to slip doing some serious damage to your thumb... whose fault it is?
    Is it The Hammer that is at fault here? Or is the user of that tool?
    There are no disadvantages to using 'EXECUTE IMMEDIATE'. It is a tool. But like all tools it needs to be used correctly and safely. Things like excessive hard parsing because of a severe lack of bind variables, or opening a hole for SQL injection, etc.. all these are symptoms of - and let's be blunt here - an ignorant developer. It has nothing to do with the tool 'EXECUTE IMMEDIATE'.
    And those same type of errors will be made by Mr Ignorant Developer using other tools in Oracle.
    Shoddy workmanship is not because of poor tools. Shoddy code is not because of using a specific feature (like execute immediate).
    The proper question to ask is thus not "what are the disadvantages of execute immediate", but rather "where should I typically use execute immediate and how?".
    Not every developer will know how to use every single tool in the toolbox (I sure don't know all the tools in the Oracle toolbox). So there is nothing wrong with asking.
    But asking what is "wrong" with a tool (aka "what are the disadvantages") is in my view seriously missing the point that a tool is there to solve very specific types of problems...
    That is what a developer should be after - How to use the tool correctly.

  • Pipelined Function with execute immediate

    Hello Experts,
    I have created a Pipe lined function with execute immediate, due to below requirement;
    1) Columns in where clause is passed dynamically.
    2) I want to know the data stored into above dynamic columns.
    3) I want to use it in report, so I don't want to insert it into a table.
    I have created a TYPE, then through execute immediate i have got the query and result of that query will be stored in TYPE.
    But when calling the function i am getting
    ORA-00932: inconsistent datatypes: expected - got -
    Below is my function and type, let me know i am going wrong, and is my logic correct.
    CREATE OR REPLACE TYPE OBJ_FPD AS OBJECT
                      (LOW_PLAN_NO VARCHAR2 (40),
                       FPD VARCHAR2 (5),
                       SERIAL_NO NUMBER,
                       CEDIA_CODE VARCHAR2 (2),
                       DT DATE);
    CREATE OR REPLACE TYPE FPD_TBL_TYPE AS TABLE OF OBJ_FPD;
    CREATE OR REPLACE FUNCTION FUNC_GET_FPD_DATE (P_LOW_PLAN_NO    VARCHAR2,
                                                  P_CEDIA_CODE     VARCHAR2,
                                                  P_SERIAL_NO      NUMBER)
       RETURN FPD_TBL_TYPE
       PIPELINED
    AS
       CURSOR C1
       IS
              SELECT 'FPD' || LEVEL TBL_COL
                FROM DUAL
          CONNECT BY LEVEL <= 31;
       V_STR        VARCHAR2 (5000);
       V_TBL_TYPE   FPD_TBL_TYPE;
    BEGIN
       FOR X IN C1
       LOOP
          V_STR :=
                'SELECT A.low_PLAN_NO,
               A.FPD,
               A.SERIAL_NO,
               A.cedia_code,
               TO_DATE (
                     SUBSTR (FPD, 4, 5)
                  || ''/''
                  || TO_CHAR (C.low_PLAN_PERIOD_FROM, ''MM'')
                  || ''/''
                  || TO_CHAR (C.low_PLAN_PERIOD_FROM, ''RRRR''),
                  ''DD/MM/RRRR'')
                  DT FROM ( SELECT low_PLAN_NO, '
             || ''''
             || X.TBL_COL
             || ''''
             || ' FPD, '
             || X.TBL_COL
             || ' SPTS, SERIAL_NO, cedia_code FROM M_low_PLAN_DETAILS WHERE NVL('
             || X.TBL_COL
             || ',0) > 0 AND SERIAL_NO = '
             || P_SERIAL_NO
             || ' AND cedia_code = '
             || ''''
             || P_CEDIA_CODE
             || ''''
             || ' AND low_PLAN_NO = '
             || ''''
             || P_LOW_PLAN_NO
             || ''''
             || ') A,
               M_low_PLAN_DETAILS B,
               M_low_PLAN_MSTR C
         WHERE     A.low_PLAN_NO = B.low_PLAN_NO
               AND A.cedia_code = B.cedia_code
               AND A.SERIAL_NO = B.SERIAL_NO
               AND B.low_PLAN_NO = C.low_PLAN_NO
               AND B.CLIENT_CODE = C.CLIENT_CODE
               AND B.VARIANT_CODE = C.VARIANT_CODE
    CONNECT BY LEVEL <= SPTS';
          EXECUTE IMMEDIATE V_STR INTO V_TBL_TYPE;
          FOR I IN 1 .. V_TBL_TYPE.COUNT
          LOOP
             PIPE ROW (OBJ_FPD (V_TBL_TYPE (I).LOW_PLAN_NO,
                                V_TBL_TYPE (I).FPD,
                                V_TBL_TYPE (I).SERIAL_NO,
                                V_TBL_TYPE (I).CEDIA_CODE,
                                V_TBL_TYPE (I).DT));
          END LOOP;
       END LOOP;
       RETURN;
    EXCEPTION
       WHEN OTHERS
       THEN
          RAISE_APPLICATION_ERROR (-20000, SQLCODE || ' ' || SQLERRM);
          RAISE;
    END;Waiting for your views.
    Regards,

    Ora Ash wrote:
    Hello Experts,
    I have created a Pipe lined function with execute immediate, due to below requirement;
    1) Columns in where clause is passed dynamically.No, that's something you've introduced, and is due to poor database design. You appear to have columns on your table called FPD1, FPD2 ... FPD31. The columns do not need to be 'passed dynamically'
    2) I want to know the data stored into above dynamic columns.And you can know the data without it being dynamic.
    3) I want to use it in report, so I don't want to insert it into a table.That's fine, though there's no reason to use a pipelined function.
    You also have an pointless exception handler, which masks any real errors.
    I'm not quite sure what the point of your "connect by" is in your query as we don't have your tables or data or know for sure what the expected output is.
    However, in terms of handling the 'dynamic' part that you've introduced, then you would be looking at doing something along the following lines, using a static query that requires no poor dynamic code, and no pipelined function...
    with x as (select level as dy from dual connect by level <= 31)
    select a.low_plan_no
          ,a.fpd
          ,a.serial_no
          ,a.cedia_code
          ,trunc(c.low_plan_period_from)+a.dy-1 as dt
    from  (select low_plan_no
                 ,dy
                 ,'FPD'||dy as fpd
                 ,spts
                 ,serial_no
                 ,cedia_code
           from (
                 select low_plan_no
                       ,x.dy
                       ,case x.dy when 1 then fpd1
                                  when 2 then fpd2
                                  when 3 then fpd3
                                  when 4 then fpd4
                                  when 5 then fpd5
                                  when 6 then fpd6
                                  when 7 then fpd7
                                  when 8 then fpd8
                                  when 9 then fpd9
                                  when 10 then fpd10
                                  when 11 then fpd11
                                  when 12 then fpd12
                                  when 13 then fpd13
                                  when 14 then fpd14
                                  when 15 then fpd15
                                  when 16 then fpd16
                                  when 17 then fpd17
                                  when 18 then fpd18
                                  when 19 then fpd19
                                  when 20 then fpd20
                                  when 21 then fpd21
                                  when 22 then fpd22
                                  when 23 then fpd23
                                  when 24 then fpd24
                                  when 25 then fpd25
                                  when 26 then fpd26
                                  when 27 then fpd27
                                  when 28 then fpd28
                                  when 29 then fpd29
                                  when 30 then fpd30
                                  when 31 then fpd31
                        else null
                        end as spts
                       ,serial_no
                       ,cedia_code
                 from   x cross join m_low_plan_details
                 where  serial_no = p_serial_no
                 and    cedia_code = p_cedia_code
                 and    low_plan_no = p_low_plan_no
           where  nvl(spts,0) > 0
          ) A
          join m_low_plan_details B on (    A.low_plan_no = B.low_plan_no
                                        and A.cedia_code = B.cedia_code
                                        and A.serial_no = B.serial_no
          join m_low_plan_mstr C on (    B.low_plan_no = C.low_plan_no
                                     and B.client_code = C.client_code
                                     and B.variant_code = C.variant_code
    connect by level <= spts;... so just remind us again why you think it needs to be dynamic?

  • Transaction control with execute immediate

    Hi, What is the correct way to commit/ rollback transactions when executing a dynamic update statement with execute immediate?

    Hi Thanks fo the reply, they don't appear to be. here's my procedure. Is there anything the is obviously wrong?
    PROCEDURE p_move_city_numerics ( p_mode IN VARCHAR2,
    p_schema IN VARCHAR2,
              p_table IN VARCHAR2,
                   p_destination IN VARCHAR2,
                   p_city_name IN VARCHAR2,
                   p_outcome     OUT VARCHAR2)
    IS
    l_valid_object VARCHAR2(200);
         l_error_msg VARCHAR2(200);
         l_outcome     VARCHAR2(2000);
         l_sql_count VARCHAR2(2000);
         l_sql_update VARCHAR2(2000);
         l_record_count NUMBER;
         e_object_error EXCEPTION;
    BEGIN
    l_valid_object := f_is_city_valid (p_schema, p_table, p_destination);
         IF l_valid_object != 'VALID' THEN
         RAISE e_object_error;
         END IF;
         l_sql_count := 'SELECT COUNT(*) FROM ' || p_schema || '.' || p_table;
         l_sql_count := l_sql_count || ' WHERE UPPER(city) LIKE ' || '''' || '%' || UPPER(p_city_name) || '%' || '''';
         l_sql_count := l_sql_count || ' AND ( city LIKE ' || '''' || '%1%' || '''';
         l_sql_count := l_sql_count || ' OR city LIKE ' || '''' || '%2%' || '''';
         l_sql_count := l_sql_count || ' OR city LIKE ' || '''' || '%3%' || '''';
         l_sql_count := l_sql_count || ' OR city LIKE ' || '''' || '%4%' || '''';
         l_sql_count := l_sql_count || ' OR city LIKE ' || '''' || '%5%' || '''';
         l_sql_count := l_sql_count || ' OR city LIKE ' || '''' || '%6%' || '''';
         l_sql_count := l_sql_count || ' OR city LIKE ' || '''' || '%7%' || '''';
         l_sql_count := l_sql_count || ' OR city LIKE ' || '''' || '%8%' || '''';
         l_sql_count := l_sql_count || ' OR city LIKE ' || '''' || '%9%' || '''';
         l_sql_count := l_sql_count || ' OR city LIKE ' || '''' || '%0%' || '''' || ')';
         l_sql_update := 'UPDATE ' || p_schema || '.' || p_table;
         l_sql_update := l_sql_update || ' SET ' || p_destination || ' = city,';
         l_sql_update := l_sql_update || ' city = ' || '''' || p_city_name || '''';
         l_sql_update := l_sql_update || ' WHERE UPPER(city) LIKE ' || '''' || '%' || UPPER(p_city_name) || '%' || '''';
         l_sql_update := l_sql_update || ' AND ( city LIKE ' || '''' || '%1%' || '''';
         l_sql_update := l_sql_update || ' OR ciity LIKE ' || '''' || '%2%' || '''';
         l_sql_update := l_sql_update || ' OR city LIKE ' || '''' || '%3%' || '''';
         l_sql_update := l_sql_update || ' OR city LIKE ' || '''' || '%4%' || '''';
         l_sql_update := l_sql_update || ' OR city LIKE ' || '''' || '%5%' || '''';
         l_sql_update := l_sql_update || ' OR city LIKE ' || '''' || '%6%' || '''';
         l_sql_update := l_sql_update || ' OR city LIKE ' || '''' || '%7%' || '''';
         l_sql_update := l_sql_update || ' OR city LIKE ' || '''' || '%8%' || '''';
         l_sql_update := l_sql_update || ' OR city LIKE ' || '''' || '%9%' || '''';
         l_sql_update := l_sql_update || ' OR city LIKE ' || '''' || '%0%' || '''' || ')';
         IF p_mode = 'SELECT' THEN
         EXECUTE IMMEDIATE(l_sql_count) INTO l_record_count;
         l_outcome := TO_CHAR(l_record_count) || ' records to be updated!';
         ELSIF p_mode = 'UPDATE' THEN
         EXECUTE IMMEDIATE(l_sql_count) INTO l_record_count;
         EXECUTE IMMEDIATE(l_sql_update);
    l_outcome := TO_CHAR(l_record_count) || ' records have been updated!';
         COMMIT;
         ELSE
         l_outcome := ' ERROR - Invalid mode: ' || p_mode || ' has been passed into the function! Valid values are SELECT or UPDATE';
         END IF;
    EXCEPTION
    WHEN e_object_error THEN
         IF l_valid_object = 'INVALID_TABLE' THEN
         l_outcome := 'ERROR - Not a valid table name: ' || p_schema || '.' || p_table;
         ELSIF l_valid_object = 'INVALID_CITY' THEN
         l_outcome := 'ERROR - CITY not a valid field in the table: ' || p_schema || '.' || p_table;
         ELSIF l_valid_object = 'INVALID_DEST' THEN
         l_outcome := 'ERROR - Destination field: ' || p_destination || ' is not a valid field in the table: ' || p_schema || '.' || p_table;
         END IF;
         WHEN OTHERS THEN
         l_error_msg := SQLCODE || '-' || SUBSTR(SQLERRM, 1, 150);
         l_outcome := 'ERROR - ' || l_error_msg;
         ROLLBACK;
    END p_move_city_numerics;

  • Execute a DML query its length exceeds 4000 characters with execute immediate statement.

    I want to execute a DML query with execute immediate statement. That DML query length exceeds 4000 characters. This query has Xquery related conditions, i can not split the query. when i tried execute it is giving "string literal too long".  I tried with DBMS_SQL.Parse() and DBMS_SQL.Execute also, but it is giving same error. I have to execute this DML query inside a Procedure. Please help me to resolve this. We are using oracle 10g version
    Thanks & Regards,
    K.Kedarnadh

    Actually Query is a dynamic query. Query length will exceeds if the no of domains\domain values \products exceeds. Any way Below one is current dynamic query, which is generated within procedure
    SELECT
      IVT.ID_IVT
        ,IVT.ID_INS_IVT
      ,EXTRACTVALUE(IVT.DOCUMENT_IVT,'//productName/text()') AS PRODUCTNAME
      ,EXTRACTVALUE(IVT.DOCUMENT_IVT,'//elementName/text()') AS INSTANCENAME
      ,EXTRACTVALUE(IVT.DOCUMENT_IVT,'//elementInternalName/text()') AS INTERNALNAME
        ,CTG.NAME_CTG
        ,CTR.NAME_CTR
        ,MDL.NAME_MDL
      ,IVT.REEDIT_FLAG_IVT
        FROM  VARIATION_IVT IVT INNER JOIN CATEGORY_CTG CTG ON CTG.ID_CTG=IVT.ID_CTG_IVT
      AND IVT.STATUS_IVT='Active' AND IVT.DELETE_FLAG_IVT=0 AND IVT.ID_PRJ_IVT=1
      AND  IVT.DOCUMENT_IVT.existsnode('.//domain[domainName="Jurisdictions" and (domainValue="Delhi" or domainValue="Bangladesh" or domainValue="Mumbai" or domainValue="India" or domainValue="Pakistan" or domainValue="Nepal" or domainValue="Maldives" or domainValue="Kolkata" or domainValue="Bhutan" or domainValue="Chennai" or domainValue="ALL")]')=1 AND  IVT.DOCUMENT_IVT.existsnode('.//domain[domainName="Channels" and (domainValue="Agents" or domainValue="SBI" or domainValue="Maruti" or domainValue="Direct" or domainValue="CitiFinancial" or domainValue="SCB" or domainValue="BankAssurance" or domainValue="CitiBank" or domainValue="Employees" or domainValue="GE" or domainValue="Brokers" or domainValue="Telemarketing" or domainValue="Agency" or domainValue="ALL")]')=1 AND  IVT.DOCUMENT_IVT.existsnode('.//domain[domainName="ModeofDelivery" and (domainValue="Walkin" or domainValue="Internet" or domainValue="ALL")]')=1 AND  IVT.DOCUMENT_IVT.existsnode('.//context[(productName="ALL" or productName="A009" or productName="A010" or productName="A046" or productName="AccidentShieldClassic" or productName="AccidentShieldOnline" or productName="AM01" or productName="AM02" or productName="AME_Cancellation" or productName="ARHG" or productName="ARPA" or productName="B003" or productName="B004" or productName="B007" or productName="B008" or productName="B009" or productName="B010" or productName="B012" or productName="B013" or productName="B015" or productName="B016" or productName="B017" or productName="BC04_PA" or productName="BC06_FDP" or productName="BC06_PA" or productName="BC09" or productName="BC10" or productName="BC12" or productName="BC13" or productName="BF03" or productName="BS01" or productName="BS02" or productName="C017" or productName="C035" or productName="C036" or productName="C037" or productName="C038" or productName="C040" or productName="C041" or productName="C041Gold" or productName="C041New" or productName="C045HomeContents" or productName="C048" or productName="C049" or productName="C054" or productName="C057" or productName="C060Building" or productName="C060Contents" or productName="C060FDP" or productName="C061Building" or productName="C061Contents" or productName="C062" or productName="C063" or productName="C067" or productName="C070" or productName="C072" or productName="C074" or productName="C077" or productName="C081" or productName="C082" or productName="C087" or productName="C088" or productName="CITIFOREVER" or productName="CITISECURE" or productName="CITICHILDPLAN" or productName="D001" or productName="DB01" or productName="DD01" or productName="DD02" or productName="DD03" or productName="DD04" or productName="DD09" or productName="DD10" or productName="E005" or productName="E011" or productName="E016" or productName="E020" or productName="E030" or productName="E034" or productName="E040" or productName="E041" or productName="E045HCP" or productName="E045HSP" or productName="E049" or productName="E049New" or productName="E052" or productName="E053" or productName="E054FDP" or productName="E055" or productName="E056" or productName="E057" or productName="E058" or productName="E061" or productName="E061BATCH" or productName="E062" or productName="E063" or productName="E064HCP" or productName="E064HSP" or productName="E066" or productName="E069" or productName="E073" or productName="E075" or productName="E076" or productName="E088" or productName="E090" or productName="E093A" or productName="E093B" or productName="E095" or productName="E099A" or productName="E099B" or productName="E106" or productName="E107" or productName="E110" or productName="E112" or productName="E114" or productName="E115" or productName="E116" or productName="F001" or productName="FamilyHealthInsurance" or productName="FamilyHospitalBenefits" or productName="FamilyHospitalisationCoverBenefit" or productName="G001" or productName="G002" or productName="HealthShieldOnline" or productName="Health_B005" or productName="Health_S057" or productName="HealthSheild" or productName="HealthWalkin" or productName="HomeContentOnline" or productName="HomeShieldOnline" or productName="HomeShieldWalkin" or productName="HospitalCashOnline" or productName="J001" or productName="J008" or productName="K001" or productName="KV02" or productName="LC03" or productName="ML01" or productName="MP02" or productName="MP03" or productName="MR01" or productName="O005" or productName="PO01" or productName="PO02" or productName="PO03" or productName="PO04" or productName="PO05" or productName="PO06" or productName="RR02" or productName="RR03" or productName="RR04" or productName="S006" or productName="S033" or productName="S049" or productName="S051" or productName="S054" or productName="S057" or productName="S060" or productName="S061" or productName="S065" or productName="S065TM" or productName="S068" or productName="S076" or productName="S077" or productName="S079" or productName="S080" or productName="S081" or productName="S084" or productName="S085" or productName="S086" or productName="S087" or productName="S088" or productName="S091" or productName="S092" or productName="S093" or productName="S094" or productName="S095" or productName="S097" or productName="S098" or productName="S099" or productName="S100" or productName="S101" or productName="S102" or productName="S103" or productName="S104" or productName="S106" or productName="S107" or productName="S108" or productName="S109" or productName="S110" or productName="S111" or productName="S113" or productName="SCBNAC" or productName="SF02" or productName="SS01" or productName="SS02" or productName="SUNFHM" or productName="SurgicalShield" or productName="TD01" or productName="TD02" or productName="TP01" or productName="U002Building" or productName="U002Contents" or productName="U004Building" or productName="U007" or productName="U009" or productName="U013" or productName="U014" or productName="U015" or productName="U016" or productName="V001" or productName="V002" or productName="V005" or productName="V006" or productName="V008" or productName="W008" or productName="W020" or productName="W021" or productName="W022" or productName="W023" or productName="W024" or productName="W026" or productName="W027" or productName="W028" or productName="W029" or productName="W105" or productName="W106" or productName="WI01" or productName="WI02" or productName="WI03" or productName="WI07" or productName="WI08" or productName="WI09" or productName="WI10" or productName="WI11" or productName="WI12" or productName="WI13" or productName="WI14" or productName="WI17" or productName="WI20" or productName="WI21" or productName="WI21_Health" or productName="WI23" or productName="WI24" or productName="WI26" or productName="WI30" or productName="WI31" or productName="WI33" or productName="WI34" or productName="X001" or productName="X002" or productName="X003" or productName="X004" or productName="X005" or productName="X008" or productName="Y001" or productName="Y007" or productName="Y009" or productName="Y010" or productName="Y011" or productName="Y011H" or productName="Y020" or productName="Y020N" or productName="Z008" or productName="ZI001")]')=1
      INNER JOIN CENTER_CTR CTR ON CTR.ID_CTR=CTG.ID_CTR_CTG
        INNER JOIN MODEL_MDL MDL ON  MDL.ID_MDL=CTR.ID_MDL_CTR

  • Problem in using CREATE TABLE with Execute Immediate

    I'm trying to create a table using Native Dynamic SQL. the code of the pl/sql block is
    BEGIN
    EXECUTE IMMEDIATE 'create table demo (ddate date)';
    END;
    The problem is that the above block is executed successfully as an anonymous PL/SQL block. The same block when written in a procedure it gives an error
    "ORA-01031 Insufficient privelages"
    at the time of execution. The procedure is complied successfully.
    null

    Your user needs direct system privs to create tables. You are receiving your privs properly by the role RESOURCE. Connect as system and grant CREATE TABLE directly to your user - that should do it.
    Regards
    Peter Larsen

  • Can't create a sequence within a pl/sql block with execute immediate.

    Hi All. I created a user and granted it the 'create sequence' privilege though a role. In a pl/sql block I try to create a sequence using 'execute immediate' but get a 1031-insufficient privileges error. If I grant create sequence directly to the user, the pl/sql block completes successfully. Can anyone explain this behavior? We're running 11.2 Enterprise Editon.
    Thanks,
    Mark

    In a definer's rights stored procedure (the default), you only have access to privileges that have been granted directly, not via a role.
    There are two basic reasons for that. First, roles can be enabled or disabled, default and non-default, password-protected, etc. so the set of roles a particular user actually has is session-specific. Oracle needs to know at compile time what privileges the owner of the procedure has. The only way to do that (without deferring the privilege check) is to ignore privileges granted through roles.
    Second, since 99% of privilege management DBAs do involves granting and revoking roles, it's helpful that changing role privileges will never cause objects to be marked invalid and recompiled which can have side-effects on applications. DBAs only need to worry about causing problems on those rare cases where they are granting or revoking direct privileges to users.
    You can create an invoker's rights stored procedure by adding the clause (AUTHID CURRENT_USER). That defer's the security check to run-time but allows the procedure to see privileges granted through roles in the current session. But that means that the caller of the procedure would need to have the CREATE SEQUENCE privilege through the role, not the owner of the procedure.
    And just to make the point, dynamic object creation in PL/SQL is almost always a red flag that there is something problematic in your design. If you are creating sequences dynamically, that means that you'd have to refer to them dynamically throughout your code which means that your inserts would need to use dynamic SQL. That's not a particularly easy or safe way to develop code.
    Justin

  • Problem using EXECUTE IMMEDIATE

    Hi,
    I am running the following procedure..
    table emp ( empno number,ename varchar2 , dept varchar2 )
    CREATE OR REPLACE PROCEDURE Sp_Test11 ( p_dept IN VARCHAR2 )
    IS
    m_count               NUMBER               :=     NULL;
    m_sql_query               VARCHAR2(32767) := 'SELECT COUNT(*) INTO m_count FROM emp WHERE dept = ';
    BEGIN
    m_sql_query := m_sql_query||''''||p_dept||''''||';';
         EXECUTE IMMEDIATE m_sql_query ;
    END Sp_Test11;
    I am getting the "Invalid character" error on execute immediate statement when i debug ..
    Please guide.

    venkata wrote:
    Use RETURN or RETURNING INTO Keywords in execute immediate statement.RETURNING INTO is used with INSERT/UPDATE/DELETE statements when there will be triggers that will populate something on the table after an insert or update etc. e.g. when you insert a new record and you want to return the primary key that is automatically generated from a sequence so you can use it in your code for something else.
    If you are SELECTing data then you would use the INTO keyword as Gj demonstrated.
    SQL> ed
    Wrote file afiedt.buf
      1  declare
      2    v_cnt number;
      3  begin
      4    execute immediate 'select count(*) from x' returning into v_cnt;
      5* end;
    SQL> /
    declare
    ERROR at line 1:
    ORA-06547: RETURNING clause must be used with INSERT, UPDATE, or DELETE statements
    ORA-06512: at line 4
    SQL> ed
    Wrote file afiedt.buf
      1  declare
      2    v_cnt number;
      3  begin
      4    execute immediate 'select count(*) from x' into v_cnt;
      5* end;
    SQL> /
    PL/SQL procedure successfully completed.
    SQL>It's amazing how many people are just jumping in here with wrong answers.

  • Unable to INSERT PL/SQL  record with EXECUTE IMMEDIATE

    Hi All,
    I am selecting data from a source table and after some modification inserting into a target table. Source and target table name are available at run time. You can say only source table structure is fixed.
    I have crated a pl/sql table of type source record and inserting record by record in target table using execute immediate. But I am not able to write
    EXECUTE IMMEDIATE string USING pl_sql_table(index); and getting error as
    PLS-00457: expressions have to be of SQL types
    Please see the part of code below. Is it possible to use FORALL with dynamic sql like
    FORALL pl_sql_table.FIRST .. pl_sql_table.COUNT
    EXECUTE IMMEDIATE .... pl_sql_table(j); -- Like this.
    Please suggest why I am not able to write record here. I also want to replace 'INSERT in a loop' with a single INSERT statement out of the loop, to upload whole pl_sql table into target table in one go.
    Thanks,
    Ravi
    DECLARE
        TYPE rec_tab_CMP IS RECORD
         model_id          NUMBER(38),   
         absolute_rank          NUMBER(5)         
        v_rec_tab_CMP  rec_tab_CMP;
        TYPE t_rec_tab_CMP IS TABLE OF v_rec_tab_CMP%TYPE INDEX BY BINARY_INTEGER;
        v_records_CMP               t_rec_tab_CMP;
        rc                          SYS_REFCURSOR;
        v_old_table_name            VARCHAR2(30); -- passed from parameter 
        v_new_table_name            VARCHAR2(30); -- passed from parameter 
        dyn_str                     VARCHAR2(500);
        v_columns_str               VARCHAR2(200) := ' model_id, absolute_rank ';
    BEGIN
           EXECUTE IMMEDIATE 'CREATE TABLE '|| v_new_table_name || ' AS SELECT * FROM ' || v_old_table_name ||' WHERE 1 = 2 ' ;
         OPEN rc FOR 'SELECT '|| v_columns_str ||' FROM '|| v_old_table_name;
         FETCH rc BULK COLLECT INTO v_records_CMP;
         FOR j IN 1..v_records_CMP.COUNT
         LOOP
            v_records_CMP(j).model_id := 1; -- Do someting here, This thing can be performed in SQL stmt directly.
            dyn_str := 'INSERT INTO '|| v_new_table_name ||' ( '|| v_columns_str || ' ) VALUES (:1, :2) ';
            EXECUTE IMMEDIATE dyn_str USING v_records_CMP(j).model_id          ,
                                v_records_CMP(j).absolute_rank     ;
         -- Here in place of two columns I want to use one record like
         -- EXECUTE IMMEDIATE dyn_str USING v_records_CMP(j);
         -- But it is giving me error like
            --          EXECUTE IMMEDIATE dyn_str USING v_records_st(j);
            --   PLS-00457: expressions have to be of SQL types
         END LOOP;
         CLOSE rc;
    END;
    /

    You cannot bind PL/SQL record types to dynamic SQL.
    Possibly you could work around this by declaring the INDEX-BY table of records at package specification level, e.g.
    Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
    SQL> CREATE PACKAGE package_name
      2  AS
      3     TYPE tt_emp IS TABLE OF emp%ROWTYPE;
      4     t_emp tt_emp;
      5  END package_name;
      6  /
    Package created.
    SQL> CREATE TABLE new_emp
      2  AS
      3     SELECT *
      4     FROM   emp
      5     WHERE  1 = 0;
    Table created.
    SQL> DECLARE
      2     v_table_name user_tables.table_name%TYPE := 'NEW_EMP';
      3  BEGIN
      4     SELECT *
      5     BULK COLLECT INTO package_name.t_emp
      6     FROM   emp;
      7
      8     EXECUTE IMMEDIATE
      9        'BEGIN ' ||
    10        '   FORALL i IN 1 ..package_name.t_emp.COUNT ' ||
    11        '      INSERT INTO ' || v_table_name ||
    12        '      VALUES package_name.t_emp (i); ' ||
    13        'END;';
    14  END;
    15  /
    PL/SQL procedure successfully completed.
    SQL> SELECT empno, ename
      2  FROM   new_emp;
         EMPNO ENAME
          7369 SMITH
          7499 ALLEN
          7521 WARD
          7566 JONES
          7654 MARTIN
          7698 BLAKE
          7782 CLARK
          7788 SCOTT
          7839 KING
          7844 TURNER
          7876 ADAMS
          7900 JAMES
          7902 FORD
          7934 MILLER
    14 rows selected.
    SQL>

  • Problem in  EXECUTE IMMEDIATE

    I need to update certain columns of a table .
    But the columns are dynamic. i can update 1,20r 3 or more columns of that table.
    I tried executing with the Execute immediate statement.
    But i am getting the error (ORA-01747)
    :1(below in code) Contains the column name along with the values. (Example:Column2=Column2.value,Column3=Column3.value)
    There can be more than 3 or more columns to be updated.
    CREATE OR REPLACE PROCEDURE PR_Bulk_CA(pn_SSCA_ID_VARRAY          BULK_UPDATE_CA_VARRAY
                                          ,pv_set_string              Varchar2
                                          ,pn_success                 OUT number
                                          Is
    sql_stmt  VARCHAR2(32000);
    BEGIN
    sql_stmt:= 'update table_A
                   SET :1
               WHERE  ID IN (select ID from table_A ca
                       where  ca.status in (20700,20710,20720)
                         and  ca.id in (select * from table(:2)))';
    EXECUTE IMMEDIATE sql_stmt USING pv_set_string,pn_SSCA_ID_VARRAY;                     
    COMMIT;
    pn_success:=0;
    EXCEPTION
        WHEN OTHERS THEN
    pn_success:=-1;
    END PR_Bulk_CA;

    So?
    By concatenating the column-name-update-string to the rest of the dynamic statement you get what you want.
    if your pv_set_string has:
      column_a = 17, column_b = 15, column_c = 12in it, the statement generated will handle this...
    I did not state not to do dynamic sql but not to pass the column names using bind variables, as this will not work. The reason therefore is, that the parser need to know the names of the columns to figure out, whether you passed a syntactical correct statement. The parser will not know the content of a bind variable as this is not needed for the syntax (and access rights) check.
    hth

  • Help with EXECUTE IMMEDIATE and DROP

    Hi all,
    we are trying to create a procedure to do the following:
    * We have in the database some tables named like C$_XXXXXXXXX
    * We want to drop some of these tables that have a common prefix (f.e C$_1203101)
    DECLARE
    v_sql VARCHAR2(300);
    BEGIN
    SELECT 'DROP TABLE ODISTAG.'|| TABLE_NAME ||';' INTO v_sql FROM USER_TABLES WHERE TABLE_NAME LIKE 'C$_1203101%';
    EXECUTE IMMEDIATE v_sql;
    END;
    But we get this error:
    Error report:
    ORA-00911: invalid character
    ORA-06512: at line 5
    00911. 00000 - "invalid character"
    *Cause:    identifiers may not start with any ASCII character other than
    letters and numbers. $#_ are also allowed after the first
    character. Identifiers enclosed by doublequotes may contain
    any character other than a doublequote. Alternative quotes
    (q'#...#') cannot use spaces, tabs, or carriage returns as
    delimiters. For all other contexts, consult the SQL Language
    Reference Manual.
    *Action:
    Any help on that please?
    Thanks!

    This will not work if you fetch more than one row..instead you can do this..
    DECLARE
         v_sql VARCHAR2(30000);
    BEGIN
         for c2 in (
                        SELECT 'DROP TABLE ODISTAG.'|| TABLE_NAME drp
                        FROM USER_TABLES WHERE TABLE_NAME LIKE 'C$_1203101%'
         loop
              v_Sql := c2.drp;
              EXECUTE IMMEDIATE v_sql;
         end loop;
    END;

  • Need help with EXECUTE IMMEDIATE

    I have created a CHAR string in my form that contains a UPDATE statement. This statement is passed into my procedure and in the procedure, the EXECUTE IMMEDIATE is supposed to run the UPDATE statement. THIS IS NOT THE CASE for some reason. NEWVALUE is record is also passed into the procedure.
    this is the UPDATE_STATEMENT statement prepared by my forms application:
    'UPDATE xtable SET ACTION_CODE_DESC =''a b c'',INACTIVE =''N'' WHERE ACTION_CODE = newValue.ACTION_CODE'
    The CHAR values are surrounded by a pair of single quotes. The UPDATE statement starts and ends with single quotes.
    In my procedure I have this statement:
    PROCEDURE JKUPD_ACTION_CODE
    ( newValue in etmst_action_code%rowtype
    ,UPDATE_STATEMENT in CHAR
    ,perr_count out number
    AS
    BEGIN
    EXECUTE IMMEDIATE UPDATE_STATEMENT ;
    IF SQL%NOTFOUND
    THEN .......
    I keep getting ORA-00900: invalid SQL statement and dont understand why this is happening.
    Any ideas anyone?
    Thanks :)

    I haven't seen a version indication for this thread, but there should be 2 (different!) functions that come with Oracle that might do what you want.
    If all you want to do is dynamically execute text representing a SQL command check the on-line documentation (if there is any) for dbms_sql.execute and/or dbms_utility.exec_ddl. Make sure the string passed in are syntactically correct :)

Maybe you are looking for

  • Screen sticks

    My blackberry curve will power on and boot but as soon as it gets to the main screen, it locks.  If I hit any button, the screen goes black and I am not able to do anything.  I have removed the battery several times.  It comes up with a meeting remin

  • How to use recursive in Information Design Tools?

    Hi all, I want to use recursive for count number of employee in each organization. I write code something like this. with EmpCTE as       select RootID = D.ORG_CD , D. ORG_CD, D .ParentOID       from  (SELECT     CURRENT_LEAF as ORG_CD ,             

  • Defining the purpose of use in the DTAUS

    I would like to contribute a suggestion for improvement on behalf of our clients. This would be happy to set the SAP Business One, as the purpose of his DTAUS files are built. Currently, the SAP Business One version 8.81 is installed PL05. Sincerely,

  • Unable to download Ovi Player onto my pc

    hello I have been trying to download Ovi Player onto my pc for almost a week now. However, I keep getting an error message saying:'Application has generated an exception that could not be handled. Process ID=0xcfc (3324), Thread ID =0xec4 (3780)' Wha

  • How do I get my new email at apple to stay?  I keep gong in and changing it and the old email keeps showing up and it won't let me in!

    How do I get my email changed so I can go into the store and apps?  I have gone in and changed it but it keeps going back to the old email?