Inserting comma seperated values

I created a stored procedure that creates an order_id. Using this id, the products and their pricetag are inserted. Hereafter the garnishes are inserted for each product.
Creating an order id and inserting the products and their pricetag are working. The problem is at the inserting of garnishes. 
The data is received by parameters, and I have also created a user defined type: where garnishId holds the comma seperated ids.
CREATE TYPE [dbo].[ppg] AS TABLE(
[ProductId] [int] NULL,
[PriceId] [int] NULL,
[garnishId] [VARCHAR](MAX) NULL
this is the stored procedure:
ALTER PROCEDURE [dbo].[sp_create_order]
(@userId uniqueidentifier, @productPriceGarnishes dbo.ppg READONLY, @comment varchar(250))
AS
BEGIN
DECLARE @orderId int
DECLARE @orderDetailId int
INSERT INTO orders (user_id, confirmed,comment) values(@userId,0,@comment);
--Select last inserted PK
SELECT @orderId=SCOPE_IDENTITY()
-- insert products and price tag using @orderId
INSERT INTO order_detail (order_id, product_id,price_id)
SELECT @orderId, p.ProductId,
p.PriceId
FROM @productPriceGarnishes p
SELECT @orderDetailId=SCOPE_IDENTITY()
-- insert garnishes using the orderDetailId
INSERT INTO order_detail_garnish (order_detail_id,garnish_id)
SELECT @orderDetailId, (SELECT * FROM SplitDelimiterString(p.garnishId))
FROM @productPriceGarnishes p
END
RETURN @orderId
I found a function that splits the string by a delimiter in this website:
http://www.codeproject.com/Tips/586395/Split-comma-separated-IDs-to-ge
Where you can retrieve the ids by this query:
(SELECT * FROM SplitDelimiterString(p.garnishId)
The problem is that I don't know how to add these ids with their corresponding orderDetailId, after each product is added.

Unfortunately it appears you assume too much.  Presumably the reason you chose to define @productPriceGarnishes as a table is to support the creation of multiple rows. And you use these rows to insert into the order_detail table which has an identity
column as the primary key (again, presumably).  So the question then becomes how do you get the identity values for ALL of the inserted rows?  You can't do that with SCOPE_IDENTITY - your code currently is designed with the assumption that there
is only one row to be inserted.  To work around that limitation you need to use the output clause (examples can be found by searching). 
Next comes another problem.  How do you know which identity value is assigned to which row of your table variable during the insert?  You need some sort of natural key to associate the inserted rows with the rows in the table variable.  Do
you have one?  Before you think you do, you need to think about what restrictions are placed on the content of the table variable (if any).  Is it possible to have multiple rows with the same values for ProductId and PriceId?  Do not assume
- you need to be certain that this is or is not a possibility.
Assuming that the rows are unique (which simplifies things greatly), you associate the inserted order_detail rows to the table variable via something like:
select ... from @ins_detail as ins inner join @productPriceGarnishes as ppg
on ins.ProductId = ppg.ProductId and ins.PriceId = ppg.PriceId
Note that @ins_detail is a table variable that you would declare and populate via the output clause. It will contain the identity values for each row that you inserted.  With that, you can then generate the rows that you need to insert into the garnish
table by applying the results of your splitter function.  Which is a step that I'll skip for now since you have much reading and work to do. 
Now some last comments.  I am suspicious of a column named PriceId.  That is not a good sign - price is an attribute of something and not the basis of a relationship between tables.  The use of identity columns (especially as primary keys)
can be a problem - and this is one good example.  Based on what I've just written and its assumptions, the natural key for order_detail is (order_id, product_id, price_id) - why do you need an identity column?  Again, searching will find past
discussions about identity columns and their usage.

Similar Messages

  • Inserting comma seperated values into table

    Hi,
    There is a variable like this,
    var= 'C0001,C0002,C0003';
    I want c0001 c0002 and c0003 to get inserted into some temp table as seperate rows, how do I do that.
    Thnx again ur your response.

    Hi,
    There is a variable like this,
    var= 'C0001,C0002,C0003';
    I want c0001 c0002 and c0003 to get inserted into some temp table as seperate rows, how do I do that.
    Thnx again ur your response.

  • Have a column which is having comma seperated values.. and i am trying to s

    Have a column which is having comma seperated values.. and i am trying to seperate it.
    I am trying to create a stored procedure ..Version 11g xe. .and apex version 4..
    Here is the part of code..I cant make a procedure. .cause my statement consist with clause..
    create or replace procedure ins_adv_invoice
    (mmagazine_no number,madvtno number,missueno number,msection varchar2,mpagenumber varchar2,msalesman_code varchar2)
    is
    cursor cx is with testa as
    (select pagenumber name from advertiser)
    select regexp_substr(pagenumber, '[^,]+', 1, rownum) result
    from advertiser
    connect by level <= length(regexp_replace(pagenumber, '[^,]+')) + 1
    where advt_no = madvtno;
    begin
    for xxx in cx
    loop
    insert into adv_invoice (magazine_no,advtno,adissue,section,page_number,salesman_code)
    values (mmagazine_no,madvtno,missueno,msection,xxx.result,msalesman_code);
    end loop;
    end;
    But when i run this .. it doesnt create procedure. .I get he following error..
    LINE/COL ERROR
    5/14 PL/SQL: SQL Statement ignored
    9/69 PL/SQL: ORA-00933: SQL command not properly ended
    SQL>
    Still not able to figure it out..Can any one help..
    Thanks

    Change the query to swap the last two lines:
    cursor cx is with testa as
    (select pagenumber name from advertiser)
    select regexp_substr(pagenumber, '[^,]+', 1, rownum) result
    from advertiser
    where advt_no = madvtno
    connect by level <= length(regexp_replace(pagenumber, '[^,]+')) + 1;
    ...

  • How to store Comma Seperated Value in a File with Jsp

    Hai friends,
    I need to get all the filed values like Empname,salary ,location..........
    and at the end of jsp page i have to put a browse button when i choose a file using theis browse button the total content in the form shoud store in that file as comma seperated values.

    1. Create JSP
    2. When you click the button call the event that saves the data in CSV format
    Your question is so broad, I don't have exact answer for you.
    What have you done so far?
    The man with blues.

  • How to query the comma seperated values stored in Database

    Hi,
    I have a strange scenario, I am storing the specific data as a comma seperated value in the database. I want to query the DB with the comma seperated value as a Bind variable against the comma seperated value stored in DB.
    For eg : The data stored in DB has
    Row1 - > 1,2,3,4,5,6,7,8
    Row2 - > 4,5,6,7,8,9,10
    When I pas the Bind variable as '4,8' I should get Row1 and Row2 .
    Quick help his highly appreciated.. Thanks in Advance

    Oh, and if you actually wanted the data returned rather than just the row primary keys....
    SQL> ed
    Wrote file afiedt.buf
      1  with t as (select 1 as rw, '1,2,3,4,5,6,7,8' as txt from dual union all
      2             select 2, '4,5,6,7,8,9,10' from dual union all
      3             select 3, '1,6,7,9' from dual)
      4  -- end of test data
      5      ,r as (select '4,8' as req from dual)
      6  -- end of required data
      7      ,split_t as (select rw, regexp_substr(txt, '[^,]+', 1, rn) as val
      8                   from t, (select rownum rn from dual connect by rownum <= (select max(length(regexp_replace(t.txt, '[^,]'))+1) from t))
      9                   where regexp_substr(txt, '[^,]+', 1, rn) is not null
    10                  )
    11      ,split_r as (select regexp_substr(req, '[^,]+', 1, rownum) as val
    12                   from r
    13                   connect by rownum <= length(regexp_replace(req, '[^,]'))+1
    14                  )
    15  --
    16  select distinct t.rw, t.txt
    17  from   split_t st join split_r sr on (st.val = sr.val)
    18                    join t on (t.rw = st.rw)
    19* order by 1
    SQL> /
            RW TXT
             1 1,2,3,4,5,6,7,8
             2 4,5,6,7,8,9,10
    SQL>

  • Insert comma seperator in a currency

    Hello All,
    I need to condense an amount.So i am assigning it to a char value and condensing it.As I am assigning it to a char value,the thousand seperator (i.e ',' ) is removed from the value.I want that back.
    Here is the sample code am using ...
    data : rwbtr type reguh-rwbtr ,
           value type string .
    rwbtr = 1000.
    value = rwbtr .
    condense value no-gaps.
    write / rwbtr .
    write / value  .
    What next i need to do so that i will get a condensed comma seperated value.
    Thanks,
    nsp .

    Use WRITE rwbtr TO value CURRENCY <your currency>.
    Regards,
    John.

  • ODI:  Loading Comma Seperated Value Flat files...

    We are attempting to load our flatfiles using the LKM File to Oracle (SQLLDR)...
    First something that is goofy is that the SQLLDR appears to be looking for a .dat file instead of the flatfile we have given it. Our flatfiles do not have any extentions on them (ex. mmi_prem_fin, mmi_agent_contact, etc...) Is SQLLDR looking for a flatfile with an extention and if not finding one looking for a .dat file extention? Anyone run into this?
    Second, after we get past that first problem then the scond one that creeps up is the SQLLDR appears to be bringing in the information into the source table without excluding the quotes around the field information. We specified that the flatfile is comma delimited and text is seperated by dbl quotes.
    Any and all help will be apprecaited... Thank you in advance...
    Tom Cusick

    JUPS wrote:
    Hi,
    I am facing trouble in inserting comma separated list in form of single string like:
    Year = '2009,2010,2011,2012'
    Now i need to push each value into a VARRAY, can anyone help me on this.
    Thanks,
    SreekanthLOOP
    Handle:      JUPS
    Status Level:      Newbie
    Registered:      Aug 6, 2008
    Total Posts:      201
    Total Questions:      98 (59 unresolved)
    so many questions & so few answers.
    how sad!
    Edited by: sb92075 on Sep 13, 2011 10:20 AM

  • How to convert string containing comma seperated values to an array

    my requirement is i have to first convert an comma seperated string to an array
    after that i have to pass the array values to a for loop
    eg:i have a string str=(456,457,487,465,478)
    These values i have to put in an array.
    i then i have to pass the array values to a for loop

    We understand your ¿homeworks? We are helping you, but it seems like you want us to do it.
    Try it yourself with some of the instructions.
    Anyway if there aren´t homeworks, use dinamyc sql:
    declare
    varray := '(45,65,12,4)';
    begin
    execute immediate 'update table set ss=''uu'' where id in ' || varray;
    end;

  • Cut comma seperated value

    Can you pls help me on this
    table: emp_master
    Ename     Bonus(%)
    abc     15,5,20,10,40,10
    xyz     10,10,20,60
    table emp_sal
    Ename     Var
    abc     1000
    xyz     2000
    output result :
    Ename     Var
    abc     150(15 % X 1000)(15 is the first value from the comma seperated list in emp_master table)
    abc     50  ( 5 % X 1000) (5 is the second value from the comma seperated list in emp_master table)
    abc     200 (20 % X 1000)
    abc     100
    abc     400
    abc     100
    xyz     200
    xyz     200
    xyz     400
    xyz     1200Thanks in advance
    Edited by: user12093849 on Feb 3, 2010 12:34 AM

    Assuming you're on at least database version 10G:
    SQL> -- generating sample data:
    SQL> with emp_master as ( select 'abc' ename, '15,5,20,10,40,10' bonus from dual union all
      2                       select 'xyz', '10,10,20,60' from dual
      3                     )
      4  ,    emp_sal as ( select 'abc' ename, 1000 var from dual union all
      5                    select 'xyz', 2000 from dual
      6                  )
      7  --
      8  -- actual query:
      9  --
    10  select m.ename
    11  ,      m.bonus
    12  ,      s.var*m.bonus
    13  from  ( select a.ename
    14          ,      level lvl
    15          ,      regexp_substr (bonus, '[^,]+', 1, level)/100 bonus
    16          from   emp_master a
    17          connect by level <= length(regexp_replace(bonus,'[^,]*'))+1
    18          group by ename, bonus, level
    19         ) m
    20  ,      emp_sal s
    21  where  s.ename=m.ename      
    22  order by m.ename, m.lvl
    23  /
    ENA      BONUS S.VAR*M.BONUS
    abc        ,15           150
    abc        ,05            50
    abc         ,2           200
    abc         ,1           100
    abc         ,4           400
    abc         ,1           100
    xyz         ,1           200
    xyz         ,1           200
    xyz         ,2           400
    xyz         ,6          1200
    10 rows selected.

  • Converting the comma seperator value  format

    i am getting the content of a table in a internal table with comma separator value format, dynamically by using dfies table i am getting the header of the table, and displaying it in the output, now my query is that the content of the data which i am getting in a itab having only one field of type string
    data : begin of itab occurs 0,
              data1 type string,
             end of itab.
    some where they were concatenating the content of the data and storing it inthe itab, now i want the content of the itab should be displayed corresponding to there header in the output

    Hi Santosh,
    You can remove the commas from the record by using the REPLACE command as below -
    LOOP AT itab.
      DO.
        REPLACE ',' WITH '' INTO itab-data1.
        IF sy-subrc NE 0.
          EXIT.
        ENDIF.
      ENDDO.
    ENDLOOP.
    Reward points if found useful...!
    Cheers
    Abhishek

  • Column should display comma seperated value.

    Hi All,
    Iam working on Reports6i.
    In my data model i have a query which gives some product names(only one column), i need to display those product names with a comma seperator.
    Just like Product1,Product2,....
    Can anybody guide me as this is very urgent.
    Thanks in Advance
    Chinni.

    something like this ?
    WITH DATA AS (SELECT 'X' product,1 order_id FROM DUAL
                  UNION ALL
                  SELECT 'Y' product,1 order_id FROM DUAL
                  UNION ALL
                  SELECT 'Z' product,1 order_id FROM DUAL
                  UNION ALL
                  SELECT 'XX' product,2 order_id FROM DUAL
                  UNION ALL
                  SELECT 'YY' product,2 order_id FROM DUAL
                  UNION ALL
                  SELECT 'ZZ' product,2 order_id FROM DUAL
    SELECT LTRIM(sys_connect_by_path(product,','), ',') PRODUCTS
      FROM (SELECT product,
                   order_id,
                   row_number()   OVER (partition by order_id order by product) RN,
                   count(product) OVER (partition by order_id) MAXROW
              FROM data) 
    WHERE RN=MAXROW CONNECT BY     PRIOR RN+1=RN
                                AND PRIOR ORDER_ID=ORDER_ID START WITH RN=1

  • Mapping a column with comma seperated values

    Hi,
    I have two tables
    1. Tasks (task_id, task_description)
    2. Task_assignment (username, task_assignment_value)
    the task_assignment_value has a comma seperated list of task_ids.
    What is the best ways to map the tables ?
    Thanks in advance.
    Moinuddin Mohammed

    I have a couple of attributes where I do this. From TopLink's perspective, I just map it as a String. Then, in my accessors for the attribute, I transform the primitive between the String and an Array or however the rest of the app wants to see the attribute.
    Here's an example that's actually more complicated than absolutely necessary. The mapped attributed is indicatorValueListString. It is lazily converted to an Array of Enums when it is first accessed. And it is converted back to a String in the preWriteEventCallback that is mapped in the TopLink descriptor.
    This implementation attempts to minimize the number of times the String<->Array conversion takes place, but if that's not a concern, it could be made much more simple. Also, at my company we privately manage collections with the Collection classes for dynamic allocation, but publicly exchange Arrays for type-safety. This could also be factored out. ValuedEnumUtils basically manages asking the enum for its delimiter and performing the actual conversion between a String and an Array or back.
    private String indicatorValueListString;
    private List indicatorValueSelections;
    private List indicatorValueSelections() {
            if (indicatorValueSelections == null) {
                    indicatorValueSelections = new ArrayList();
                    if (indicatorValueListString != null) {
                            indicatorValueSelections =
                                    java.util.Arrays.asList(ValuedEnumUtils.decodeEnumString(
                                         IndicatorValueEnum.class,indicatorValueListString));
            return indicatorValueSelections;
    private void indicatorValueSelections(List newIndicatorValueSelections) {
            indicatorValueSelections = newIndicatorValueSelections;
    public IndicatorValueEnum[] getIndicatorValueSelections() {
            return (IndicatorValueEnum[])indicatorValueSelections().toArray(new IndicatorValueEnum[0]);
    public void setIndicatorValueSelections(IndicatorValueEnum[] newIvSelections) {
            indicatorValueSelections(java.util.Arrays.asList(newIvSelections));
    public boolean addIndicatorValueSelection(IndicatorValueEnum anIvEnum) {
            return indicatorValueSelections().add(anIvEnum);
    public boolean removeIndicatorValueSelection(IndicatorValueEnum anIvEnum) {
            return indicatorValueSelections().remove(anIvEnum);
    public void preWriteEventCallback(DescriptorEvent aDescriptorEvent) {
            // Note: Not using accessor to avoid lazy initialization if no changes
            // are necessary.
            if (indicatorValueSelections != null) {
                    indicatorValueListString =
                            ValuedEnumUtils.encodeEnumString((ValuedEnum[])indicatorValueSelections.toArray());
    }

  • Operations on comma seperated values..

    Hi all,
    We have some histogramic values which are kept in one column and from time to time we need to propagate them in order to fill the history tables like :
    table_1
    c1 -- c2 -- c3
    a -- 1,1,1--11
    a -- 2,2,2--11
    a -- 3,3,3--11
    b -- 4,4,4--22
    b -- 5,5,5-22
    c -- 6,6,6-22
    select c1,sum???(c2),sum(c3) from table_1 group by c1;
    c1 -- sum???(c2) -- sum(c3)
    a -- 6,6,6--33
    b -- 15,15,15--66
    The point is to do the operations seperaterly with the first value, second value,... seperately.
    Any ideas about this ?
    Thanks,
    Evren

    Hi, Evren,
    Welcome to the forum!
    Whenever you have a problem, it helps if you post your sample data in some form that people can use to actually re-create it.
    CREATE TABLE and INSERT statements are great. for example:
    CREATE TABLE     table_1
    (      c1     VARCHAR2 (5)
    ,      c2     VARCHAR2 (20)
    ,      c3     NUMBER
    INSERT INTO table_1 (c1, c2, c3) VALUES ('a', '1,1,1', 11);
    INSERT INTO table_1 (c1, c2, c3) VALUES ('a', '2,2,2', 11);
    INSERT INTO table_1 (c1, c2, c3) VALUES ('a', '3,3,3', 11);
    INSERT INTO table_1 (c1, c2, c3) VALUES ('b', '4,4,4', 22);
    INSERT INTO table_1 (c1, c2, c3) VALUES ('b', '5,5,5', 22);
    INSERT INTO table_1 (c1, c2, c3) VALUES ('c', '6,6,6', 22);That's not a very good design. If the items in c2 are separate entities, they should be in separate columns (or maybe on sepaarte rows, in a separate table, with a one-to-many relationship to table_1).
    If you can't change the table structure permanently (which is the best solution), then you'll have to generate a result set that mimics that (more or less) every time you need to use that column as separate entities.
    [This thread|http://forums.oracle.com/forums/thread.jspa?threadID=945432&tstart=0] shows how to split a delimited list into parts.
    After you've calculated the individual totals, use the || operator to cram them back into one column, if necessary.
    For example:
    SELECT       c1
    ,       SUM (TO_NUMBER (REGEXP_SUBSTR (c2, '[^,]+', 1, 1))) || ',' ||
           SUM (TO_NUMBER (REGEXP_SUBSTR (c2, '[^,]+', 1, 2))) || ',' ||
           SUM (TO_NUMBER (REGEXP_SUBSTR (c2, '[^,]+', 1, 3)))          AS sum_c2
    ,       SUM (c3)                                                     AS sum_c3
    FROM       table_1
    GROUP BY  c1
    [email protected] wrote:Hi all,
    We have some histogramic values which are kept in one column and from time to time we need to propagate them in order to fill the history tables like :
    table_1
    c1 -- c2 -- c3
    a -- 1,1,1--11
    a -- 2,2,2--11
    a -- 3,3,3--11
    b -- 4,4,4--22
    b -- 5,5,5-22
    c -- 6,6,6-22
    select c1,sum???(c2),sum(c3) from table_1 group by c1;
    c1 -- sum???(c2) -- sum(c3)
    a -- 6,6,6--33
    b -- 15,15,15--66Are you sure that's the output you want from the data you gave?
    When I run the query above with the same data, I get:
    C1    SUM_C2                   SUM_C3
    a     6,6,6                        33
    b     9,9,9                        44
    c     6,6,6                        22

  • How to insert comma delimited values into a table

    I have a variable holding values like,
    'A,Ba,Ccc' OR
    '1,2,3,4'
    I want to know how to convert and insert these values in oracle table as seperate rows like,
    A
    Ba
    Ccc[ OR ]
    1
    2
    3
    4
    Thanks,
    Previn

    Answered (I guess) in this dbms_utility.comma_to_table.
    Cheers, the ever helpful APC

  • Passing Multiple comma seperated values to a report

    Hi,
    I have a form that a user can select multiple customer ids by checking the check box. I need to pass these values to report to be used in the IN clause of query. eg.
    select a, b, c
    from test
    where a in ('01', '03', ...)
    how can i do that
    Faisal

    Hi Faisal
    I've used the solution discussed here and works fine.
    http://asktom.oracle.com/pls/ask/f?p=4950:8:::::F4950_P8_DISPLAYID:110612348061
    Regards.
    Cecilio

Maybe you are looking for

  • BAPI BAPI_ALM_ORDER_MAINTAIN is not updating data

    Hi Experts, i am facing a problem in using 'BAPI_ALM_ORDER_MAINTAIN' objective is to use this FM for inserting an operation activity or updating description of exisitng operation for one of service order. at the end of execution it does not give any

  • User can't be found in SU01. However he does exist and can be found in SU10

    Hello SAP friends, I have a strange problem here. There's one user in our SAP system who's can't be found in TA su01search list, when searching "*" with F4. The user IS active, was logged just yesterday, it seems as his account has everything set OK.

  • 802.1x WLC 2504.

    Hey guys, I'm going to be configured Local PEAP on the WLC. I just had a quick question. When a user puts in a login/password to access the network, can it be the same login/password for everyone in an area, or does it have to be a unique login/passw

  • Installation Workspace with FM issuse

    hi all, i installed hyperion financial management with oracle. while configuring with financial management all the option are getting sucess as well as for workspace. classic planning application tab does not visible in workspace when launching works

  • Can't get rid of the JTable's white column divider

    I want a JTable that has no grid lines and no space between cells, with or with out headers. Basicly all cells should butt against each other with no grid lines. So far I have succeeded with this, with a exception to some white divider that is about