Inserting by anonymous block

Hi All
Im using Oracle SQL Developer.
Im inserting 1000 rows into a table in sql window.
Same insert im inserting by writing an anonymous block.
Is there any difference between these two.Performance wise?
Thanks
Jo

Johney  wrote:
Im inserting 1000 rows into a table in sql window.
Same insert im inserting by writing an anonymous block.
Is there any difference between these two.Performance wise?Both sucks ito hard parsing.
As the SQL insert statements contain literals, every statement has to be hard parsed. This can reduce performance by a factor of 10 (usually more - have seen up to 32x decrease in performance).
The ideal method is to use a client that correctly supports bind variables and can use sharable SQL - tools like SQL*Plus fails in this respect.
In such a case, one should consider trying to enforce some sanity in the Shared Pool and not stuffing it full of near identical and non-sharable insert statements. This can be done by forcing cursor sharing (see Oracle® Database Reference for details).

Similar Messages

  • How to declare in anonymous block

    Declare
    CURSOR c_je2acct_othr
    IS
    SELECT j.jemq_num, j.ml_retail_account,
    -- (CASE WHEN j.exer_type = 4 THEN j.sar_shares ELSE j.shares END) shares, -- removed * -1 from sar_shares Manu 12/02/04
    /* Commented 02/01/07*/
    (CASE WHEN j.exer_type = 4 THEN
    fn_get_shares(u.user_id,u.exer_num,u.soc_sec,j.
    sar_shares)
    ELSE (case when u.exer_type=2 and u.opts_exer!=u.shrs_sold and j.shares=u.shrs_sold then 0 else j.shares end)
    END) shares,
    -- removed * -1 from sar_shares Manu 12/02/04
    j.name_first,
    j.name_last, j.exer_type, j.ml_sec_num, j.ivr_plan_num,
    j.exer_dt, j.grant_dt, j.user_id, j.mlu_rowid, j.settle_dt,
    j.exer_num, j.plan_type, j.grant_num, j.acct_num_othr,
    j.add_cancel,
    /* (CASE WHEN j.exer_type = 4 THEN j.sar_cash_amount * -1 -- turned negative Manu 12/02/04 ml_retail distr
    commented the above line for calculation of proceeds into other account for sar sale.
    (CASE WHEN j.exer_type = 4 THEN
    Pk_Xop_Citibank_Forex.fn_get_netamount(u.user_id,u.
    exer_num,u.soc_sec,
    u.sar_cash_amount,NVL(u.comm_value, 0),
    NVL(u.tot_fee, 0),
    NVL(u.multi_curr_handling_fee, 0))
    -- Removed the negative as on ml_exer_upload all values are +ve.
    ELSE
    ( (DECODE(u.exer_type,0,u.opts_exer * u.mkt_prc,u.shrs_sold * u.mkt_prc
    - ( ROUND((u.opts_exer * NVL (u.opt_prc, 0)),2)
    -- SPIF 39060 Added a Round of condition.
    + DECODE (NVL (u.shrs_wthld_for_taxes, 'N'),
    'Y', 0,
    ROUND (u.tot_tax, 2)
    + u.tot_fee
    + NVL(u.multi_curr_handling_fee,0)
    + u.comm_value
    - u.backup_withholding
    END ) AS gl_amt,
    T.je_othr_mlacct_jemsg AS vc_trailer_desc,
    u.opts_exer ,
    u.shrs_sold,
    u.rsu_type
    FROM TB_XOP_JEMQ j, TB_ML_EXER_UPLOAD u, TB_FC_COMPY T
    WHERE j.q_flag = 'N' AND u.je_flag = 'Y'
    AND j.entry_dttime >= TRUNC (SYSDATE)
    AND j.entry_dttime < TRUNC (SYSDATE) +1
    AND j.source = 'X'
    AND j.acct_num_othr != ' '
    and (case when u.exer_type=2 and u.opts_exer!=u.shrs_sold then  (case when j.shares=u.shrs_sold then 0 else 1 end) else 1 end)=1 FIx for PCTUP00566081
    AND ( disp_flag <> 'D' OR disp_flag IS NULL ) Added by MARAN ARUNACHALAM on 01/25/2011 for PCTUP00493542 Fix
    and j.current_status = '2Q'  removed not required now in new plan
    AND NOT EXISTS (
    SELECT 1
    FROM TB_XOP_JEMQ j2
    WHERE j2.prev_jemq = j.jemq_num
    AND source = 'T'
    AND j.add_cancel = j2.add_cancel
    AND j.user_id = j2.user_id
    AND j.exer_num = j2.exer_num)
    AND j.mlu_rowid = u.ROWID
    AND 'CMS'||T.compy_acronym||'_USER' = j.user_id
    ORDER BY add_cancel DESC;
    v_mlac_mesg VARCHAR2(1000);
    -- JE_OTHR_MLACCT_JEMSG
    BEGIN
    dbms_output.put_line('success');
    FOR v_je2acct_othr IN c_je2acct_othr
    LOOP
    dbms_output.put_line('success1');
    BEGIN
    dbms_output.put_line('success2');
    IF v_je2acct_othr.add_cancel = 'C'
    THEN
    dbms_output.put_line('success3');
    UPDATE TB_XOP_JEMQ
    SET add_cancel = DECODE(current_status,
    'RJ',
    add_cancel,
    'C'),
    q_flag = DECODE(current_status, 'RJ', q_flag, 'N'),
    activ_dt = DECODE(current_status,
    'RJ',
    activ_dt,
    SYSDATE)
    WHERE prev_jemq = v_je2acct_othr.jemq_num
    AND user_id = v_je2acct_othr.user_id
    AND exer_num = v_je2acct_othr.exer_num
    AND source ='T';
    dbms_output.put_line('success4');
    ELSIF v_je2acct_othr.add_cancel = 'A'
    THEN
    dbms_output.put_line('success5');
    -- manipulating amount and shares to transfer when different exercise types
    v_je2acct_othr.gl_amt :=( CASE
    WHEN v_je2acct_othr.exer_type = 0 THEN 0
    WHEN v_je2acct_othr.exer_type = 2 AND v_je2acct_othr.opts_exer
    != v_je2acct_othr.shrs_sold
    THEN v_je2acct_othr.gl_amt
    WHEN v_je2acct_othr.exer_type = 2 AND v_je2acct_othr.opts_exer =
    v_je2acct_othr.shrs_sold
    THEN v_je2acct_othr.gl_amt
    ELSE v_je2acct_othr.gl_amt
    END );
    ---- Commented on 11/01/2006 For Fixing 30585
    /* v_je2acct_othr.shares :=( CASE
    WHEN v_je2acct_othr.exer_type = 0 THEN v_je2acct_othr.opts_exer
    WHEN v_je2acct_othr.exer_type = 2 AND v_je2acct_othr.opts_exer != v_je2acct_othr.shrs_sold
    THEN v_je2acct_othr.opts_exer - v_je2acct_othr.shrs_sold
    WHEN v_je2acct_othr.exer_type = 2 AND v_je2acct_othr.opts_exer = v_je2acct_othr.shrs_sold
    THEN 0
    ELSE v_je2acct_othr.shares
    END );*/
    ---- Commented on 11/01/2006 For Fixing 30585
    v_je2acct_othr.shares :=( CASE
    WHEN v_je2acct_othr.exer_type = 0 THEN v_je2acct_othr.
    Shares
    --- Replaced opts_exer with the Shares amount from the previous journal for fixing 30585
    WHEN v_je2acct_othr.exer_type = 2 AND v_je2acct_othr.opts_exer
    != v_je2acct_othr.shrs_sold and v_je2acct_othr.shares!=0 and v_je2acct_othr.plan_type <> 0 -- Added plantype condition for CQ:PCTUP00493542
    THEN v_je2acct_othr.Shares - v_je2acct_othr.shrs_sold
    --- Replaced opts_exer with the Shares amount from the previous journal for fixing 30585
    WHEN v_je2acct_othr.exer_type = 2 AND v_je2acct_othr.opts_exer =
    v_je2acct_othr.shrs_sold
    THEN 0
    ELSE v_je2acct_othr.shares
    END );
    dbms_output.put_line('success6');
    IF LENGTH(TRIM(v_je2acct_othr.acct_num_othr))=8 OR TRIM(v_je2acct_othr.acct_num_othr) IS NULL
    THEN
    v_mlac_mesg :=NULL;
    ELSE
    v_mlac_mesg :='Check the ml a/c length';
    dbms_output.put_line('success7');
    END IF;
    INSERT INTO TB_XOP_JEMQ
    (jemq_num,
    prev_jemq,
    ml_retail_account,
    wcma_shares,
    shares, wcma_taxes, tax_amt,
    wcma_reimburse,
    reimburse_amt,
    name_first,
    name_last, exer_type,
    ml_sec_num, wcma_bulking, bulking_amt,
    ivr_plan_num,
    exer_dt, grant_dt,
    user_id, source,
    mlu_rowid, settle_dt,
    exer_num, plan_type,
    grant_num,
    vc_trailer_desc, rsu_type
    VALUES (Pk_Xop_Get_Jemqnum.fn_xop_get_jemqnum,
    v_je2acct_othr.jemq_num,
    v_je2acct_othr.acct_num_othr,
    -- 2nd ml_retail_account,
    v_je2acct_othr.ml_retail_account,
    -- move shares from old acct to 2nd acct above
    v_je2acct_othr.shares,
    --this is SHARES
    --wcma_taxes
    0,
    --tax_amt,
    v_je2acct_othr.ml_retail_account,
    -- move gl_amt from old acct to 2nd acct above
    v_je2acct_othr.gl_amt * -1,
    v_je2acct_othr.name_first,
    v_je2acct_othr.name_last, v_je2acct_othr.
    exer_type,
    v_je2acct_othr.ml_sec_num, ' ',
    --wcma_bulking,
    0,
    --bulking_amt,
    v_je2acct_othr.ivr_plan_num,
    v_je2acct_othr.exer_dt, v_je2acct_othr.
    grant_dt,
    v_je2acct_othr.user_id, 'T',
    --source
    v_je2acct_othr.mlu_rowid, v_je2acct_othr.
    settle_dt,
    v_je2acct_othr.exer_num, v_je2acct_othr.
    plan_type,
    v_je2acct_othr.grant_num,
    v_je2acct_othr.vc_trailer_desc,
    v_je2acct_othr.
    rsu_type
    dbms_output.put_line('success8');
    END IF;
    EXCEPTION
    WHEN OTHERS
    THEN
    Pr_Xop_Log_Errors ( 'Code :'
    || NVL(v_mlac_mesg,SQLERRM)
    || ' at '
    || USER
    || 'at sub exec block in pop_je2acct_othr'
    END;
    dbms_output.put_line('success9'); -- end of begin within loop
    END LOOP;
    --COMMIT;
    EXCEPTION
    WHEN OTHERS
    THEN
    Pr_Xop_Log_Errors ( 'Code :'
    || NVL(v_mlac_mesg,SQLERRM)
    || ' at '
    || USER
    || 'at pk_xop_jemq.pop_je2acct_othr'
    dbms_output.put_line('success10');
    END;}
    {ORA-06550: line 10, column 31:
    PL/SQL: ORA-00904: "FN_GET_SHARES": invalid identifier
    ORA-06550: line 6, column 11:
    PL/SQL: SQL Statement ignored
    ORA-06550: line 81, column 17:
    PLS-00364: loop index variable 'V_JE2ACCT_OTHR' use is invalid
    ORA-06550: line 81, column 14:
    PL/SQL: Statement ignored}
    HI friends, as i am getting two errors when running code in the anonymous block, then how to declare that 2 errors in declare section plz guide me}

    Noone, will read your code unless it is formatted like below. See the comments added
    DECLARE
      CURSOR c_je2acct_othr
      IS
        SELECT j.jemq_num,
          j.ml_retail_account,
          -- (CASE WHEN j.exer_type = 4 THEN j.sar_shares ELSE j.shares END) shares, -- removed * -1 from sar_shares Manu 12/02/04
          /* Commented 02/01/07*/
          CASE
            WHEN j.exer_type = 4
    --"The current user is not seeing the below function fn_get_shares.Privilege issue probably.
            THEN fn_get_shares(u.user_id,u.exer_num,u.soc_sec,j. sar_shares)
            ELSE (
              CASE
                WHEN u.exer_type=2
                AND u.opts_exer!=u.shrs_sold
                AND j.shares    =u.shrs_sold
                THEN 0
                ELSE j.shares
              END)
          END) shares,
          -- removed * -1 from sar_shares Manu 12/02/04
          j.name_first,
          j.name_last,
          j.exer_type,
          j.ml_sec_num,
          j.ivr_plan_num,
          j.exer_dt,
          j.grant_dt,
          j.user_id,
          j.mlu_rowid,
          j.settle_dt,
          j.exer_num,
          j.plan_type,
          j.grant_num,
          j.acct_num_othr,
          j.add_cancel,
          /* (CASE WHEN j.exer_type = 4 THEN j.sar_cash_amount * -1 -- turned negative Manu 12/02/04 ml_retail distr
          commented the above line for calculation of proceeds into other account for sar sale.
          CASE
            WHEN j.exer_type = 4
            THEN Pk_Xop_Citibank_Forex.fn_get_netamount(u.user_id,u. exer_num,u.soc_sec, u.sar_cash_amount,NVL(u.comm_value, 0), NVL(u.tot_fee, 0), NVL(u.multi_curr_handling_fee, 0))
              -- Removed the negative as on ml_exer_upload all values are +ve.
            ELSE ( (DECODE(u.exer_type,0,u.opts_exer * u.mkt_prc,u.shrs_sold * u.mkt_prc )) - ( ROUND((u.opts_exer * NVL (u.opt_prc, 0)),2)
              -- SPIF 39060 Added a Round of condition.
              + DECODE (NVL (u.shrs_wthld_for_taxes, 'N'), 'Y', 0, ROUND (u.tot_tax, 2) ) + u.tot_fee + NVL(u.multi_curr_handling_fee,0) + u.comm_value ) - u.backup_withholding )
          END )                  AS gl_amt,
          T.je_othr_mlacct_jemsg AS vc_trailer_desc,
          u.opts_exer ,
          u.shrs_sold,
          u.rsu_type
        FROM TB_XOP_JEMQ j,
          TB_ML_EXER_UPLOAD u,
          TB_FC_COMPY T
        WHERE j.q_flag       = 'N'
        AND u.je_flag        = 'Y'
        AND j.entry_dttime  >= TRUNC (SYSDATE)
        AND j.entry_dttime   < TRUNC (SYSDATE) +1
        AND j.source         = 'X'
        AND j.acct_num_othr != ' '
          --and (case when u.exer_type=2 and u.opts_exer!=u.shrs_sold then (case when j.shares=u.shrs_sold then 0 else 1 end) else 1 end)=1 -- FIx for PCTUP00566081
          --AND ( disp_flag <> 'D' OR disp_flag IS NULL ) -- Added by MARAN ARUNACHALAM on 01/25/2011 for PCTUP00493542 Fix
          --and j.current_status = '2Q' -- removed not required now in new plan
        AND NOT EXISTS
          (SELECT 1
          FROM TB_XOP_JEMQ j2
          WHERE j2.prev_jemq = j.jemq_num
          AND source         = 'T'
          AND j.add_cancel   = j2.add_cancel
          AND j.user_id      = j2.user_id
          AND j.exer_num     = j2.exer_num
      AND j.mlu_rowid = u.ROWID
      AND 'CMS'
        ||T.compy_acronym
        ||'_USER' = j.user_id
      ORDER BY add_cancel DESC;
      v_mlac_mesg VARCHAR2(1000);
      -- JE_OTHR_MLACCT_JEMSG
    BEGIN
      dbms_output.put_line('success');
      FOR v_je2acct_othr IN c_je2acct_othr
      LOOP
        dbms_output.put_line('success1');
        BEGIN
          dbms_output.put_line('success2');
          IF v_je2acct_othr.add_cancel = 'C' THEN
            dbms_output.put_line('success3');
            UPDATE TB_XOP_JEMQ
            SET add_cancel  = DECODE(current_status, 'RJ', add_cancel, 'C'),
              q_flag        = DECODE(current_status, 'RJ', q_flag, 'N'),
              activ_dt      = DECODE(current_status, 'RJ', activ_dt, SYSDATE)
            WHERE prev_jemq = v_je2acct_othr.jemq_num
            AND user_id     = v_je2acct_othr.user_id
            AND exer_num    = v_je2acct_othr.exer_num
            AND source      ='T';
            dbms_output.put_line('success4');
          ELSIF v_je2acct_othr.add_cancel = 'A' THEN
            dbms_output.put_line('success5');
            -- manipulating amount and shares to transfer when different exercise types
    --"You cannot assign values to the recor variable declared for a loop. Either define seperate variables or use explicit record variable"
            v_je2acct_othr.gl_amt :=
              CASE
              WHEN v_je2acct_othr.exer_type = 0 THEN
                0
              WHEN v_je2acct_othr.exer_type = 2 AND v_je2acct_othr.opts_exer != v_je2acct_othr.shrs_sold THEN
                v_je2acct_othr.gl_amt
              WHEN v_je2acct_othr.exer_type = 2 AND v_je2acct_othr.opts_exer = v_je2acct_othr.shrs_sold THEN
                v_je2acct_othr.gl_amt
              ELSE
                v_je2acct_othr.gl_amt
              END );
            ---- Commented on 11/01/2006 For Fixing 30585
            /* v_je2acct_othr.shares :=( CASE
            WHEN v_je2acct_othr.exer_type = 0 THEN v_je2acct_othr.opts_exer
            WHEN v_je2acct_othr.exer_type = 2 AND v_je2acct_othr.opts_exer != v_je2acct_othr.shrs_sold
            THEN v_je2acct_othr.opts_exer - v_je2acct_othr.shrs_sold
            WHEN v_je2acct_othr.exer_type = 2 AND v_je2acct_othr.opts_exer = v_je2acct_othr.shrs_sold
            THEN 0
            ELSE v_je2acct_othr.shares
            END );*/
            ---- Commented on 11/01/2006 For Fixing 30585
            v_je2acct_othr.shares :=
              CASE
              WHEN v_je2acct_othr.exer_type = 0 THEN
                v_je2acct_othr. Shares
                --- Replaced opts_exer with the Shares amount from the previous journal for fixing 30585
              WHEN v_je2acct_othr.exer_type = 2 AND v_je2acct_othr.opts_exer != v_je2acct_othr.shrs_sold AND v_je2acct_othr.shares!=0 AND v_je2acct_othr.plan_type 0 -- Added plantype condition for CQ:PCTUP00493542
                THEN
                v_je2acct_othr.Shares - v_je2acct_othr.shrs_sold
                --- Replaced opts_exer with the Shares amount from the previous journal for fixing 30585
              WHEN v_je2acct_othr.exer_type = 2 AND v_je2acct_othr.opts_exer = v_je2acct_othr.shrs_sold THEN
                0
              ELSE
                v_je2acct_othr.shares
              END );
            dbms_output.put_line('success6');
            IF LENGTH(TRIM(v_je2acct_othr.acct_num_othr))=8 OR TRIM(v_je2acct_othr.acct_num_othr) IS NULL THEN
              v_mlac_mesg                               :=NULL;
            ELSE
              v_mlac_mesg :='Check the ml a/c length';
              dbms_output.put_line('success7');
            END IF;
            INSERT
            INTO TB_XOP_JEMQ
                jemq_num,
                prev_jemq,
                ml_retail_account,
                wcma_shares,
                shares,
                wcma_taxes,
                tax_amt,
                wcma_reimburse,
                reimburse_amt,
                name_first,
                name_last,
                exer_type,
                ml_sec_num,
                wcma_bulking,
                bulking_amt,
                ivr_plan_num,
                exer_dt,
                grant_dt,
                user_id,
                source,
                mlu_rowid,
                settle_dt,
                exer_num,
                plan_type,
                grant_num,
                vc_trailer_desc,
                rsu_type
              VALUES
                Pk_Xop_Get_Jemqnum.fn_xop_get_jemqnum,
                v_je2acct_othr.jemq_num,
                v_je2acct_othr.acct_num_othr,
                -- 2nd ml_retail_account,
                v_je2acct_othr.ml_retail_account,
                -- move shares from old acct to 2nd acct above
                v_je2acct_othr.shares,
                --this is SHARES
                --wcma_taxes
                0,
                --tax_amt,
                v_je2acct_othr.ml_retail_account,
                -- move gl_amt from old acct to 2nd acct above
                v_je2acct_othr.gl_amt * -1,
                v_je2acct_othr.name_first,
                v_je2acct_othr.name_last,
                v_je2acct_othr. exer_type,
                v_je2acct_othr.ml_sec_num,
                --wcma_bulking,
                0,
                --bulking_amt,
                v_je2acct_othr.ivr_plan_num,
                v_je2acct_othr.exer_dt,
                v_je2acct_othr. grant_dt,
                v_je2acct_othr.user_id,
                'T',
                --source
                v_je2acct_othr.mlu_rowid,
                v_je2acct_othr. settle_dt,
                v_je2acct_othr.exer_num,
                v_je2acct_othr. plan_type,
                v_je2acct_othr.grant_num,
                v_je2acct_othr.vc_trailer_desc,
                v_je2acct_othr. rsu_type
            dbms_output.put_line('success8');
          END IF;
        EXCEPTION
        WHEN OTHERS THEN
          Pr_Xop_Log_Errors ( 'Code :' || NVL(v_mlac_mesg,SQLERRM) || ' at ' || USER || 'at sub exec block in pop_je2acct_othr' );
        END;
        dbms_output.put_line('success9'); -- end of begin within loop
      END LOOP;
      --COMMIT;
    EXCEPTION
    WHEN OTHERS THEN
      Pr_Xop_Log_Errors ( 'Code :' || NVL(v_mlac_mesg,SQLERRM) || ' at ' || USER || 'at pk_xop_jemq.pop_je2acct_othr' );
      dbms_output.put_line('success10');
    END;
    {code}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 

  • Printing the Package output from Anonymous block

    Hi,
    I need to call the below package from anonymous block and get the output.
    Could you let me know.
    I tried using this, but i don't get data.
    ===========Anonymous Block=====================================================================
    declare
    var              xxdc.xxdc_sr_log_his_pkg.sr_tbl_type;
    l_sr_idx_bi  BINARY_INTEGER := 0;
    BEGIN
    xxdc.xxdc_sr_log_his_pkg.service_record('14040',var);
    dbms_output.put_line('CLAIM_CREDIT_OFFERS  :'||var(l_sr_idx_bi).qa_credit_offers(l_sr_idx_bi).character1 );
    end;
    =============================================================================================
    ============================================================================================
    Package Spec
    TYPE cr_offer_type IS TABLE OF apps.qa_results_v%ROWTYPE  
    INDEX BY BINARY_INTEGER;
    TYPE sr_rec_type IS RECORD
    (task_status                      apps.jtf_task_statuses_tl.name%TYPE
    ,task_type                        apps.jtf_task_types_tl.name%TYPE
    ,qa_credit_offers                 cr_offer_type
    TYPE sr_tbl_type IS TABLE OF sr_rec_type
    INDEX BY BINARY_INTEGER;
    PROCEDURE  service_record(p_service_req_num IN  VARCHAR2
                                               ,p_service_req_tbl OUT sr_tbl_type
    Package Body
           FOR emp_row_rec IN cur_credit_off
           LOOP
             l_sr_tbl(l_sr_idx_bi).qa_credit_offers(l_sr_idx_bi).character1 := emp_row_rec.character1;
             --dbms_output.put_line( l_sr_tbl(l_sr_idx_bi).qa_credit_offers(l_sr_idx_bi).character1);   --commenting for testing
              l_sr_idx_bi := l_sr_idx_bi + 1;
           END LOOP;
          p_service_req_tbl := l_sr_tbl;
    =============================================================================================
    Thank

    Hi,
    Did you issue the SQL*Plus command
    SET  SERVEROUTPUT  ON
    or, if you're using some other front end, its equivalent?
    Can you ever see output from dbms_output?  For example, what happens when you run this?
    SET  SERVEROUTPUT  ON
    BEGIN
        dbms_output.put_line ('Hello, world!');
    END;
    Since I don't have your tables, I can't actually run your code.  If you'd post CREATE TABLE and INSERT statements, or re-write the package to reference commonly available tables, such as those in the scott schema, then I could test it.

  • How to use anonymous block in select statement

    Hello Experts.
    I have one requirement which i can resolve using anonymous block in plsql. But i want implement it in select query only.
    Database: Oracle 11.2.0
    select count(*) from emp where name='xyz' and sal=50
    if count(*)>0
    then
    select dept,sector from emp where name='xyz' and sal=50
    here i dont have any primary key.
    How can i achieve above using sql query not plsql. Here is one sloution which i have got but its not satisfying above requiremnt as i dont have any primary key columns
    select toll_number from toll_details
    where toll_id =(select toll_id from toll_details where toll_new_id='5263655214' group by toll_id having count(*)>0)
    here toll_id is primary key, so used group by. But how to do this in my above requirement as i dont have primary key.
    Appreciate any help on this.
    Thank you

    897112 wrote:
    Hello Experts.
    I have one requirement which i can resolve using anonymous block in plsql. But i want implement it in select query only.
    Database: Oracle 11.2.0
    select count(*) from emp where name='xyz' and sal=50
    if count(*)>0
    then
    select dept,sector from emp where name='xyz' and sal=50
    here i dont have any primary key.
    How can i achieve above using sql query not plsql. Here is one sloution which i have got but its not satisfying above requiremnt as i dont have any primary key columns
    select toll_number from toll_details
    where toll_id =(select toll_id from toll_details where toll_new_id='5263655214' group by toll_id having count(*)>0)
    here toll_id is primary key, so used group by. But how to do this in my above requirement as i dont have primary key.
    Appreciate any help on this.
    Thank youTry this
    SQL> create table plch_test(id number,name varchar2(20),sal number);
    Table created.
    SQL> insert into plch_test values(1,'XYZ',50);
    1 row created.
    SQL> insert into plch_test values(2,'AAA',100);
    1 row created.
    SQL> insert into plch_test values(3,'BBB',200);
    1 row created.
    SQL> insert into plch_test values(4,'CCC',400);
    1 row created.
    SQL> commit;
    Commit complete.
    SQL> select * from plch_test;
            ID NAME                        SAL
             1 XYZ                          50
             2 AAA                         100
             3 BBB                         200
             4 CCC                         400
    SQL> ed
    Wrote file afiedt.buf
      1  select id,name
      2  from plch_test a
      3  where 1=(select count(*) from plch_test b where a.id=b.id)
      4* and id=&id
    SQL> /
    Enter value for id: 2
    old   4: and id=&id
    new   4: and id=2
            ID NAME
             2 AAA
    SQL> /
    Enter value for id: 0
    old   4: and id=&id
    new   4: and id=0
    no rows selectedHope this helps!!!
    Regards,
    Achyut

  • Autonomous Transactions usage in PL/SQL anonymous block coding

    Hi,
    I am trying to incorporate Autonomous Transaction for our work. I am using the tables provided below,
    CREATE TABLE T1
    F1 INTEGER,
    F2 INTEGER
    CREATE TABLE T2
    F1 INTEGER,
    F2 INTEGER
    insert into t1(f1, f2)
    values(20, 0)
    insert into t2(f1, f2)
    values(10, 0)
    Now, when I use the code snippet given below, it is working as expected.
    create or replace procedure p1 as
    PRAGMA AUTONOMOUS_TRANSACTION;
    begin
         update t2
         set f2 = 25
         where f1 = 10;
         commit;
    end;
    declare
    PRAGMA AUTONOMOUS_TRANSACTION;
    a integer;
    begin
         update t1
         set f2 = 15
         where f1 = 20;
         p1();
         rollback;
    end;
    Here, updation in t2 table is commited and t1 is rolled back, it is working as
    expected. I would like to achieve the same functionality through PL/SQL
    anonymous block coding, to do this, I use the following code snippet,
    declare
    PRAGMA AUTONOMOUS_TRANSACTION;
    a integer;
    begin
         update t1
         set f2 = 15
         where f1 = 20;
         begin
              update t2
              set f2 = 35
              where f1 = 10;
              commit;
         end;
         rollback;
    end;
    Here, data in both the tables are commited, how do I change it to work as I
    mentioned above like committing t2 alone, please help, thank you.
    Regards,
    Deva

    Can you explain what you're trying to accomplish from a business perspective? This doesn't look like a particularly appropriate way to use autonomous transactions, so you may be causing yourself problems down the line.
    That said, padders's solution does appear to work for me
    SCOTT @ nx102 Local> CREATE TABLE T1
      2  (
      3  F1 INTEGER,
      4  F2 INTEGER
      5  )
      6  /
    Table created.
    Elapsed: 00:00:01.03
    SCOTT @ nx102 Local>
    SCOTT @ nx102 Local>
    SCOTT @ nx102 Local> CREATE TABLE T2
      2  (
      3  F1 INTEGER,
      4  F2 INTEGER
      5  )
      6  /
    Table created.
    Elapsed: 00:00:00.00
    SCOTT @ nx102 Local>
    SCOTT @ nx102 Local> insert into t1(f1, f2)
      2  values(20, 0)
      3  /
    1 row created.
    Elapsed: 00:00:00.01
    SCOTT @ nx102 Local>
    SCOTT @ nx102 Local> insert into t2(f1, f2)
      2  values(10, 0)
      3  /
    1 row created.
    Elapsed: 00:00:00.01
    SCOTT @ nx102 Local> commit;
    Commit complete.
    Elapsed: 00:00:00.01
    SCOTT @ nx102 Local> DECLARE
      2     a INTEGER;
      3 
      4     PROCEDURE update_t2
      5     IS
      6        PRAGMA AUTONOMOUS_TRANSACTION;
      7     BEGIN
      8        UPDATE t2
      9           SET f2 = 35
    10         WHERE f1 = 10;
    11 
    12        COMMIT;
    13     END update_t2;
    14  BEGIN
    15     UPDATE t1
    16        SET f2 = 15
    17      WHERE f1 = 20;
    18    
    19     update_t2;
    20 
    21     ROLLBACK;
    22  END;
    23  /
    PL/SQL procedure successfully completed.
    Elapsed: 00:00:00.04Have you done something else that would cause a deadlock?
    Justin

  • Calling a function which has a CLOB parameter via an anonymous block.

    OK,
    we are moving a lot of exports currently done by Crystal to just be done by stored procs.
    So we have a load of existing, some extremely length SQL statements used for these exports.
    IN the exports, we have meaningful column headings, so we have a 'lookup' file where all the column names are listed with the desired column name text listed against it.
    So - to make our lives easier(i thought) , I have written a Oracle function to extract al;l of the column names as a list (see below).
    It works fine except for when I am trying to pass in a SQL treatment that is longer than 4000 character.
    What I want to be able to do is simply have an anonymous block that callls my function, I will be running this via SQL explorer.
    Something like......
    DECLARE
    theSQL CLOB;
    BEGFIN
    theSQL := 'SELECT * FROM ORDERS WHERE 1=0';
    SELECT GET_COLUNS_AS_LIST( theSQL, 0 ) FROM DUAL;
    END;
    However, when I run this I get the error................
    PLS-00428: an INTO clause is expected in this SELECT statement
    06550. 00000 - "line %s, column %s:\n%s"
    *Cause:    Usually a PL/SQL compilation error.
    If I hard code the SQL like this, SELECT GET_COLUNS_AS_LIST( 'SELECT * FROM ORDERS WHERE 1=0', 0 ) FROM DUAL; all is well.
    Also, I am going to need to be able to pass in SQL ststement longer that 4000 characters as weel so please bear that in mind.
    I am not an Oracle guy, so I guess I am missing something fundamental - Please enlighten me with regards to this.
    Any help extremely appreciated.
    CREATE OR REPLACE FUNCTION GET_COLUNS_AS_LIST( P_SQL IN VARCHAR2, Add_Equals_Sign Number := 0)
    RETURN CLOB
    IS
    fResult VARCHAR2(32000);
    HNDL NUMBER;
    d NUMBER;
    colCount INTEGER;
    i INTEGER;
    rec_tab DBMS_SQL.DESC_TAB;
    cCRLF VARCHAR(2) := CHR(13) || CHR(10);
    LONG_SQL dbms_sql.varchar2s;
    n INTEGER;
    l INTEGER;
    u INTEGER;
    StartPos INTEGER;
    BEGIN
    --INITIIALISE RESULT
    fResult := '';
    HNDL := DBMS_SQL.OPEN_CURSOR;
    l := Length( P_SQL );
    u := ( l / 1000 ) + 1;
    FOR n IN 1..u
    LOOP
    StartPos := ( n - 1 ) + 1;
    LONG_SQL( n ) := SubStr( P_SQL, StartPos, 1000 );
    END LOOP;
    if HNDL <> 0 THEN
    DBMS_SQL.PARSE ( c => HNDL,
    statement => LONG_SQL,
    lb => 1,
    ub => u,
    lfflg => false,
    language_flag => DBMS_SQL.NATIVE );
    --DBMS_SQL.PARSE( HNDL, P_SQL, DBMS_SQL.NATIVE);
    d := DBMS_SQL.EXECUTE( HNDL );
    DBMS_SQL.DESCRIBE_COLUMNS( HNDL, colCount, rec_tab);
    FOR i in 1..colCount
    LOOP
    IF Add_Equals_Sign > 0 AND i > 1 THEN
    fResult := ltrim( fResult || '=' || cCRLF || UPPER( rec_tab( i ).col_name ), cCRLF );
    ELSE
    fResult := ltrim( fResult || cCRLF || UPPER( rec_tab( i ).col_name ), cCRLF );
    END IF;
    END LOOP;
    IF Add_Equals_Sign > 0 THEN
    fResult := fResult ||'=';
    END IF;
    ELSE
    fResult := '!!COULD NOT OPEN CURSOR!!';
    fResult := P_SQL;
    END IF;
    RETURN fResult;
    --Tidy Up 
    DBMS_SQL.CLOSE_CURSOR(HNDL);
    Return 'EGG';
    END;
    --EXAMPLE USAGE
    --Select GET_COLUNS_AS_LIST
    --Select * from SALES_TYPE
    --', 1) FROM DUAL;

    So I have ended up with this.
    When I next get some time, I'd like to be able to strip out the table and simply output the results to an SQL Developer script window without having to go through the table.
    Now this works - but if you see that I am doing something wrong - please point it out.
    Many thanks,
    Ant
    CREATE OR REPLACE FUNCTION GET_COLUNS_AS_LIST( P_SQL IN CLOB, Add_Equals_Sign Number := 0)
    RETURN VARCHAR2
    IS
    fResult VARCHAR2(32000);
    HNDL NUMBER;
    d NUMBER;
    colCount INTEGER;
    i INTEGER;
    ChunkSize INTEGER;
    rec_tab DBMS_SQL.DESC_TAB;
    cCRLF VARCHAR(2) := CHR(13) || CHR(10);
    LONG_SQL dbms_sql.varchar2s;
    n INTEGER;
    l INTEGER;
    u INTEGER;
    StartPos INTEGER;
    BEGIN
    --INITIIALISE RESULT
    HNDL := 0;
    ChunkSize := 4;
    fResult := '';
    --fResult := fResult|| 'A'; 
    HNDL := DBMS_SQL.OPEN_CURSOR;
    --l := Length( P_SQL );
    l := dbms_lob.getLength( P_SQL );
    --l := 50;
    u := Round( l / ChunkSize ) + 1;
    --fResult := fResult|| 'B';   
    FOR n IN 1..u
    LOOP
    StartPos := ( ( n - 1 ) * ChunkSize ) + 1;
    IF StartPos = 0 THEN
    StartPos := 1;
    END IF;
    --LONG_SQL( n ) := SubStr( P_SQL, StartPos, ChunkSize );
    LONG_SQL( n ) := DBMS_LOB.SUBSTR( P_SQL, ChunkSize, StartPos );
    END LOOP;
    --fResult := fResult|| 'C';  
    if HNDL <> 0 THEN
    DBMS_SQL.PARSE ( c => HNDL,
    statement => LONG_SQL,
    lb => 1,
    ub => u,
    lfflg => false,
    language_flag => DBMS_SQL.NATIVE );
    --DBMS_SQL.PARSE( HNDL, P_SQL, DBMS_SQL.NATIVE);
    d := DBMS_SQL.EXECUTE( HNDL );
    DBMS_SQL.DESCRIBE_COLUMNS( HNDL, colCount, rec_tab);
    --fResult := fResult|| 'D';  
    FOR i in 1..colCount
    LOOP
    IF Add_Equals_Sign > 0 AND i > 1 THEN
    fResult := ltrim( fResult || '=' || cCRLF || UPPER( rec_tab( i ).col_name ), cCRLF );
    ELSE
    fResult := ltrim( fResult || cCRLF || UPPER( rec_tab( i ).col_name ), cCRLF );
    END IF;
    END LOOP;
    IF Add_Equals_Sign > 0 THEN
    fResult := fResult ||'=';
    END IF;
    ELSE
    fResult := '!!COULD NOT OPEN CURSOR!!';
    END IF;
    RETURN fResult;
    --Tidy Up 
    IF HNDL <> 0 THEN
    DBMS_SQL.CLOSE_CURSOR(HNDL);
    END IF;
    END;
    -- !!!!HOW TO USE THIS FUNCTION!!!!
    BEGIN
    EXECUTE IMMEDIATE ('DROP TABLE RPT_COLNAME_LOOKUPS;');
    COMMIT;
    EXECUTE IMMEDIATE ('CREATE TABLE RPT_COLNAME_LOOKUPS( COLUMN_NAME CLOB );');
    COMMIT;
    EXCEPTION WHEN OTHERS THEN NULL;
    END;
    DECLARE
    theSQL Clob;
    myresult CLOB;
    BEGIN
    --CLEAR OUT PREVIOUS RWS
    DELETE FROM RPT_COLNAME_LOOKUPS; COMMIT;
    --ASSIGN THE SQL TO RUN IT FOR 
    theSQL := '
    SELECT
    EVENT.EVENT_ID AS COCK_SUCKER,
    EVENT.EVENT_CODE, BLAH, BLAH, VERY LONG SQL STATEMENT';
    --CALL THE FUNCTION PASSING IN THE SQL AND IF I WANT THE = OR NOT
    SELECT GET_COLUNS_AS_LIST( theSQL, 1 ) INTO myresult FROM DUAL;
    --INSERT THE RESULTS INTO A TABLE SO WE CAN GRAB THEM
    INSERT INTO RPT_COLNAME_LOOKUPS SELECT myresult FROM DUAL;
    COMMIT;
    END;
    --THEN LOOK AT THE COLUMNS NAMES IN THIS TABLE
    --SELECT * FROM RPT_COLNAME_LOOKUPS;
    --#############################################################################

  • PL anonymous block does everything, but then gets stuck

    We have a PL/SQL block that loops through a cursor, and inserts data into another table. We're having a strange issue with it... Every single line of code within it appears to function correctly... It does everything we want it to. The last line on it calls a simple function that writes a record to a table we made, to indicate it has completed. It does that, and we can see the record is inserted successfully.
    The problem: even though we can see it did everything, it gets "stuck". If we run it as a anonymous block, the sql plus session will just stay stuck. Same thing if we turn it into a procedure and invoke it. It just stays stuck. Viewing it from OEM... We can see the session as "active", but it doesn't show that it's currently executing anything.
    How can we go about figuring out what the problem is?
    We've tried it on four databases... All windows platforms.. Three were oracle 10g, one was Oracle 11g. One more interesting note: one of the 10g ones... the problem does not occur... the script finishes fine. But, we don't know what is different about this database from the others.
    We also notice the problem doesn't happen if we limit the amount of records... the initial cursor we process, if we limit it using "rownum < 100" or something like that, it will also always finish fine.
    This is the script:
    set echo on
    set serveroutput on
    declare
    n_notes_count number;
    n_records_read number;
    dt_today date;
    MYDATE DATE;
    dt_comment_date date;
    dt_updated_date date;
    t_conv_exceptions "ODB"."CONVERSION_EXCEPTIONS" %ROWTYPE;
    t_conv_exceptions_default "ODB"."CONVERSION_EXCEPTIONS" %ROWTYPE;
    t_note_pad "ODB"."NOTE_PAD"%ROWTYPE;
    t_note_pad_clear "ODB"."NOTE_PAD"%ROWTYPE;
    t_pfcomm "PMI"."PFCOMM"%ROWTYPE;
    c_created_by "ODB"."NOTE_PAD"."CREATED_BY" % type ;
    -- Exceptions to be raised
    ex_notes_number_blank EXCEPTION;
    --ex_category_not_exists EXCEPTION;
    --....more to come.....
    CURSOR cur_notes IS
    SELECT PF."MMNUM",
    PF."MMLIN",
    PF."MMDES",
    PF."MMUSR",
    PF."MMMM",
    PF."MMDD",
    PF."MMYY",
    PF."MMCC",
    --"pfcomm"."mmchr",
    --"pfcomm"."mncmn",
    --"pfcomm"."mmtype",
    PF."MMUSRU",
    PF."MMMMU",
    PF."MMDDU",
    PF."MMYYU",
    PF."MMCCU"
    FROM PMI."PFCOMM" PF
    WHERE TRIM(PF."MMDES") IS NOT NULL
    ORDER BY PF."MMNUM", PF."MMLIN";
    BEGIN
    -- Initialize variables
    dt_today := "ODB"."PKG_APPLICATION_FUNCTION"."CURRENTDATETIME";
    c_created_by :='PFCOMM';
    -- Setup defaults for exceptions table
    t_conv_exceptions_default."SCRIPT" := 'atlas_notes';
    t_conv_exceptions_default."EXECUTION_DATE" := dt_Today;
    t_conv_exceptions_default."CREATED_BY" := c_created_by;
    -- Set up header record for exception
    t_conv_exceptions := t_conv_exceptions_default;
    t_conv_exceptions.column_01 := 'NOTES';
    t_conv_exceptions.header := 'Y';
    ODB.PKG_CONVERSIONS_EXCEPTIONS.writeException(t_conv_exceptions, false);
    -- Count records in table
    SELECT COUNT(*)
    INTO n_records_read
    FROM PMI."PFCOMM";
    -- Delete previously inserted records
    DELETE FROM "ODB"."NOTE_PAD" NP
    WHERE NP."CREATED_BY" = c_created_by or NP."MODIFIED_BY" = c_created_by;
    DELETE FROM "ODB"."NOTE_PAD" NP
    WHERE NP."CREATED_BY" = 'PFCOMM2' or NP."MODIFIED_BY" = 'PFCOMM2';
    DELETE FROM "ODB"."CONVERSION_EXCEPTIONS" CV
    WHERE CV."CREATED_BY" IN (c_created_by,'PFCOMM2');
    COMMIT;
    /* Do Fetch here */
    OPEN cur_notes;
    LOOP
    FETCH cur_notes
    INTO t_pfcomm."MMNUM",
    t_pfcomm."MMLIN",
    t_pfcomm."MMDES",
    t_pfcomm."MMUSR",
    t_pfcomm."MMMM",
    t_pfcomm."MMDD",
    t_pfcomm."MMYY",
    t_pfcomm."MMCC",
    --"t_pfcommcomm"."mmchr",
    --"t_pfcommcomm"."mncmn",
    --"t_pfcommcomm"."mmtype",
    t_pfcomm."MMUSRU",
    t_pfcomm."MMMMU",
    t_pfcomm."MMDDU",
    t_pfcomm."MMYYU",
    t_pfcomm."MMCCU";
    EXIT
    WHEN cur_notes % NOTFOUND;
    -- Clear Variables
    t_note_pad := t_note_pad_clear;
    dt_comment_date := null;
    dt_updated_date := null;
    -- Begin variable assignments
    t_conv_exceptions."COLUMN_01" := t_note_pad."NOTES";
    t_note_pad."NOTES" := t_pfcomm."MMNUM";
    t_note_pad."NOTES_TEXT" := t_pfcomm."MMDES";
    -- Validate required fields
    If t_note_pad."NOTES" is null Then
    raise ex_notes_number_blank;
    End if;
    -- Sequence lines correctly
    SELECT NVL( MAX("ODB"."NOTE_PAD"."NOTES_LINE"), 0)
    INTO t_note_pad."NOTES_LINE"
    FROM "ODB"."NOTE_PAD"
    WHERE "ODB"."NOTE_PAD"."NOTES" = t_note_pad."NOTES"
    -- Next note line number to insert
    If t_note_pad."NOTES_LINE" is null Then
    t_note_pad."NOTES_LINE" := 1;
    Else
    t_note_pad."NOTES_LINE" := t_note_pad."NOTES_LINE" + 1;
    End if;
    -- MMDDCCYY - Comment Date
    If t_pfcomm."MMMM" > 0 Or t_pfcomm."MMDD" > 0 Or t_pfcomm."MMCC" > 0 Or t_pfcomm."MMYY" > 0 Then
    SELECT TO_DATE(LPAD(t_pfcomm."MMMM",2,'0') || LPAD(t_pfcomm."MMDD",2,'0') || LPAD(t_pfcomm."MMCC",2,'0')|| LPAD( t_pfcomm."MMYY",2,'0'),'MMDDYYYY') INTO dt_comment_date FROM DUAL;
    End if;
    -- MMDDCCYY - Updated Date
    If t_pfcomm."MMMMU" > 0 Or t_pfcomm."MMDDU" > 0 Or t_pfcomm."MMCCU" > 0 Or t_pfcomm."MMYYU" > 0 Then
    SELECT TO_DATE(LPAD(t_pfcomm."MMMMU",2,'0') || LPAD(t_pfcomm."MMDDU",2,'0') || LPAD(t_pfcomm."MMCCU",2,'0')|| LPAD( t_pfcomm."MMYYU",2,'0'),'MMDDYYYY') INTO dt_updated_date FROM DUAL;
    End if;
    -- Updated user information
    IF dt_updated_date is not null Then
         t_note_pad."CREATED_BY" := TRIM(t_pfcomm."MMUSRU");
         t_note_pad."CREATED_DATE" := dt_updated_date;
    Elsif dt_comment_date is not null Then
         t_note_pad."CREATED_BY" := TRIM(t_pfcomm."MMUSR");
         t_note_pad."CREATED_DATE" := dt_comment_date;
    Else
         t_note_pad."CREATED_BY" := c_created_by;
         t_note_pad."CREATED_DATE" := dt_today;
    END IF;
    /* Validate mandatory fields of TRAX table */
    IF t_note_pad.NOTES = 0 THEN
    t_note_pad.NOTES :=null;
    End If;
    IF t_note_pad.NOTES_LINE is null THEN
    t_note_pad.NOTES_LINE := 1;
    End If;
    IF TRIM(t_note_pad.PRINT_NOTES) is null Then
    t_note_pad.PRINT_NOTES := 'YES';
    END IF;
    IF TRIM(t_note_pad.NOTES_CATEGORY) is null THEN
    t_note_pad.NOTES_CATEGORY := 'NORMAL';
    END IF;
    If TRIM(t_note_pad."CREATED_BY") is null Then
    t_note_pad."CREATED_BY" := c_created_by;
    End if;
    If TRIM(t_note_pad."MODIFIED_BY") is null Then
    t_note_pad."MODIFIED_BY" := c_created_by;
    End if;
    If TRIM(t_note_pad."MODIFIED_DATE") is null Then
    t_note_pad."MODIFIED_DATE" := dt_today;
    End if;
    If TRIM(t_note_pad."CREATED_DATE") is null Then
    t_note_pad."CREATED_DATE" := dt_today;
    End if;
    -- end structure validation
    /* Do Insert here here */
    insert into "ODB"."NOTE_PAD"
    values t_note_pad;
    commit;
    END LOOP;
    dbms_output.put_line('After loop.');
    CLOSE cur_notes;
    -- Update NOTES Switch
    SELECT MAX(NT."NOTES") + 100
    INTO n_notes_count
    FROM "ODB"."NOTE_PAD" NT
    UPDATE "ODB"."SYSTEM_TRAN_CONFIG"
    SET "CONFIG_NUMBER" = n_notes_count,
    "MODIFIED_BY" = 'TRAXCNV',
    "MODIFIED_DATE" = dt_today
    WHERE ( ODB."SYSTEM_TRAN_CONFIG"."SYSTEM_TRANSACTION" = 'CONFIGURATION' ) AND
    ( ODB."SYSTEM_TRAN_CONFIG"."SYSTEM_CODE" ='NOTES' )
    COMMIT;
    dbms_output.put_line('before audit.');
    /* Do Save Audit record */
    "ODB"."PKG_CONVERSIONS_EXCEPTIONS".writeAudit(t_conv_exceptions."SCRIPT",c_created_by,n_records_read,dt_today);
    dbms_output.put_line('After audit.');
    SELECT SYSDATE INTO MYDATE FROM DUAL;
    -- Begin exception handling.
    exception
    when ex_notes_number_blank then
    t_conv_exceptions.exception_description := 'Note number is blank.';
    ODB.PKG_CONVERSIONS_EXCEPTIONS.writeException(t_conv_exceptions, false);
    when others then
    t_conv_exceptions.exception_description := substr(SQLERRM,1,1000);
    ODB.PKG_CONVERSIONS_EXCEPTIONS.writeException(t_conv_exceptions, false);
    RAISE;
    -- End exception handling.
    dbms_output.put_line('before end.');
    END ;
    /

    Avoid row-at-a-time processing if at all possible (cursor for loops, periodic commits, etc).
    Try adding some calls to dbms_application_info.set_module (or set_action) in order to find out where your code is.

  • How come the item value does not come thru via PL/SQL anonymous block?

    Hi,
    It's a Form with 3 tables -
    1) ClinicianProfileTb (with about 40 columns, insert/update via DML),
    2) PeopleTb (with about 7 columns, insert/update via PL/SQL anonymous block) and
    3) ClinicianPracticeTb (with about 10 columns, insert/update via PL/SQL anonymous block) for after-submit-processes.
    So I have several After-Submit-Processes. For some reason, it appears that PeopleId which is supposed to come thru via the 2nd After-Submit-Process (ie: Insert/Update PeopleTb) does not do the way it's supposed to. And when I press "Create" button at the bottom, I got the following error msg:
    ORA-01400: cannot insert NULL into ("TEST_0712"."CLINICIANPRACTICETB"."PEOPLEID")
    I tried the "debug" mode (via edit page link), but to no avail. (I'm newbie, trying to learn and deliver at the same time :)).
    I uploaded the app to apex.oracle.com, if someone could kindly take a look and let me know what goes wrong, it'd be greatly appreciated.
    workspace: test_0712
    app: 43408 - TEST
    user: demo
    pswd: demoPswd
    Page#21 -> look at the After-Submit-Processes -> in "Insert/Update PeopleTb" it appears that PeopeId does not come thru; thus it cannot be updated to ClinicianProfileTb.PeopleId (allows null) -> and thus cannot be inserted into ClincianPracticeTb.PeopleId (which does NOT allow null). Basically my logic is that in order to create ANY row in ClinicianPracticeTb, BOTH PracticeId AND PeopleId must be present.
    Acutally I should have used the PeopeTb as DML (as the driving table) to enforce that PeopleId must be present in order to insert ClinicianProfileTb and ClinicianPracticeTb, but it'd be lots of codes to write to insert/update in ClinicianProfileTb (40 columns).
    In addition, does ApEx consider EVERY SINGLE after-submit-process are in ONE transaction for commit/rollback? It appears that it treats all PL/SQL anonymous blocks are in ONE transaction, while Automatic Row Processing (DML) is commited/rolled back on its own?
    Thanks much,
    Helen

    All blocks that do not commit in one of the ways I detailed (and which do not explicitly commit using a commit statement) are part of the transaction started with > the first DML statement issued in any of the page processes and continuing until a commit is issued.Say, there are the following processes in the After-Submit-Processes:
    1. Process1 -> Automatic Row Processing (DML)
    2. Process2 -> PL/SQL anonymous block
    3. Process3 -> PL/SQL anonymous block
    Based on what you describe, in the event that if there is no explicit "commit" issued in any of these processes, then an implicit "commit" will be issued at the end of Process3?
    Thanks, Scott.
    Doreen

  • Anonymous Block -- Procedure

    How do I make this anonymous block into a procedure?
    DECLARE
    TYPE actnlog_rt IS RECORD
    id actionlog_temp.id%TYPE,
    seg action_log_temp.seg%TYPE,
    dma action_log_temp.dma%TYPE,
    state action_log_temp.state%TYPE
    TYPE actnlog_nt IS TABLE OF actnlog_rt INDEX BY pls_integer;
    actnlog actnlog_nt;
    BEGIN
    SELECT DISTINCT nvl(id, ip_address), seg, dma, state
    bulk collect
    INTO actnlog
    FROM action_log_temp
    minus
    SELECT v_name, seg_string, dma, state
    FROM v_map;
    FORALL i IN 1 .. actnlog.COUNT
    INSERT INTO
    (SELECT v_name, seg_string, dma, state FROM v_map)
    VALUES actnlog(i);
    DBMS_OUTPUT.PUT_LINE(to_char(SQL % rowcount) || ' rows inserted.');
    END;
    Message was edited by:
    vi2167

    I see. How would you convert this SQL SELECT and INSERT into PL/SQL?
    I could apply the BULK COLLECT...FORALL...model that was used earlier, but not sure about declaring TYPEs. I should declare a new %TYPE for each table.column, right? And should I declare more than one nested table (e.g. actnlog_nt)?
    Thank you.
    CREATE OR REPLACE VIEW vw_v AS
    SELECT x.id,
    x.site,
    x.adate,
    x.imps,
    x.cks
    FROM
    (SELECT v._id,
    s.imps,
    s.ccks,
    s.dma,
    s.state,
    s.seg,
    s.site,
    s.adate
    FROM
    (SELECT nvl(id, ip) AS
    name,
    dma,
    state,
    seg,
    site,
    adate,
    SUM(imps) AS
    imps,
    SUM(cks) AS
    cks
    FROM actn_log_temp
    GROUP BY nvl(id,ip),
    dma,
    state,
    seg,
    site,
    adate)
    s,
    v_map v
    WHERE v.v_name = s.name
    AND v.seg_string = s.seg
    AND v.dma = s.dma
    AND v.state = s.state)
    x;
    INSERT
    INTO v_d_detail(id, site_path, del_date, imps, cks)
    SELECT id,
    site,
    adate,
    imps,
    ccks
    FROM vw_v;
    Message was edited by:
    vi2167
    Message was edited by:
    vi2167

  • Need an anonymous block for fake update,

    I have a table called sk_a
    create table sk_a (a number, b date, c varchar2(10));
    and an audit table
    create sk_a_audit (audit_id number, a number, b date, c varchar2(10),dml_action varchar2(4));
    and sequence sk_a_audit_seq
    create sequence sk_a_audit_seq
    when any insert or update happens into sk_a table, respective data should insert into sk_a_audit table
    and trigger is
    CREATE OR REPLACE TRIGGER SK_A_TRG
    AFTER INSERT OR UPDATE
    ON SK_A
    FOR EACH ROW
    DECLARE
    l_code NUMBER;
    l_errm VARCHAR2 (64);
    BEGIN
    IF (INSERTING OR UPDATING)
    THEN
    INSERT INTO SK_A_audit
    VALUES (sk_a_audit_seq.NEXTVAL, :NEW.a,
    :NEW.B, :NEW.C ,'I');
    END IF;
    EXCEPTION
    WHEN OTHERS
    THEN
    l_code := SQLCODE;
    l_errm := SUBSTR (SQLERRM, 1, 64);
    DBMS_OUTPUT.put_line ('DML Operation is failed ' || l_code || l_errm);
    END;
    sk_a may or maynot have primary or unique keys,
    now my requirement is
    audit table will be deleted by business users,,
    and then I have to run an update on sk_a table (fake update) so that data will come and insert into audit table,,,,
    so that audit table will be back with all the data of sk_a table again,
    I need an anonymous block for this, can any one help on this,

    audit table will be deleted by business users,,
    and then I have to run an update on sk_a table (fake update) so that data will come and insert into audit table,,,,
    so that audit table will be back with all the data of sk_a table again,
    I need an anonymous block for this, can any one help on this,Y? audit table was deleted by busineess users..? could u pls explain it..?
    if u know that users going to delete the audit table, then take the back of the table. that is better instead of fake update.
    U can use exp utility for taking that back up
    Pls reply
    S

  • Scheduling anonymous block

    Is it possible to schedule an anonymous block? if so, how can I do it? some sample code is appreciated.
    Edited by: jdude on 20-Oct-2011 04:34
    This is an example for stored procedure, I can't figure out how to write one for an anonymous block
    begin
    dbms_scheduler.create_job
    (job_name => 'SCOTT.RUN_SCOTTS_PROC',
    job_type => 'STORED_PROCEDURE',
    job_action=> 'SCOTT.SCOTTS_PROC',
    start_date=> trunc(sysdate+1)+1/24,
    repeat_interval=> 'FREQ=DAILY; BYDAY=MON,TUE,WED,THU,FRI,SAT; BYHOUR=1;',
    enabled=>true,
    auto_drop=>false,
    comments=>'Converted from job 152152');
    end;
    Edited by: jdude on 20-Oct-2011 04:42

    Thanks guys,
    I'm getting strange errors like:
    Encountered the symbol "TEST" when expecting one of the following:
    ) , * & = - + < / > at in is mod remainder not rem
    <an exponent (**)> <> or != or ~= >= <= <> and or like like2
    like4 likec between || multiset member submultiset
    The symbol ", was inserted before "TEST" to continue.
    06550. 00000 - "line %s, column %s:\n%s"
    *Cause: Usually a PL/SQL compilation error.
    Please advise, the anonymous block ran with no issue inside a .sql file until when attempts were made to create a job base on this anonymous block.
    Please see:
    begin
    dbms_scheduler.create_program
    (program_name => 'TEST',
    program_type => 'PLSQL_BLOCK',
    program_action =>'
    DECLARE
    CURSOR test_cursor IS
    SELECT name, data
    FROM test_table
    WHERE name = 'test';
    test test_cursor%ROWTYPE;
    BEGIN
    OPEN test_cursor;
    LOOP
    EXIT WHEN test_cursor%NOTFOUND;
    FETCH test_cursor INTO test;
    END LOOP;
    INSERT INTO test_table
    VALUES (test.name, test.data);
    COMMIT;
    CLOSE test_cursor;
    END;
    enabled => TRUE);
    dbms_scheduler.create_job
    (job_name => 'TEST',
    program_name => 'TEST',
    start_date => SYSDATE,
    repeat_interval=> 'FREQ=HOURLY;',
    auto_drop=>false,
    enabled => TRUE,
    comments=>'TEST JOB');
    end;
    I have looked at tutorials here:
    http://download.oracle.com/docs/cd/B28359_01/server.111/b28310/schedadmin006.htm#i1009099
    but I don't see why it doesn't work..this is strange...
    Edited by: jdude on 21-Oct-2011 00:34
    Edited by: jdude on 21-Oct-2011 00:36
    Edited by: jdude on 21-Oct-2011 00:38
    Edited by: jdude on 21-Oct-2011 00:39

  • INVALID CURSOR - Anonymous Block calling Cursor in function

    I am getting an error when trying to call my cursor.
    CREATE OR REPLACE PACKAGE tax_update
    AS
    TYPE gencur IS ref cursor;
    FUNCTION tax_sf
       p_state IN bb_tax.state%type,
       p_thecursor IN OUT gencur
    RETURN NUMBER;
    END;
    CREATE OR REPLACE PACKAGE BODY tax_update
    AS
    FUNCTION tax_sf
       p_state IN bb_tax.state%type,
       p_thecursor IN OUT gencur
    RETURN NUMBER
      IS
      lv_taxrate NUMBER;
    BEGIN
      OPEN p_thecursor FOR
       SELECT taxrate
       FROM bb_tax
       WHERE state = p_state;
      RETURN lv_taxrate;
    END;
    END;
    DECLARE
      tax_cur tax_update.gencur;
      rec_tax bb_tax%rowtype;
    BEGIN
    LOOP
      FETCH tax_cur INTO rec_tax;
       EXIT WHEN tax_cur%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE(rec_tax.taxrate);
    END LOOP;
    END;
    DECLARE
    ERROR at line 1:
    ORA-01001: invalid cursor
    ORA-06512: at line 6Assignment is to create a package that will hold tax rates by state in a packaged cursor. The package will contain a function that can receive a 2 character state abbr. as an argument and find a match in the cursor and return the tax rate for tha tstate. An anonymous block will test the function with state of NC.
    Can anyone assist?

    You would need to call the function to open the cursor before you try to fetch from the cursor
    DECLARE
      tax_cur tax_update.gencur;
      rec_tax bb_tax%rowtype;
      l_some_number number;
    BEGIN
      l_some_number :=  tax_update.tax_sf( <<some state parameter>>, tax_cur );
      LOOP
        FETCH tax_cur INTO rec_tax;
        EXIT WHEN tax_cur%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE(rec_tax.taxrate);
      END LOOP;
    END;A couple of points, though.
    1) Your function returns a NUMBER but that NUMBER will always be NULL. It seems rather unlikely that this is really what you want. It would seem to make more sense for the function to return the cursor rather than returning a superfluous number.
    2) Your function requires a `bb_tax.state%type` parameter. But your anonymous block doesn't seem to have any concept of a state so I'm not sure what you want to pass in there.
    3) Looking at the code, it seems a bit odd that your cursor returns a single column of data. If a state can have multiple rates, wouldn't you need to select some additional criteria in order to figure out which sort of tax each row represents or to otherwise differentiate different rows? If a state can only have a single tax rate, it makes no sense to open a cursor that is only going to ever return a single row.
    4) There is no need to declare your own weak ref cursor type (tax_update.gencur). You can just use the Oracle built-in type SYS_REFCURSOR.
    Justin

  • Reference value of an SQLPLUS variable in a PL/SQL anonymous block

    All,
    Is there a way of referencing an SQLPLUS variable within a PL/SQL anonymous block. See my example below........
    sqlplus -s /@${L_DB_SID} <<-ENDOFSQL >> ${L_LOGFILE}
    SET FEEDBACK OFF
    SET PAGES 0
    SET SERVEROUTPUT ON
    WHENEVER SQLERROR EXIT SQL.SQLCODE
    WHENEVER OSERROR EXIT 2
    VARIABLE l_ret_sts NUMBER;
    VARIABLE l_ret_msg VARCHAR2(300);
    exec sh_plsql_owner.sh\$secure_batch.p\$set_role(p_ret_sts => :l_ret_sts);
    begin
    if :l_ret_sts > 0 then
    dbms_output.put_line('l_ret_sts:'||:l_ret_sts||':SECURITY');
    else
    ${L_PLSQL_PROG}(p_ret_type => 0, p_ret_sts => :l_ret_sts, p_ret_msg => :l_ret_msg);
    dbms_output.put_line('l_ret_sts:'||NVL(:l_ret_sts,0));
    dbms_output.put_line('l_ret_msg:'||:l_ret_msg);
    end if;
    end;
    exit
    ENDOFSQL
    I need to be able to reference :l_ret_sts in the begin block using the if statement "if :l_ret_sts > 0 then"
    :l_ret_sts is populated in a procedure call beforehand.
    However it seems as though the begin block cannot reference the value returned to :l_ret_sts.
    Any ideas.
    Ian.

    Managed to solve this. I put my call to the package that the role enables via dynamic sql....
    sqlplus -s /@${L_DB_SID} <<-ENDOFSQL >> ${L_LOGFILE}
    SET FEEDBACK OFF
    SET PAGES 0
    SET SERVEROUTPUT ON
    WHENEVER SQLERROR EXIT SQL.SQLCODE
    WHENEVER OSERROR EXIT 2
    VARIABLE l_ret_sts NUMBER;
    VARIABLE l_ret_msg VARCHAR2(300);
    exec dbms_application_info.set_client_info('CONTROL-M');
    exec sh_plsql_owner.sh\$secure_batch.p\$set_role(p_ret_sts => :l_ret_sts);
    declare
    v_text varchar2(500);
    begin
    if :l_ret_sts > 0 then
    dbms_output.put_line('l_ret_sts:'||:l_ret_sts||':SECURITY');
    else
    v_text := 'begin ${L_PLSQL_PROG}(p_ret_type => 0, p_ret_sts => :1, p_ret_msg => :2);end;';
    execute immediate v_text using in out :l_ret_sts, in out :l_ret_msg;
    dbms_output.put_line('l_ret_sts:'||NVL(:l_ret_sts,0));
    dbms_output.put_line('l_ret_msg:'||:l_ret_msg);
    end if;
    end;
    exit
    ENDOFSQL
    Cheers
    Ian.

  • Cursor query works in anonymous block but not in procedure

    Hello,
    My cursor query works fine in anonymous blcok but fails in pl/sql block.
    Anonymous block:
    declare
    cursor c1 is
    select object_name
    from all_objects
    where owner='IRIS_DATA'
    and object_type='SEQUENCE';
    v_string varchar2(2000);
    begin
    for c2 in c1 loop
    v_string := 'DROP SEQUENCE IRIS_DATA.'||c2.object_name;
    execute immediate v_string;
    end loop;
    commit;
    exception
    when others then
    dbms_output.put_line('Exception :'||sqlerrm);
    end;
    works fine.
    but inside the procedure the it doesn't go inside the cursor loop
    procedure get_sequence is
    l_dp_handle NUMBER;
    v_job_state varchar2(4000);
    l_last_job_state VARCHAR2(30) := 'UNDEFINED';
    l_job_state VARCHAR2(30) := 'UNDEFINED';
    l_sts KU$_STATUS;
    v_logs ku$_LogEntry;
    v_row PLS_INTEGER;
    v_string1 varchar2(2000);
    cursor seq_obj is
    select object_name
    from all_objects
    where owner='IRIS_DATA'
    and object_type='SEQUENCE';
    begin
         log_status('get_sequence started.');
         --Cursor records to drop the sequences before importing.
         for seq_obj_rec in seq_obj loop
    log_status('get_sequence: Dropping sequence started.');
         v_string1 := 'DROP SEQUENCE IRIS_DATA.'||seq_obj_rec.object_name;
    execute immediate v_string1;
         end loop;
         log_status('get_sequence: Dropping sequence completed.');
    exception
    WHEN OTHERS THEN
    log_status('get_sequence: exception.');
    end get_sequence;
    it's not going into the seq_obj_rec cursor.
    I granted select on all_objects to the user.this user is also having the DBA role as well.
    Please advice.

    PROCEDURE Get_sequence
    IS
      l_dp_handle      NUMBER;
      v_job_state      VARCHAR2(4000);
      l_last_job_state VARCHAR2(30) := 'UNDEFINED';
      l_job_state      VARCHAR2(30) := 'UNDEFINED';
      l_sts            KU$_STATUS;
      v_logs           KU$_LOGENTRY;
      v_row            PLS_INTEGER;
      v_string1        VARCHAR2(2000);
      CURSOR seq_obj IS
        SELECT object_name
        FROM   all_objects
        WHERE  owner = 'IRIS_DATA'
               AND object_type = 'SEQUENCE';
    BEGIN
        Log_status('get_sequence started.');
        --Cursor records to drop the sequences before importing.
        FOR seq_obj_rec IN seq_obj LOOP
            Log_status('get_sequence: Dropping sequence started.');
            v_string1 := 'DROP SEQUENCE IRIS_DATA.'
                         ||seq_obj_rec.object_name;
            EXECUTE IMMEDIATE v_string1;
        END LOOP;
        Log_status('get_sequence: Dropping sequence completed.');
    EXCEPTION
      WHEN OTHERS THEN
                 Log_status('get_sequence: exception.');
    END get_sequence; How do I ask a question on the forums?
    SQL and PL/SQL FAQ
    scroll down to #9 & use tags in the future.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       

  • Getting value with an anonymous block using ODP

    Hi all!
    I have a problem I hope someone can help me with. I believe it to be a minor one. I am trying to imbed an anonymous block into my .net app and use it dynamically to get a value from the database depending on the values in a tables. Since my procedure is quite large I am displaying a small example proc for simplicity purposes. Basically I want to execute an anonymous block from my app that will return a value (not a row or rows) from the database. The code is below:
    Private Sub test()
    Dim cn As New OracleConnection(profileString)
    Try
    Dim sb As New System.Text.StringBuilder
    sb.Append("Declare ")
    sb.Append("v_maxnum varchar2(6); ")
    sb.Append("Begin ")
    sb.Append("Select max(to_number(email_address_id)) into ")
    sb.Append("v_maxnum from CVWH14_CDRV_TEST.EMAIL_ADDRESS_TBL; ")
    sb.Append("dbms_output.put_line(v_maxnum); ")
    sb.Append("Exception ")
    sb.Append("When Others ")
    sb.Append("Then ")
    sb.Append("dbms_output.put_line('Program run errors have occurred.'); ")
    sb.Append("End; ")
    Dim cmd As New OracleCommand(sb.ToString, cn)
    With cmd
    cmd.CommandType = CommandType.Text
    Dim parm As New OracleParameter
    parm.ParameterName = "v_maxnum"
    parm.OracleType = OracleType.VarChar
    parm.Direction = ParameterDirection.Output
    parm.Size = 6
    cmd.Connection.Open()
    Dim ret As Object = cmd.ExecuteScalar()
    Dim res As String = cmd.Parameters.Item(0).Value.ToString -- **Error is occuring here**
    cmd.Connection.Close()
    cmd.Dispose()
    End With
    Catch ex As Exception
    MessageBox.Show(ex.Message, "Error")
    'End If
    If cn.State = ConnectionState.Open Then
    cn.Close()
    End If
    End Try
    End Sub
    The exception error reads "Invalid Index 0 for this OracleParameterCollection with Count=0."
    If I can figure out how to get a parameter value from the database via the anonymous block, I can apply the logic to the real application. Any help or direction I could receive would be greatly appreciated. Thanks for reading this post!

    Thank you for responding. The code that I posted was just one of many ways I have tried. I retried the proc making just 2 changes:
    Private Sub test()
    Dim cn As New OracleConnection(profileString)
    Try
    Dim sb As New System.Text.StringBuilder
    sb.Append("Declare ")
    sb.Append("v_maxnum varchar2(6); ")
    sb.Append("Begin ")
    sb.Append("Select max(to_number(email_address_id)) into ")
    sb.Append("v_maxnum from CVWH14_CDRV_TEST.EMAIL_ADDRESS_TBL; ")
    sb.Append("dbms_output.put_line(:v_maxnum); ") -- !Changed this to a bind variable!
    sb.Append("Exception ")
    sb.Append("When Others ")
    sb.Append("Then ")
    sb.Append("dbms_output.put_line('Program run errors have occurred.'); ")
    sb.Append("End; ")
    Dim cmd As New OracleCommand(sb.ToString, cn)
    With cmd
    cmd.CommandType = CommandType.Text
    Dim parm As New OracleParameter
    parm.ParameterName = ":v_maxnum" -- !Changed this to a bind variable!
    parm.OracleType = OracleType.VarChar
    parm.Direction = ParameterDirection.Output
    parm.Size = 6
    cmd.Connection.Open()
    Dim ret As Object = cmd.ExecuteScalar() -- !The error is now occuring here!
    Dim res As String = cmd.Parameters.Item(0).Value.ToString
    cmd.Connection.Close()
    cmd.Dispose()
    End With
    Catch ex As Exception
    MessageBox.Show(ex.Message, "Error")
    If cn.State = ConnectionState.Open Then
    cn.Close()
    End If
    End Try
    End Sub
    I am now getting the error message "Not all variables bound". Any more help or direction that you could throw my way would be greatly appreciated.

Maybe you are looking for