Function defined in anonymous block?

Quick question. I'd like to define a temporary function in a PL/SQL anonymous block. I'm thinking that I've seen an example of that done before, but I can't seem to find the example. Here's the source. Given a table name, I want to return a comma-delimited list of the columns in the table. As a stored function, this works like a charm:
CREATE OR REPLACE
FUNCTION columnlist_csv (in_tablename VARCHAR2) RETURN VARCHAR2 IS
v_columnlist VARCHAR2(4000);
v_num_columns NUMBER(4,0);
CURSOR c1(c1_tablename VARCHAR2) IS
SELECT column_name, column_id FROM user_tab_columns
WHERE table_name = c1_tablename ORDER BY column_id;
BEGIN
SELECT count(*) INTO v_num_columns FROM user_tab_columns WHERE table_name=in_tablename;
FOR c1row IN c1(in_tablename) LOOP
v_columnlist := v_columnlist||c1row.column_name;
IF c1row.column_id < v_num_columns THEN
v_columnlist := v_columnlist||', ';
END IF;
END LOOP;
RETURN v_columnlist;
END;
SELECT columnlist_csv(upper('&tablename')) FROM dual;
But, rather than having the function be a stored function, I'd prefer to define a temporary function on the fly in the script, like below. However, this doesn't work as an anonymous block. I believe I simply have the syntax wrong, and I'm hoping someone like lend a second pair of eyes...
DECLARE
FUNCTION columnlist_csv (in_tablename VARCHAR2) RETURN VARCHAR2 IS
v_columnlist VARCHAR2(4000);
v_num_columns NUMBER(4,0);
CURSOR c1(c1_tablename VARCHAR2) IS
SELECT column_name, column_id FROM user_tab_columns
WHERE table_name = c1_tablename ORDER BY column_id;
BEGIN
SELECT count(*) INTO v_num_columns FROM user_tab_columns WHERE table_name=in_tablename;
FOR c1row IN c1(in_tablename) LOOP
v_columnlist := v_columnlist||c1row.column_name;
IF c1row.column_id < v_num_columns THEN
v_columnlist := v_columnlist||', ';
END IF;
END LOOP;
RETURN v_columnlist;
END;
SELECT columnlist_csv(upper('&tablename')) FROM dual;
Can anyone advise?
Regards,
Dave

I want to return a comma-delimited list of the columns in the tableIf this is the goal, you could use a simple SELECT statement, SQL> desc test111;
Name                            Null?    Type
TRX_NUMBER                               VARCHAR2(20)
TRX_AMOUNT                               NUMBER(12,2)
SQL> select  decode(column_id,1,'',',') || lower(column_name) col_name
  2  from    user_tab_columns
  3  where   table_name = upper('&table_name')
  4  order by column_id
  5  /
Enter value for table_name: test111
old   3: where   table_name = upper('&table_name')
new   3: where   table_name = upper('test111')
COL_NAME
trx_number
,trx_amountThx,
SriDHAR

Similar Messages

  • 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

  • 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/SQL Anonymous Block - Trying to Call Function within Cursor

    Hello -
    I need to create an anonymous block that contains a cursor and a function. I want to call the function from within the cursor, and the function will basically take an ID as its IN parameter, and will return a comma separated list of values.
    However, when I try to do this I get the error " function 'GET_PAYMENT_DATES' may not be used in SQL".
    Does anyone know of a workaround? I'm trying to avoid having to store this function.
    Thanks,
    Christine

    Exploring Keith's suggestion of using the function code inline in your SQL:
    test@ORA10G>
    test@ORA10G> --
    test@ORA10G> drop table t;
    Table dropped.
    test@ORA10G> drop table monetary_trans;
    Table dropped.
    test@ORA10G>
    test@ORA10G> create table monetary_trans as
      2  select 1 household_id, trunc(sysdate)-10 received_date from dual union all
      3  select 1, trunc(sysdate)-9 from dual union all
      4  select 1, trunc(sysdate)-8 from dual union all
      5  select 2, trunc(sysdate)-7 from dual union all
      6  select 2, trunc(sysdate)-6 from dual;
    Table created.
    test@ORA10G>
    test@ORA10G> create table t as
      2  select rownum x, rownum*10 y from dual connect by level <= 4;
    Table created.
    test@ORA10G>
    test@ORA10G> --
    test@ORA10G> select * from monetary_trans;
    HOUSEHOLD_ID RECEIVED_
               1 28-DEC-08
               1 29-DEC-08
               1 30-DEC-08
               2 31-DEC-08
               2 01-JAN-09
    test@ORA10G> select * from t;
             X          Y
             1         10
             2         20
             3         30
             4         40
    test@ORA10G>
    test@ORA10G> --
    test@ORA10G> -- the function code could be rewritten as follows
    test@ORA10G> --
    test@ORA10G> select household_id,
      2         ltrim(sys_connect_by_path(rd,','),',') payment_dates
      3    from
      4  (
      5  select household_id,
      6         to_char(received_date,'mm/dd/yy') as rd,
      7         row_number() over (partition by household_id order by 1) rn,
      8         count(*) over (partition by household_id) cnt
      9    from monetary_trans
    10    -- and the constraints here in the where clause
    11  )
    12  where level = cnt
    13  start with rn = 1
    14  connect by prior household_id = household_id
    15  and prior rn = rn - 1
    16  and household_id = 1 -- <== this is the input parameter value
    17  ;
    HOUSEHOLD_ID PAYMENT_DATES
               1 12/28/08,12/29/08,12/30/08
    test@ORA10G>
    test@ORA10G> --
    test@ORA10G> -- and can be used as an inline view when joined with other tables
    test@ORA10G> --
    test@ORA10G> select t.y,
      2         fn.payment_dates
      3    from t,
      4         (select household_id,
      5                 ltrim(sys_connect_by_path(rd,','),',') payment_dates
      6          from (select household_id,
      7                       to_char(received_date,'mm/dd/yy') as rd,
      8                       row_number() over (partition by household_id order by 1) rn,
      9                       count(*) over (partition by household_id) cnt
    10                  from monetary_trans)
    11          where level = cnt
    12          start with rn = 1
    13          connect by prior household_id = household_id
    14          and prior rn = rn - 1
    15         ) fn
    16   where t.x = fn.household_id
    17  ;
             Y PAYMENT_DATES
            10 12/28/08,12/29/08,12/30/08
            20 12/31/08,01/01/09
    test@ORA10G>
    test@ORA10G>HTH
    isotope

  • Help: How to call a user defined function in a data block query?

    I created a string aggregation function in the program unit, see reference:
    http://www.oracle-base.com/articles/10g/StringAggregationTechniques.php
    I now like to call the function in my data block query. I got the error: ORA-00904: 'concatenate_list' invalid identifier.
    Please help.
    Thank you in advance.
    Jimmy

    Hi,
    You can write UDFs in java in Graphical mapping to enhance your XI Graphical mapping functionality
    The steps for doing it would be:
    1. Click on Create New function Button found on Bottom left corner on your XI Mapping window.
    2. Write your java code.
    3. Run the Mapping Test as usual.
    >>The module that is given here ...where and how it is used.
    The adapters in the Adapter Framework convert XI messages to the protocols of connected external systems and the other way around. When doing so, some
    functionality might need to be added specific to a situation which is possible with the use of custom modules.
    Typical example would be validation of file content when using a File Adapter or modification of the message payload to a common content structure which is not supported by any of the standard SAP modules.
    An Adapter module is developed as an Enterprise Java Bean and is called locally by the Adapter.
    An example on modules :
    <a href="https://www.sdn.sap.comhttp://www.sdn.sap.comhttp://www.sdn.sap.com/irj/servlet/prt/portal/prtroot/docs/library/uuid/da5675d1-0301-0010-9584-f6cb18c04805">How to develop a module for reading file name in a sender file adapter XI 3.0</a>
    Cheers,
    Chandra

  • 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}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 

  • Performance problem due to anonymous blocks

    Hi,
    One of the users on our database has created a procedure consisting of many blocks like the one given below:
    begin
    select func1(var1,var2,var3)into vcompvalue from dual;
    if vcompvalue < 0 then
    vcompvalue := 0;
    end if;
         exception when no_data_found then
         vcompvalue := 0;      
    end;
    The procedure takes a long time to execute.Instead of writing a block, will writing SQL%NOTFOUND instead of the exception and merging the blocks with rest of the code improve performance?
    Thanks for the help!
    Vinayak Thatte

    I would guess it might; you'd be cutting down the number of PL/SQL clauses that have to be parsed, etc, so if you have enough anonymous blocks you may see a difference.
    On a more specific note can I just ask why you're checking for NO_DATA_FOUND? If DUAL ever throws this exception you've got serious problems with your database. If it's being thrown by your FUNC1 you might be better off (from a performance point of view) handling that exception within the function.
    rgds, APC

  • Can select resource content in anonymous block, but not in stored procedure

    I know the problem relates to the ACLs but am curious about the following behaviour:
    Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
    PL/SQL Release 10.2.0.1.0 - Production
    CORE 10.2.0.1.0 Production
    TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
    NLSRTL Version 10.2.0.1.0 - Production
    running on Windows XP sp2
    Trying to access an existing resource '/home/test/test.dtd'
    /home is owned by SYS
    /home/test is owned by me
    /home/test.test.dtd is owned by me
    The following SQL and anonymous block retrieve the content of the resource:
    select extract(p.res,'/*').getClobVal()
    from resource_view p
    where p.any_path = '/home/test/test.dtd'
    declare
    alldata clob;
    begin
    select extract(p.res,'/*').getClobVal()
    into alldata
    from resource_view p
    where p.any_path = '/home/test/test.dtd'
    dbms_output.put_line(substr(alldata, 1, 255));
    end;
    BUT when I encapsulate the anonymous block in a stored procedure, I am told that the folder '/home/test/' does not exist.
    As said, the problem related to the ACL on the folders, what I cannot understand, and caused me considerable confusion, is why I was unable to get the content from a stored procedure when I was able to do so from an anonymous block.
    regards
    Richard

    Use equals_path(res,'/home/test/test.dtd') = 1OK, OK, but how do you use wildcards (if you want to) since any_path like '/home/test%' works?
    Who was the stored procedure owned by. Was it a stand-alone stored procedure or a
    method on a package. If it was a method on a package is it AUTHID creator or AUTHID
    definer.Everything apart from the '/home' folder is owned by the current user.
    The PL/SQL was in a packaged procedure, a stand-alone stored procedure, and an anonymous block. It exhibited the same behaviour in each. All were defined with default AUTHID which is definers rights which is the same as the current user in this case.

  • Calling PL/SQL anonymous block from href in tabular report

    apex 2.2.
    I've got a tabular report where I've added some img columns with a href to call diff processes
    for example
    "<a href="f?p=&APP_ID.:22:&APP_SESSION.:BRANCH_TO_PAGE_ACCEPT|NEW_PROXY:NO:::22,ABCDEF ><img src="/i/asyl.gif" border="0" alt="Runprocess"></a>"
    When clicking on an image column in row x then I would like to run the process - no page submit.
    The pl/sql anonymous block process source calls package.storedproc(p1,p2) - two in parameters
    I'm struggling with the syntax and is wondering if there's a smarter way to achieve the same function
    Any ideas most welcome
    Thanks
    Peter

    &lta href="f?p=&APP_ID.:22:&APP_SESSION.:BRANCH_TO_PAGE_ACCEPT|NEW_PROXY:NO:::22,ABCDEFG" &gt&ltimg src="/i/asylogin.gif" border="0" alt="Process"&gt&lt/a&gtQuestion is how can you pass values from a row in a tabular report to the application process ?

  • 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

  • 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.

  • Customize the Anonymous Block.

    Hi All,
    DB - Oracle 9.2.0.1.0
    With the help of you Guys , I am able to create the Anonymous block.But, In the following BLOCK, I need to add One more functionality, if someone needs to grant "create view" privilge inside the block , then the massage should be " No direct grant allowed, this should be assigned to role. Also, is there any alternate, where we can achieve the same effect without using Associative
    DECLARE
    v_need_to_assign VARCHAR2(30) := '&ENTER PRIVILEGE ASSIGN';
    v_user varchar2(30) := '&USER';
    TYPE t_list IS TABLE OF NUMBER INDEX BY VARCHAR2(30);
    v_list t_list;
    v_chk NUMBER;
    e_fail_drop EXCEPTION;
    BEGIN
    v_list('SYSDBA') := 1;
    v_list('CREATE SESSION') := 1;
    BEGIN
    v_chk := v_list(v_need_to_assign);
    RAISE_APPLICATION_ERROR(-20001,'PRIVELEGE '||v_need_to_assign||' is not allowed to be grant');
    EXCEPTION
    WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('Privilege ' || v_need_to_assign|| ' Granted');
    EXECUTE IMMEDIATE 'GRANT '||v_need_to_assign || ' to ' || v_user;
    DBMS_OUTPUT.PUT_LINE('THE PRIVELEGE '||v_need_to_assign || ' HAS BEEN GRANTED TO ' || v_user) ;
    END;
    END;
    hare krishna

    I would appriciate, if you could offer your suggestions on this.
    hare krishna
    Alok

  • Calling Anonymous block from VO

    Hi All,
    I have an Anonymous block which contains Record types, table types, functions, and procedure. Procedure returns multiple rows using all functions and types. I want to display those rows in Advanced table in OAF page. Please suggest methods to get this done.
    Thanks in advance.
    Kaushik Rambhiya

    Hi Kaushik ,
    You can make use of Prepared statment or Callable statement (both are Java API's ) to call an pl/sql block .
    Regards ,
    Keerthi

  • Anonymous Block in PL/SQL

    How do we refer the anonymous block in PL/SQL? And what is the purpose of anonymous blocks?

    830933 wrote:
    How do we refer the anonymous block in PL/SQL? You cannot refer to a code unit by name, that has no name. A stored proc, stored function and stored package all have names. These are not only stored as a named object in the database, but if valid, also compiled and ready to be loaded and executed.
    An anonymous block has no name. So it cannot be stored as a named object in the database. You can store it in a column as a value for example. You can store it on the client as a SQL script file. Or the client can dynamically create anonymous blocks - as is the usual case.
    An anonymous block always need to be parsed and compiled before it can used.
    And what is the purpose of anonymous blocks?If your Visual Basic client need to execute a SQL statement, then the "anonymous SQL block" (which we simply call the SQL statement) that will be created and send to Oracle would look something as follows:
    select e.* from SCOTT.emp e where e.dept_no = :1Now anonymous PL/SQL blocks are not really different. Clients will typically create dynamic anonymous PL/SQL blocks for making PL/SQL procedural calls. Let's say your Visual Basic client wants to run procedure CalculateFoo( id in number, res out number ) that resides in the SCOTT schema in the database. It needs to create an anonymous PL/SQL block and place the procedure call in it.
    This anonymous block will look as follows:
    begin
      SCOTT.CalculateFoo( id => :1, res => :2 );
    end;It then needs to send this to Oracle to be parsed and executed. Oracle will also expect 2 bind variables to be supplied - an input bind variable called +1+ and an output bind variable called +2+.
    So all SQLs that you send are by default "anonymous" SQL blocks of code - that needs to be parsed and executed. Now PL/SQL works in a similar fashion - you will need to send a block of PL/SQL code (and not SQL code) in order to execute PL/SQL procedures and packages.

  • Why WHO_CALLED_ME return me ANONYMOUS BLOCK ?

    I would like to know the name of the current of stored procedure with the name of the package.
    So I use OWA_UTIL.WHO_CALLED_ME function but it returns ANONYMOUS BLOCK and not "PROCEDURE" and the name of my procedure.
    Do you know why ?
    Example :
    create or replace
    PACKAGE BODY     RDF_UTILS AS
       PROCEDURE T1
       IS
             owner varchar2(30);
             nom varchar2(200);
             lineno number;
             caller_t varchar2(200);
       BEGIN
            sys.DBMS_OUTPUT.PUT_LINE (sys.DBMS_UTILITY.FORMAT_CALL_STACK);
            sys.DBMS_OUTPUT.NEW_LINE();
            sys.DBMS_OUTPUT.NEW_LINE();
            sys.OWA_UTIL.WHO_CALLED_ME(owner, nom, lineno, caller_t);
            sys.DBMS_OUTPUT.PUT_LINE('owner ='||owner||'name = '||nom||'lineno = '||lineno||'caller_t = '||caller_t);
       END;
    END RDF_UTILS;

    Because that's the way it works.I thought we were all making a concerted effort not to post sarcastic one-liners.
    @sed: The who_called_me function is intended to return the user who called your function / procedure, not the immediate caller of the 'who_called_me' function.
    Perhaps Tom Kyte's original post will be of help (compare with the who_am_i function).
    http://asktom.oracle.com/tkyte/who_called_me/
    http://asktom.oracle.com/tkyte/who_called_me/who.sql

Maybe you are looking for

  • ICloud problem after change of email address

    I recently changed my email address and iCloud keeps popping up asking for password of old address.  How do I change iCloud info to new email addr?

  • Prep HDV material in Windows (!) ?

    Hi and sorry if this has been a topic before (can't find it, though). A client has tons of HDV tapes that he wants to transfer to a hard drive himself and also likes to sort through the video in order to prepare for the editing. He wants to bring the

  • Poor quality of video chat

    When I try to video chat with people on iChat (I have a Macbook), the quality of the video is terrible, even though my internet connection is usually strong and fast. I have even tried it with people on computers in the same room, and I have the same

  • Automatically Importing Content From Webpage

    In Excel it was possible to import data from webpages into the spreadsheet. Can that be done in Numbers? If so how? Thanks

  • Router works with PC, not with Mac?

    My dad just bought a MacBook pro in the U.S and we are now enjoying our holidays in the Cook islands. Now, vacation is good and all, but one needs to keep up with the events in the world. Now, there is internet connection in the house we are renting,