Dynamic sql please help

hi i want to write a stored procedure where i should return a reference cursor.... (var_refcursor)
i have to dynamically generate where conditions inside my stored procedure so i did something and finally generated the where conditions and saved it in a string
var_filter ='empno=value and ename=value and dept= value ) <--------- my string looks like this
now can i write like this?
execute immediate 'select * from table_emp where var_filter ;' into var_refcursor;
return var_refcursor;
2nd question) can i declare a cursor like this
cursor c1 is ( select distinct department as dept from dep_table;
minus
select distinct department as dept from emp_sample ; )
3rd question) how do i test the stored procedure whether it is returning the reference cursor or not..?( i want to see the rows that it returns
Edited by: user10887630 on Apr 15, 2009 8:27 AM
Edited by: user10887630 on Apr 15, 2009 8:34 AM

hi i have written the funtion like this am knowing how to test this..
CREATE OR REPLACE Function cif_function(content_in IN varchar2)
return sys_refcursor
IS
v_refcursor sys_refcursor;
total_val number(6);
str1 varchar2(1000) default null;
str2 varchar2(1000) default null;
str3 varchar2(1000) default null;
v_filter varchar2(1000)default null;
--v_sql varchar2(10);
-- opened a cursor for the querying the cifview that contains what static attributes are present for a particular contentname
cursor c1 is select key,const_val from rajesh_sample where Name='content_in';
BEGIN
FOR cif_record in c1
LOOP
str1 := concat(concat(concat(concat(str1,c1.key),'='),c1.const_val),' and ') ;
END LOOP;
END;
-- opened a cursor for the querying the cifview that does not what static attributes for a particular contentname
cursor c2 is ( select distinct attrib as s_att from rajesh_static_attributes
minus
select distinct key as s_att from rajesh_sample where Name='content_in'; )
BEGIN
FOR cif_static_superset in c2
LOOP
str2 := concat(concat(str2,c2.s_att),' is null and ');
END LOOP;
END;
str3 := concat(str1,str2);
v_filter :=rtrim(str3,' and ');
v_filter := rpad(rtrim(v_filter),';')
open v_refcursor for 'select * from ats_rules where v_filter';
return v_refcursor; -------------->returning the refcursor
end cif_function;
Edited by: user10887630 on Apr 15, 2009 9:56 AM

Similar Messages

  • How to call communication channel dynamically? Please help!

    Hi Experts,
       BizTalk -
    > XI -
    > SAP SYS01
                          XI|----
    >SAP SYS02
       We are integrating Biztalk with SAP via XI. BizTalk send rosattenet PIP via JMS adapter to XI. XI then sends the PIP data to SAP system using RFC adapter.
       In the PIP we have a parameter for plant code. Now if plant code is 'ABC' then we need to send the data to SAP SYS01 else if plant code is 'XYZ' then send the data to SAP SYS02.
      In other words we have RFC communication channel one each for each SAP system.
      This is like calling the communication channel dynamically based on palnt code.
      How can we do this in XI? Please help!
    Thanks & Regards,
    Gopal
    Edited by: GOPAL BALIGA on Jan 12, 2009 7:35 AM

    this is a typical case for a XPATH based conditional routing. note that your receiver will have binding with the interface and the communication channel
    ref:
    /people/shabarish.vijayakumar/blog/2005/08/03/xpath-to-show-the-path-multiple-receivers
    /people/shabarish.vijayakumar/blog/2006/06/07/customise-your-xpath-expressions-in-receiver-determination

  • Delete data from a flat file using PL/SQL -- Please help.. urgent

    Hi All,
    We are writing data to a flat file using Text_IO.Put_Line command. We want to delete data / record from that file after data is written onto it.
    Please let us know if this is possible.
    Thanks in advance.
    Vaishali

    There's nothing in UTL_FILE to do this, so your options are either to write a Java stored procedure to do it or to use whatever mechanism the host operating system supports for editing files.
    Alternatively, you could write a PL/SQL procedure to read each line in from the file and then write them out to a second file, discarding the line you don't want along the way.

  • Hi i want query in pl/sql please help me in that

    i have two tables mbr and loyalty.i have to compare these two tables with primary key and have to get matching records in two tables.and then i have keep all the matching records in one temp table.and then deleting mbr table, then updating all temp table records in mbr.i.e is updating of records from loyalty to mbr table.
    i think i was clear with my requirement

    so you're saying...
    1. loyalty inner join mbr -> temp table
    2. delete mbr where matching records? or delete all of mbr?
    3. update mbr where there were matching records? (but have been deleted by step 2!)
    if i understand your requirements correctly you can jump straight to step 3 without this whole temp table business: do an update with a corelated subquery.

  • Advice for best way to do this dynamic table -please help

    Hello, I would like to create paginated recordsets without
    specifying the filename over and over again. For example, if I have
    folders of pictures with sequential filenames, is there anyway to
    get around manually entering them in the database? If not, what is
    the best way to go about doing this because I will have a great
    number of these "books" to create. Maybe there is a way to just
    auto-enumerate a 1.jpg, 2.jpg, 3.jpg, 4.jpg etc in the db and then
    I can just drop in the pictures since the path would be the same.
    I'm using php/mysql for the db end.
    Many thanks in advance!
    dwnoob

    Why not have a record ID# and have the code programatically
    generate the
    image name? That way you wouldn't need an image field at all,
    e.g.,
    <img src="/path/path/path/imagename -<?php echo
    $rs_recordset['recordID'];
    ?>.jpg"....
    Murray --- ICQ 71997575
    Adobe Community Expert
    (If you *MUST* email me, don't LAUGH when you do so!)
    ==================
    http://www.projectseven.com/go
    - DW FAQs, Tutorials & Resources
    http://www.dwfaq.com - DW FAQs,
    Tutorials & Resources
    ==================
    "dwnoob" <[email protected]> wrote in
    message
    news:ftrh3v$2a8$[email protected]..
    > Hello, I would like to create paginated recordsets
    without specifying the
    > filename over and over again. For example, if I have
    folders of pictures
    > with
    > sequential filenames, is there anyway to get around
    manually entering them
    > in
    > the database? If not, what is the best way to go about
    doing this because
    > I
    > will have a great number of these "books" to create.
    Maybe there is a way
    > to
    > just auto-enumerate a 1.jpg, 2.jpg, 3.jpg, 4.jpg etc in
    the db and then I
    > can
    > just drop in the pictures since the path would be the
    same.
    >
    > I'm using php/mysql for the db end.
    >
    > Many thanks in advance!
    >
    > dwnoob
    >
    >

  • Need generic dynamic sql query to generate nodes depending on dealer levels

    Input table:
    create table #test(dealerid integer ,dealerlvl integer)
    insert into #test values(1,1)
    insert into #test values(1,2)
    insert into #test values(1,3)
    insert into #test values(1,4)
    insert into #test values(2,1)
    insert into #test values(2,2)
    insert into #test values(2,3)
    insert into #test values(2,4)
    insert into #test values(2,5)
    insert into #test values(2,6)
    go
    create table #test2(dealerid integer,node integer,prntnode integer,dealerlvl integer)
    insert into #test2 values (1,234,124,2)
    insert into #test2 values (1,123,234,1)
    insert into #test2 values (1,238,123,2)
    insert into #test2 values (1,235,238,3)
    insert into #test2 values (1,253,235,4)
    insert into #test2 values (2,21674,124,3)
    insert into #test2 values (2,1233,21674,1)
    insert into #test2 values (2,2144,1233,2)
    insert into #test2 values (2,2354,2144,3)
    insert into #test2 values (2,24353,2354,4)
    insert into #test2 values (2,245213,24353,5)
    insert into #test2 values (2,2213,245213,6)
    Expected result :
    I have two test case here with dealerID1 and dealerID 2 
    Result for DealerID1
    Result needed for DealerID2:
    the levels for dealers might change (Dealer1 has 4 levels, and Dealer 2 has 6 levels) so i need to create an dynamic sql query which lists each node as separate columns depending on the levels. 
    I have hacked the query to give the result I need 
    select a.dealerid,a.node as Lvl1,b.node as lvl2,c.node as lvl3,d.node as lvl4
    from #test2 a 
    join #test2 b on a.node=b.prntnode
    join #test2 c on b.node=c.prntnode
    join #test2 d on c.node=d.prntnode
    where a.dealerid=1 and a.dealerlvl=2
    select  a.dealerid,a.node asLvl1,
    b.node as lvl2,c.node as lvl3,d.node as lvl4,e.node as lvl5,f.node as lvl6--,a.dealerlvl,a.dealerid
    from #test2 a 
    join #test2 b on a.node=b.prntnode
    join #test2 c on b.node=c.prntnode
    join #test2 d on c.node=d.prntnode
    join #test2 e on d.node=e.prntnode
    join #test2 f on e.node=f.prntnode
    where a.dealerid=2 and a.dealerlvl=3
    I am sure there is a better way to do this with dynamic sql. please help.
    Thanks

    -- Dynamic PIVOT
     DECLARE @T AS TABLE(y INT NOT NULL PRIMARY KEY);
    DECLARE
       @cols AS NVARCHAR(MAX),
       @y    AS INT,
       @sql  AS NVARCHAR(MAX);
    -- Construct the column list for the IN clause
     SET @cols = STUFF(
       (SELECT N',' + QUOTENAME(y) AS [text()]
        FROM (SELECT DISTINCT dealerlvl AS y FROM dbo.test2) AS Y
        ORDER BY y
        FOR XML PATH('')),
       1, 1, N'');
    -- Construct the full T-SQL statement
     -- and execute dynamically
     SET @sql = N'SELECT *
     FROM (SELECT dealerid, dealerlvl, node
           FROM dbo.Test2) AS D
       PIVOT(MAX(node) FOR dealerlvl IN(' + @cols + N')) AS P;';
    EXEC sp_executesql @sql;
     GO

  • SQL question - please help!

    Hi,
    I am working on a SQL, please help ms with the question
    below .... thanks
    (1)Increase by 10% salary of these captain pilots who have
    traveled more than 800,000 miles.
    Routes | | Flights | |Pilots |
    | | | | |
    #routeID | | #flightNO | |#pilotID |
    depAirportID |        |  airplaneNO| |*name |
    arrAirportID |_______/|  pilotID |\___________|*hours_in_air|
    length       |       \|  routeID |/ |*grade |
    ______________| |_____________| |*salary |
    |____________|

    If the length column in routes is in hours, and it represents
    additional hours to those shown in hours_in_air in pilots, then
    the following should work:
    UPDATE pilots
    SET salary = salary * 1.1
    WHERE pilotid in (SELECT a.pilotid
    FROM pilots a,
         (SELECT b.pilotid,sum(c.length) new_hours
          FROM flights b, routes c
          WHERE b.routeid = c.routeid
          GROUP BY b.pilotid) d
    WHERE a.pilotid = d.pilotid and
          new_hours + hours_in_air >= 80000)I suspect that you probably need to add additional criteria to
    the sub-query from flights and routes to take into account only
    flights since the hours_in_air column from pilots was last
    updated. However, your table structures do not indicate any
    date sensitivity. If the table flights is emptied every time
    hours_in_air is updated, then the query above will work.

  • Some procedure can not run,Please help

    --Please Help me where is wrong
    --The Procedure can be compiler,but can not run
    --Maybe there has some wrong with Ref Cursor or dynamic SQL
    --Please,Thanks ver much
    --Follow is my full code
    Create or Replace package ref_types
    AS
    TYPE ref_cursor is REF CURSOR;
    End;
    Create or Replace package userinfo as
    procedure Get_usermenu (baduser out boolean,
    menu out ref_types.ref_cursor
    End;
    Create or Replace package body userinfo as
    procedure Get_usermenu (baduser out boolean,
    menu out ref_types.ref_cursor
    ) is
    v_sqltext varchar2(100);
    v_sql varchar2(300);
    begin
    baduser:=FALSE;
    v_sqltext:='''A001'',''A002'',''A003''';
    v_sql:='select MENUID,P_NAME from MENU_LIST
    where MENUID in (';
    v_sql:=v_sql||v_sqltext||) order by MENUID asc';
    --explain:Get v_sqktext values overpass some process
    open menu FOR v_sql;
    end;
    end;
    /

    thanks,
    error number is : Ora-01001
    I use it In Form:
    declare
    v_baduser boolean;
    v_menu ref_types.ref_cursor;
    v_menuid number;
    v_menuname varchar2(50);
    v_menucount number;
    begin
    v_menucount:=1;
    userinfo.Get_usermenu(v_baduser,v_menu);
    loop
    fetch v_menu into v_menuid,v_menuname;
    exit when v_menu%NOTFOUND;
    show_alert_info(v_menuid||';'||v_menucount||'、'||v_menuname);
    --show_alert_info,like Developer's Function "message",
    --It can show some text
    v_menucount:=v_menucount+1;
    end loop;
    Close v_menu;
    end;

  • Please help me to solve this date comparision issue..

    Please help me to solve this issue..
    If i have some data like the following..
    ID           START DATE             END DATE
    1             20080101              20080501
    1             20080502              20080630
    2             20080631              20080801
    2             20080802              20080901
                                                 ---------------> There is a break in date over here
    2             20080930              20081029
    2             20081030              20081130
    I need to compare the End Date with the start date (These data will not be in order)
    and find out if there is any break and should get the output date : *20080930*
    I am trying to do this in SQL or PL/SQL.Please help me .
    Thanks in advance.
    phani

    Hi Frank ,
    Sorry to bug you again. I ran your code on my actual data but not gettting the expected output.Here i am posting the actual code and the output that i got when i ran your code.Please bear with me and help me to solve this..
    /* Formatted on 5/25/2009 2:27:24 PM (QP5 v5.115.810.9015) */
    SELECT   member_nbr,
             aff_nbr,
             ymdeff,
             ymdend,
             gap_before,
             COUNT (gap_after)
                OVER (PARTITION BY member_nbr, aff_nbr ORDER BY ymdend DESC)
                AS gap_cnt
      FROM   (SELECT   member_nbr,
                       aff_nbr,
                       ymdeff,
                       ymdend,
                       CASE
                          WHEN ymdeff >
                                  LEAD(ymdend)
                                     OVER (PARTITION BY member_nbr, aff_nbr
                                           ORDER BY ymdend DESC)
                                  + 1
                          THEN
                             1
                       END
                          AS gap_before,
                       CASE
                          WHEN ymdend <
                                  LAG(ymdeff)
                                     OVER (PARTITION BY member_nbr, aff_nbr
                                           ORDER BY ymdend DESC)
                                  - 1
                          THEN
                             1
                       END
                          AS gap_after
    ------------I need this SQL to filter the whole data to the data that i posted in previous post -----
                FROM   (  SELECT   ms1.member_nbr, 
                                   ms1.aff_nbr,
                                   ms1.ymdeff,
                                   ms1.ymdend,
                                   ms1.void
                            FROM   (SELECT   ms.member_nbr,
                                             ms.aff_nbr,
                                             ms.ymdeff,
                                             ms.ymdend,
                                             ms.void
                                      FROM   MEMBER mb, member_span ms
                                     WHERE   mb.member_nbr = ms.member_nbr
                                             AND (20090523 BETWEEN ms.ymdeff
                                                               AND  ms.ymdend
                                                  AND TRIM (void) IS NULL)
                                             AND mb.member_nbr = 'A1000073000 ')
                                   eff_pcp,
                                   member_span ms1
                           WHERE   ms1.member_nbr = eff_pcp.member_nbr
                                   AND (SUBSTR (eff_pcp.aff_nbr, 1, 6) =
                                           SUBSTR (ms1.aff_nbr, 1, 6))
                        ORDER BY   ms1.ymdeff DESC)
    ---------- end of my part  ----------
                table_x) got_gaps;Outputs that i got when i ran that code for each individual members..
    Sorry to bug you frank and thanks for all the help.I will post here if i get any other data.
    Thanks
    phani

  • Column alias for spatial column within cursor loop using dynamic SQL

    The following PL/SQL is trying to generate an error report for records or objects which are 3 dimensional or above. I have no issue execute one statement in SQLPLUS but I need to use the column alias for the spatial column. But, it is a different story using PL/SQL and dynamic SQL Any help will be great because I've been working on this for than 8 hours but with no luck! Thanks.
    Here is the error I'm getting,
    stmt := 'select p.column_name.get_gtype(), id from '|| table_name p ' where p.column_name.get_gtype() > 2 ';
    ERROR at line 15:
    ORA-06550: line 15, column 79:
    PLS-00103: Encountered the symbol "P" when expecting one of the following:
    . ( * @ % & = - + ; < / > at in is mod remainder not rem
    <an exponent (**)> <> or != or ~= >= <= <> and or like LIKE2_
    LIKE4_ LIKEC_ between || member SUBMULTISET_
    The symbol "* was inserted before "P" to continue.
    and my PL/SQL is,
    set serveroutput on size 100000 feedback off
    declare
    rs integer;
    rs1 integer;
    cur integer;
    rp integer;
    trs integer;
    n integer;
    un varchar2(30);
    stmt varchar2(200);
    begin
    dbms_output.put_line(rpad('Table Name',40)||' Dimension');
    dbms_output.put_line(rpad('-',53,'-'));
    cur:= dbms_sql.open_cursor;
    for t in (select column_name,table_name from user_sdo_geom_metadata where regexp_like(table_name, '[^[A-B]_[AB]$'))
    loop
    stmt := 'select p.column_name.get_gtype(), id from '|| table_name p ' where p.column_name.get_gtype() > 2 ';
    dbms_sql.parse(cur, stmt, dbms_sql.native);
    dbms_sql.define_column(cur, 1, rs);
    dbms_sql.define_column(cur, 2, rs1);
    rp:= dbms_sql.execute(cur);
    n:=dbms_sql.fetch_rows(cur);
    dbms_sql.column_value(cur, 1, rs);
    dbms_sql.column_value(cur, 2, rs1);
    dbms_output.put_line(rpad(t.table_name,38,'.')||rpad(rs,15)||rpad(rs1,15));
    end loop;
    dbms_sql.close_cursor(cur);
    dbms_output.put_line(rpad('-',53,'-'));
    end;
    set serveroutput off feedback on feedback 6

    The following PL/SQL is trying to generate an error report for records or objects which are 3 dimensional or above. I have no issue execute one statement in SQLPLUS but I need to use the column alias for the spatial column. But, it is a different story using PL/SQL and dynamic SQL Any help will be great because I've been working on this for than 8 hours but with no luck! Thanks.
    Here is the error I'm getting,
    stmt := 'select p.column_name.get_gtype(), id from '|| table_name p ' where p.column_name.get_gtype() > 2 ';
    ERROR at line 15:
    ORA-06550: line 15, column 79:
    PLS-00103: Encountered the symbol "P" when expecting one of the following:
    . ( * @ % & = - + ; < / > at in is mod remainder not rem
    <an exponent (**)> <> or != or ~= >= <= <> and or like LIKE2_
    LIKE4_ LIKEC_ between || member SUBMULTISET_
    The symbol "* was inserted before "P" to continue.
    and my PL/SQL is,
    set serveroutput on size 100000 feedback off
    declare
    rs integer;
    rs1 integer;
    cur integer;
    rp integer;
    trs integer;
    n integer;
    un varchar2(30);
    stmt varchar2(200);
    begin
    dbms_output.put_line(rpad('Table Name',40)||' Dimension');
    dbms_output.put_line(rpad('-',53,'-'));
    cur:= dbms_sql.open_cursor;
    for t in (select column_name,table_name from user_sdo_geom_metadata where regexp_like(table_name, '[^[A-B]_[AB]$'))
    loop
    stmt := 'select p.column_name.get_gtype(), id from '|| table_name p ' where p.column_name.get_gtype() > 2 ';
    dbms_sql.parse(cur, stmt, dbms_sql.native);
    dbms_sql.define_column(cur, 1, rs);
    dbms_sql.define_column(cur, 2, rs1);
    rp:= dbms_sql.execute(cur);
    n:=dbms_sql.fetch_rows(cur);
    dbms_sql.column_value(cur, 1, rs);
    dbms_sql.column_value(cur, 2, rs1);
    dbms_output.put_line(rpad(t.table_name,38,'.')||rpad(rs,15)||rpad(rs1,15));
    end loop;
    dbms_sql.close_cursor(cur);
    dbms_output.put_line(rpad('-',53,'-'));
    end;
    set serveroutput off feedback on feedback 6

  • Dynamic sql in a trigger ...please help

    HI All,
    I've got a really large table called 'shop' of the form
    id number, product1_cost number, product2_cost number,product3_cost, product4_cost....and so on until product20_cost,
    product1_desc, product2_desc....and so so on until..product20_desc, active, start_date, end_date, usercreated,
    useramended.
    I have now created a new application. The new table is called 'products' which has an id, cost, description, oldproductid, shopid
    I need a trigger on the table shop so that if anyone uses the old application, it automatically creates the product rows in my new table 'products'
    Not all the product fields on the 'shop' table have data so I only want to migrate data if necessary.
    The trigger would do the following:
    1. Loop through all the products, if the product was updated and product number does not exist on 'products.oldproductid' then create a new record in products
    2. If product was updated and product number does exist then simply update the product details.
    I have got the trigger to work with product1. However, I'm finding it difficult to write some sort of dynamic sql that would
    do the same check on all 20 products without having to repeat the code 20 times.
    can someone help?
    CREATE OR REPLACE TRIGGER TR_PRODCOST
    AFTER UPDATE ON SHOP
    FOR EACH ROW
    DECLARE
    v_oldproductid products.oldpackageid%TYPE;
    v_datedl products.datedl%TYPE;
    v_product_sq number;
    v_status number := 1;
    v_cost number(11, 2);
    v_old_pkg number:= :old.product1_cost;
    v_new_pkg number:= :new.product1_cost;
    v_old_desc varchar2(100):= :old.product1_desc;
    v_new_desc varchar2(100):= :new.product1_desc;
    v_old_shop varchar2(10):= :old.shopid;
    v_new_shop varchar2(10):= :new.shopid;
    CURSOR get_newproduct_cur IS
    SELECT p.oldproductid, p.datedl
    FROM products p
    WHERE p.shopid = v_new_shop
    AND p.oldproductid = 1;
    BEGIN
    IF nvl(v_new_pkg, -1) <> nvl(v_old_pkg, -1) THEN
    OPEN get_newproduct_cur;
    FETCH get_newproduct_cur
    INTO v_oldproductid, v_datedl;
    IF get_newproduct_cur%NOTFOUND THEN
    v_oldproductid := null;
    v_datedl := null;
    END IF;
    CLOSE get_newproduct_cur;
    IF v_oldproductid is null THEN
    SELECT SEQ_products.nextval INTO v_product_sq FROM dual;
    INSERT into products p
    (product_ID,
    SHOPID,
    DESCRIPTION,
    COST,
    DATECR,
    USERCR,
    OLDproductID,
    SHORT_DESCRIPTION)
    VALUES
    (v_product_sq,
    v_new_shop,
    v_new_desc,
    v_new_pkg,
    sysdate,
    'OLFORMS',
    1,
    v_new_desc);
    ELSE
    IF v_new_pkg is null THEN
    UPDATE products p
    set p.datedl = sysdate,
    p.cost = 0.00
    WHERE p.shopid = v_new_shop
    AND p.oldproductid = 1;
    ELSE
    UPDATE products p
    set p.cost = v_new_pkg,
    p.datedl = null,
    WHERE p.shopid = v_new_shop
    AND p.oldproductid = 1;
    END IF;
    IF v_new_desc = v_old_desc THEN
    v_status := 1;
    ELSE
    UPDATE products p
    SET p.description = v_new_desc
    WHERE p.shopid = v_new_shop
    AND p.oldproductid = 1;
    END IF;
    END IF;
    ELSE
    END IF;
    END IF;
    END;

    Hi All,
    Thanks about your advice on the relational design. However, this is only a temporary fix. The old shop table was created about 10 years ago by someone else. Our users have to use the old pages for about 2-3 weeks and therefore I need a quick fix that will create the products on the new tables.
    The other problem I have is that another powerbuilder based applicated also uses the same tables and that application is being modified to use the new tables but not until another 3 weeks. To ensure both systems are available in parallel, I have to implement this temporary solution.
    B_Binoy, you seem you have a solution there but I didn't quite get it. I tried putting the whole pl/sql block in a string, replacing the '1' in product 1 using a variable x and then using execute immediate but because of the :new and :old bind variables, it kept giving me errors like 'variables not bound' etc. If you don't mind, please can you expand on your solution?
    Many Thanks

  • HELP IN DYNAMIC SQL....PLEASE HELP

    upd_str := upd_str||'total_prv_mth_amr = nvl(total_prv_mth_amr,0) '||'+ nvl('||p_upd_prev_mth||',0),';
    EXECUTE IMMEDIATE upd_str;
    IN THE ABOVE IAM GETTING VALUE ERROR BECAUSE total_prv_mth_amr IS A DATABASE NUMBER COLUMN WHERE AS P_upd_prev_mth IS A VARCHAR2 WHOSE VALUE IS GOT AT RUNTIME. i NEED TO ADD BOTH THESE TOGETHER. HOW DO I DO THAT ?? PLEASE HELP ME

    I don't think that's the problem. Oracle is quite capable of turning a varchar2 value into a number with a to_number(); it's called implicit conversion. ORA-1722: INVALID NUMBER most likely indicates that p_upd_prev_mth contains data that is not a valid numeric value e.g. letters, spaces, etc.
    This is why we should also design a databases so that numeric data is held in a NUMBER column.
    Cheers, APC

  • Dynamic sql giving error --please help

    Hi ,
    I have written the following code --
    CREATE OR REPLACE FUNCTION tabcount (
    tab IN VARCHAR2, field IN VARCHAR2 ,whr IN VARCHAR2)
    RETURN INTEGER
    IS
    retval INTEGER;
    BEGIN
    DBMS_OUTPUT.PUT_LINE ('whr' ||whr);
    DBMS_OUTPUT.PUT_LINE ('field1' ||field);
    EXECUTE IMMEDIATE
    ' SELECT COUNT(*) FROM ' || tab ||
    ' WHERE ' || field || 'like '/'%'||whr ||'%'/''
    INTO retval;
    DBMS_OUTPUT.PUT_LINE ('countis!' ||retVal);
    RETURN retval;
    END tabcount;
    It is giving the following error--
    ORA-00920: invalid relational operator
    ORA-06512: at "TABCOUNT", line 10
    ORA-06512: at line 2
    I am not sure how to enclose the like operator within the single quotes.Double quotes is not working for me.
    Thanx in advance,
    Ira

    Offhand, it looks like you may still have some syntax problems -- probably need a blank space before the WHERE --maybe some other stuff too.
    What you need to do to debug it is this (and this works just about anytime you are having trouble with dynamic SQL):
    1. store the sql statement in a variable.
    2. Use DBMS_OUTPUT to display your select statement BEFORE calling execute immediate.
    3. copy/paste that select into a separate window and run/debug it.
    4. Once you know what is wrong with that statement, go back and fix the code accordingly.
    Have fun,
    --scott                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           

  • Need help on Dynamic SQL Cursor in Forms

    Hi All,
    I am trying to execute Dynamic SQL Cursor in forms using EXEC_SQL built in.
    I have a cursor for example:
    'select * from supplier where supplier = '||p_supplier||' and processing_order = '||p_order
    My code is
    cur_num := Exec_SQL.Open_cursor;
    sql_order := 'select * from supplier where supplier = '||p_supplier||' and processing_order = '||p_order;
    EXEC_SQL.PARSE(cursor_number, sql_order);
      EXEC_SQL.DEFINE_COLUMN(cur_num ,1,ln_Supp_Id);
      EXEC_SQL.DEFINE_COLUMN(cur_num ,2,ls_Suppl_Name,30);
    EXEC_SQL.DEFINE_COLUMN(cur_num ,24,ls_exchange,20);
      sql_count := EXEC_SQL.EXECUTE(cur_num );
      While EXEC_SQL.FETCH_ROWS(cur_num ) > 0 Loop
            EXEC_SQL.COLUMN_VALUE(cur_num ,1,ln_Supp_Id);
            EXEC_SQL.COLUMN_VALUE(cur_num ,2,ls_Suppl_Name);
            EXEC_SQL.COLUMN_VALUE(cur_num ,24,ls_exchange);
    End Loop;
    EXEC_SQL.CLOSE_CURSOR(cur_num );
    In this case I have to write 24 Define Columns and 24 Column value. Is there any way to assign them to %rowtype at one time as I need all coulmn of the table.
    I had similar case on multiple tables.
    Please help me
    Thanks,
    Maddy

    I need this dynamic sql because p_supplier and p_order values changes at run time
    I do not understand. Is this a simplified sample or the real thing? You do know that you can pass variables to cursors:
    cursor test is
    select * from supplier where supplier = p_supplier and processing_order = p_order;
    or does e.g. p_supplier hold other parts of the query?
    cheers

  • Help Needed in Dynamic Sql or alternate to Dynamic Sql

    Hi Am working in sqlserver 2008 R2 and here is my Table structure and SPC
    ;create table SalaryReport(IdSalary int primary key identity(1,1),
    IDMainCompany int,IDSubCompany int,Salary money,Incentive int,NoofEmployees int, SalaryDate datetime, Creditscore int );
    insert into SalaryReport (IDMainCompany,IDSubCompany,Salary,Incentive,NoofEmployees,SalaryDate,Creditscore)
    ( Select 100 as IDMainCompany , 1000 as IDSubCompany ,200000 AS Salary, 20000 as Incentive, 500 as NoofEmployees,
    '2014-01-01' as SalaryDate, 60 as Creditscore union all
    Select 100 as IDMainCompany , 1001 as IDSubCompany ,300000 AS Salary, 40000 as Incentive, 600 as NoofEmployees,
    '2014-01-01' as SalaryDate , 70 as Creditscore union all
    Select 100 as IDMainCompany , 1002 as IDSubCompany ,400000 AS Salary, 40000 as Incentive, 1500 as NoofEmployees,
    '2014-01-01' as SalaryDate , 45 as Creditscore union all
    Select 101 as IDMainCompany , 1003 as IDSubCompany ,30000 AS Salary, 2000 as Incentive, 100 as NoofEmployees,
    '2014-01-01' as SalaryDate, 60 as Creditscore union all
    Select 102 as IDMainCompany , 1004 as IDSubCompany ,450000 AS Salary, 25000 as Incentive, 700 as NoofEmployees,
    '2014-01-01' as SalaryDate, 30 as Creditscore)
    Sample Test Script:
    DECLARE @IDMainCompany int = 100;
    DECLARE @Process_Date datetime = '2014-01-01';
    declare @Query nvarchar(max);
    SELECT
    CAST(SR.IDMainCompany AS VARCHAR(12)) AS IDMainCompany
    ,CAST(SR.IDSubCompany AS VARCHAR(12)) AS IDSubCompany
    ,CAST(SR.Salary AS VARCHAR(12)) AS Salary
    ,CAST(SR.Incentive AS VARCHAR(12)) AS Incentive
    ,CAST(SR.NoofEmployees AS VARCHAR(12)) AS NoofEmployees
    ,CAST(SR.SalaryDate AS VARCHAR(15)) AS SalaryDate
    ,CAST((SR.Creditscore) AS VARCHAR(15)) AS average
    FROM SalaryReport SR
    WHERE SR.IDMainCompany = @IDMainCompany
    AND DATEPART(MM, SR.SalaryDate) = DATEPART(MM, @Process_Date)
    UNION ALL
    SELECT
    '' AS IDMainCompany
    ,'' AS IDSubCompany
    ,'Total: ' + CAST(SUM(SR.Salary) AS VARCHAR(12)) AS Salary
    ,'Total: ' + CAST(SUM(SR.Incentive) AS VARCHAR(12)) AS Incentive
    ,'Total: ' + CAST(SUM(SR.NoofEmployees) AS VARCHAR(12)) AS NoofEmployees
    ,'' AS SalaryDate
    ,'Total: ' +CAST(avg(SR.Creditscore) AS VARCHAR(12)) AS Totalaverage
    FROM SalaryReport SR
    WHERE SR.IDMainCompany = @IDMainCompany
    AND DATEPART(MM, SR.SalaryDate) = DATEPART(MM, @Process_Date)
    group by IDMainCompany, DATEPART(MM, SalaryDate)
    the sample data i posted is having less columns. actually i have 20 columns in the select list. Also the parameters to the where condition i gave two i.e IDMainCompany, SalaryDate. I will also need to use IDSubCompany for some case. My skeleton will be 
    Create Procedure Test(@IDMainCompany int, @IDSubCompany int = null, @SalaryDate datetime)
    as
    BEGIN
    IF(@IDMainCompany is not null && @IDMainCompany > 0 && @SalaryDate is not null && @SalaryDate <> ' ' &&
    @IDSubCompany is null)
    BEGIN
    --The logic what discussed on previous posts will falls here with @IDMainCompany, @SalaryDate as parameter to the where condition
    END
    IF(@IDMainCompany is not null && @IDMainCompany > 0 && @SalaryDate is not null && @SalaryDate <> ' ' &&
    @IDSubCompany is null && @IDSubCompany > 0 )
    BEGIN
    --The logic what discussed on previous posts will falls here with @IDMainCompany, @SalaryDate,@IDSubCompany as parameter to the where condition
    END
    END
    As said i need to include 20 columns in the select list and as union all used on the previous sample there are 20 columns on the first query and 20 columns on the second query after the union all. The SPC will become big. If i repeat this for second if condition,
    it will be too big. How can i reduce this writing more lines.
    I am aware of the concept dynamic sql. Is there any other way to do this? or if dynamic sql is the only option, can anyone help me rewriting this select statements as dynamic sql
    Could anyone please assist me 
    loving dotnet

    >>
    thanks for your reply and yes, i am invoking this from my asp.net application using C# language.  Would you like to share something?
    <<
    Yes,
    You can use client side dynamic sql. I'm not talking about concatenating strings. I'm talking about using Runtime Text Tamplates (preprocesed templates in Visual Studio 2010).
    Add a new "Runtime Text Template" item to your VS project. Be "MyReportTemplate.tt" the file name of the runtime text template.  The content of this file should be something like the following:
    <#@ template language="C#" #>
    <#@ assembly name="System.Core" #>
    SELECT
    -- part of your query goes here
    -- the interesting part come next
    FROM
    SalaryReport SR
    WHERE
    SR.IDMainCompany = @IDMainCompany
    <# if (IDSubCompany.HasValue && IDSubCompany.Value > 0) { #>
    AND SR.IDSubCompany = @IDSubCompany
    <# } #>
    AND
    DATEPART(MM, SR.SalaryDate) = DATEPART(MM, @Process_Date)
    GROUP BY
    IDMainCompany, DATEPART(MM, SalaryDate)
    Add a new c# code file named MyReportTemplate.partial.cs closed to MyReportTemplate.tt with the following code:
    public partial class MyReportTemplate
    public int? IDSubCompany { get; set; }
    Then, to execute the query you can write a code similar to the following:
    public DataTable ExecuteReport(int mainCompanyId, int? subCompanyId, DateTime processDate )
    using (var cn = CreateConnection())
    using (var cmd = new SqlCommand())
    using (var adapter = new SqlDataAdapter(cmd))
    cmd.Connection = cn;
    var template = new MyReportTemplate
    IDSubCompany = subCompanyId
    cmd.CommandText = template.TransformText();
    cmd.Parameters.AddWithValue("@IDSubCompany", subCompanyId == null ? (object) DBNull.Value : subCompanyId.Value);
    cmd.Parameters.AddWithValue("@IDMainCompany", mainCompanyId);
    cmd.Parameters.AddWithValue("@Process_Date", processDate);
    var table = new DataTable();
    adapter.Fill(table);
    return table;
    EntityLite: A Lightweight, Database First, Micro ORM

Maybe you are looking for

  • Retropay by element run Errors for one employee

    When i am running retropay for 3711 employees one of them errors out and the retropay by element process ends as Incomplete. The following is the error for the assignment: Error ORA-01427: single-row subquery returns more than one row has occurred in

  • This operation can't be completed because the item is in use.

    I have been researching this for months and no one seems to have an answer, lots of discussions but never a result. 1 - I have a MacBook Pro running Lion (I tried it with Leopard too) 2 - I have an external Iomega raid drive which is being used as a

  • MP3 will not add in itunes

    I have a mp3 file that when I add into itunes, it doesn't add or give an error message, but, plays fine in quicktime. The file format is MPEG Layer 3 stereo 44.100 kHz with a data rate of 125.86 kbits/sec and 2 channel stereo.

  • When Requested for a Grand Total the column values changes to zeroes

    Hi, I have a report with 2 dimensions and 4 facts. The report is showing the correct data when compared with EBS, but when we are applying grand total in Table View then for fact values are displaying zeroes. However the grand total is correct but fo

  • Indexes on Index Organized Table

    I remember seeing a note regarding problems in using indexs on index organized tables. Of course, the index would be something other than the one implied in the table definition. I can't seem to remember what the problem was. Has anyone used indexes