Procedure to insert a new row with data, but no PK

Ok,
I have an assignment to insert a row into an existing table and to insert values (via a procedure) into certain fields. However, none of the fields that are to be INSERTED upon are the PK field.
I wrote the following for a start, and I get an error since I have NULL in the PK field. The PK is named PRODUCTID. I am only to insert p_name, p_description, p_imgname, p_cost, and p_status. I am in school now, and am a beginner at PL/SQL, and any help would be appreciated.
How can I do this without assigning a value to the PK field?
For reference: there are 10 rows in the table, and the one I'm inserting is row 11.
CREATE OR REPLACE PROCEDURE prod_add_sp
   (p_name IN bb_product.productname%type,
    p_description IN bb_product.description%type,
    p_imgname IN bb_product.productimage%type,
    p_cost IN bb_product.price%type,
    p_status IN bb_product.active%type)
   IS
  BEGIN
    INSERT INTO bb_product (idproduct, productname, description, productimage, price, active)
     VALUES (lv_prodid_num, p_name, p_description, p_imgname, p_cost, p_status);
END;
/

> Ok, since the table had 10 rows (PK was numbers 1-10, I added number 11 in the PK field for the
corresponding row.
Any other way to do this?
You want to use a number generator to give you a unique number to use as PRODUCT_ID. Such a generator is known as a sequence in Oracle. Like your products table, it needs to be created up front.
E.g.
create sequence product_id_sequence start with 1 increment by 1 nocycle nomaxvalue;
Note that several "copies" of this sequence can be active at the same time to serve a number of concurrent requests. In other words, instead of everyone to queue to get a number from the sequence generator, it creates for example 10 queues and is able to service 10 requests at the same time. This is great for scalability and not creating a bottleneck. At the same time, the numbers handed out are unique but not in a gap free ascending sequence either. Which is fine. Relational design says that we need a UNIQUE number for a surrogate key. Not a gap free ascending number range.
Okay, in your INSERT statement you need to add the PK column and add the next sequence value into it, e.g.
INSERT INTO products ( product_id, .... ) VALUES( product_id_sequence.nextval, ... );
Refer to the documentation URLs posted above on sequences for more details.

Similar Messages

  • Query regarding inserting a new row at first row data table

    hi all,
    I have a doubt regarding the insertion of new row in data table.I am now using the following code
    if (skillDataProvider.canAppendRow()){
    RowKey rowkey = skillDataProvider.appendRow();
    skillDataProvider.setCursorRow(rowkey);
    String skillID=getSkilID();
    skillDataProvider.setValue("Skill.SkillID", rowkey, skillID);
    int rowID=Integer.parseInt(rowkey.getRowId());
    tableRowGroup1.setFirst(rowID);
    Its working fine.But this code gives me provision to add the data at the last of the table.I need it to be at the first row.I tried
    RowKey rowkey=skillDataProvider.insertRow(skillDataProvider.getRowKey(String.valueOf(0)));
    but it shows some null pointer exception.Can anyone help me?
    Thanks in advance
    Sree

    I think AChervov has the right idea here.
    CachedRowSetDataProvider.canInsertRow(beforeRow) returns false, so you cannot insertRow().
    Therefore, you'll need to control the sort order yourself. I'd add a sort field to the database. Then use TableRowGroup.setSortCrtieria() to control the table display order. Or commit the append to the database immediately and reselect (refresh) the provider (assuming the provider has the desired "order by").

  • Textarea - space when inserting a new row !!!

    when I insert a new row with the editcurrent record, I get a space in each textarea.
    I don't understand why you write this like:...
    if(obj == null)
    sText = createMultilineTextField(sAttribute , " ");
    else
    The Db now contain a space caracter.
    Jean-Nokl WALLEZ
    [email protected]

    Hi, your code is right. So, replaces your blank space by the character 255 (ALT+255) and the blank space will be shown in your table.
    if(obj == null)
    sText = createMultilineTextField(sAttribute , " ");
    else
    Pakitwo.

  • Update statement inserts a new row instead of updating

    My code should just update a single specific row in the table. I used a simple procedure to update a record in the current application as well and it runs without any problem except this case. Every time the query runs, it actually inserts a new row instead
    of just updating an existing:
    So here is my c# code:
    try
    command.Parameters.Clear();
    command.Parameters.AddRange(vars);
    command.CommandText = "Update" + tableName;
    conn.Open();
    command.ExecuteNonQuery();
    conn.Close();
    this.GetData(tableName);
    catch
    throw;
    And here is my SQL code (please ingore 'Alter Procedure' statement, I just wanted to get the core script of the procedure):
    ALTER procedure [dbo].[UpdateExpenditureItems]
    (@ID int,
    @Name nvarchar(50),
    @IsGroup bit,
    @Parent nvarchar(50),
    @Description nvarchar(50)
    AS
    Begin
    --a new inserted row seems to be a result of running IF statement rather than ELSE
    if @Parent is not null
    begin
    declare @ParentID int
    set @ParentID = (select ID from ExpenditureItems where Name=@Parent);
    UPDATE ExpenditureItems SET Name =@Name, Parent =@ParentID, [Description] =@Description, IsGroup = @IsGroup WHERE ID=@ID;
    end
    else
    begin
    UPDATE ExpenditureItems SET Name =@Name, [Description] =@Description WHERE ID=@ID
    end
    end
    I ran the query itself from sql management studio and it works fine. The problem seems to be in c# code, but there's nothing unusual. Same code for operations with the databse works fine in other parts of the software... I appreciate your help!
    Thanks in advance!

    Please can you post your full C# code for this function? Also the code you sent is not calling an SP? so why do we need to validate against the SP?
    Fouad Roumieh
    So here is my code:
    //Update is called on OK button click
    private void okBut_Click(object sender, EventArgs e)
    //edit code runs here
    SqlParameter[] pars = new SqlParameter[5];
    pars[0] = new SqlParameter("@ID", int.Parse(idTB.Text));
    pars[0].SqlDbType = SqlDbType.Int;
    pars[1] = new SqlParameter("@Name", itemTB.Text);
    pars[1].SqlDbType = SqlDbType.NVarChar;
    pars[2] = new SqlParameter("@IsGroup", true);
    pars[2].SqlDbType = SqlDbType.Bit;
    pars[3] = new SqlParameter("@Parent", DBNull.Value);
    pars[3].SqlDbType = SqlDbType.Int;
    pars[4] = new SqlParameter("@Description", descTB.Text);
    pars[4].SqlDbType = SqlDbType.NVarChar;
    try
    DAL dal = new DAL();
    dal.UpdateData("ExpenditureItems", pars); //Update is called here
    catch (Exception ex)
    StaticValues.WriteEventLogXML(ex, this.Text);
    switch (StaticValues.user.Language)
    case "English":
    MessageBox.Show("Database error", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    break;
    default:
    break;
    finally
    this.DialogResult = System.Windows.Forms.DialogResult.OK;
    StaticValues.currentNode = itemTB.Text;
    public void UpdateData(string tableNameString, SqlParameter[] vars)
    string tableName = tableNameString.Replace(" ", string.Empty);
    try
    command.Parameters.Clear();
    command.Parameters.AddRange(vars);
    command.CommandText = "Update" + tableName;
    conn.Open();
    command.ExecuteNonQuery();
    conn.Close();
    this.GetData(tableName);
    catch
    throw;
    And here is GetData procedure:
    public void GetData(string tableNameString)
    string tableName = tableNameString.Replace(" ", string.Empty);
    command.CommandText = "Get" + tableName;
    command.Parameters.Clear();
    if (!StaticValues.dataSet.Tables.Contains(tableName))
    StaticValues.dataSet.Tables.Add(tableName);
    else
    StaticValues.dataSet.Tables[tableName].Clear();
    try
    adapter.SelectCommand = command;
    conn.ConnectionString = DAL.ConnectionString;
    command.Connection = conn;
    conn.Open();
    adapter.Fill(StaticValues.dataSet.Tables[tableName]);
    conn.Close();
    catch
    throw;
    And this is my complete code for sql procedure:
    USE [ISWM project]
    GO
    /****** Object: StoredProcedure [dbo].[UpdateExpenditureItems] Script Date: 13.04.2015 9:09:36 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER procedure [dbo].[UpdateExpenditureItems]
    (@ID int,
    @Name nvarchar(50),
    @Parent nvarchar(50),
    @Description nvarchar(50),
    @IsGroup bit
    AS
    Begin
    if @Parent IS NOT null
    begin
    declare @ParentID int
    set @ParentID = (select ID from ExpenditureItems where Name=@Parent);
    UPDATE ExpenditureItems SET Name =@Name, Parent =@ParentID, [Description] =@Description, IsGroup = @IsGroup WHERE ID=@ID;
    end
    else
    begin
    UPDATE ExpenditureItems SET Name =@Name, [Description] =@Description WHERE ID=@ID
    end
    end
    The codes posted above work great in other similar parts of the application where select, insert, delete and update is required.
    Concerning my current problem - I ran the procedure itself in SQL Server Management Studio, and it works well. I would say that there's something wrong with my c# code, but it can't be wrong because it's quite simple and works in other place in my application...
    I really don't get what's missing...

  • BAPI to insert a new row in the MCHA table

    Hi all,
    I am in search of a BAPI to insert a new row in the MCHA table... with the fields of the materail, plant and batch values.
    Any inputs on this..is highly appreciable...
    thanks in advance...
    regards..
    prathima.

    explore BAPI_BATCH_CREATE

  • BAPI to insert a new row in the AUSP table

    Hi all,
    I am in search of a BAPI to insert a new row in the AUSP table... with the fields of the object and
    characteristic values.
    Any inputs on this..is highly appreciable...
    thanks in advance...
    regards..
    prathima.

    hi,
    from best of my knowledge  here is list of bapi through you can insert ausp table.
    check it.
    CLSE_SELECT_AUSP
    CLVF_INSERT_AUSP
    BAPI_CLASS_CREATE
    C14K_AUSP_CHANGE_VALUE
    CLSE_SELECT_AUSP
    CLVF_UPDATE_AUSP
    C14K_AUSP_ADD_UPD
    BAPI_CLASS_CREATE
    regards,
    vipul

  • How to insert a new Row in a table? - Need help

    Hi everyone,
    I'm using JDeveloper 10.1.2, UIX pages and STRUTS.
    This is my situation: When I navigate from page one to page two, I have in my page2 one table and I need to create a new row with some values by default, but I don't want to commit this line except the user decides to complete this line.
    Can anyone help me? This is very important.
    Thanks,
    Atena

    Hi Sascha,
    thanks very much for your replay.
    My project changed and I have another question about this. My page1 has a table (table1) and when I select one line from table1 and press a button, I go to page 2.
    I have an action in the Struts-Config.xml like this in page2 (S2PopUpObstaculos):
    <action path="/S2PopUpObstaculos" type="oracle.jheadstart.controller.strutsadf.action.JhsDataActionSaveObstaculos" className="oracle.jheadstart.controller.strutsadf.action.JhsDataActionMapping" parameter="/WEB-INF/page/S2PopUpObstaculos.uix" name="DataForm">
    <set-property property="modelReference" value="S2AltaSociais2UIModel"/>
    <set-property property="bindParams" value="S2DominiosLevel1Iterator=${data.S2AltaSociais2UIModel.Obstaculo},${data.S2AltaSociais2UIModel.AlsEpsPsId},${data.S2AltaSociais2UIModel.AlsEpsId},${data.S2AltaSociais2UIModel.Obstaculo}"/>
    </action>
    But now, the problem is, if I don't select one Row from table1 and press the button to go to page2, I need to pass diferent parameters to page 2, like this:
    <set-property property="bindParams" value="S2DominiosLevel1Iterator=0,${data.S2AltaSociais2UIModel.AlsEpsPsId},${data.S2AltaSociais2UIModel.AlsEpsId},0"/>
    </action>
    Do you have any ideia how to do this? Can you help me?
    Thanks,
    Atena

  • Inserting a new row in a table

    I want to insert a row between other rows. Means when we insert a row and we see by
    select * from emp;
    then the result shows that inserted value goes to last row. So i want that when we insert a value to a table and do
    select * from emp;
    then inserted value must be between other rows....

    Well, if your teacher won't take the answer "you can't insert rows between other rows, you must use an order by to get your data in a particular order", then he is not the teacher you want to be learning Oracle database concepts from. Because it is the truth. Maybe he is testing your resolve to stick to an answer that you have researched.
    If he's intending it as a "trick" question, you could propose what others here have alluded to - for example, if you have a date field in your table and had, for example, rows with dates Jan 3 2011 and Jan 5 2011, you could insert a record with date Jan 4 2011, then when you select, and use "order by" that column, the data will "appear to be" between the existing 2 records. But, again, this relies on using "order by", the data is not physically or any other way "between" the first 2 records, and is not a practical, real-world way of solving most data ordering issues.
    Now, this is an Oracle forum, and this is the Oracle answer. I do not have experience with any other database so I can't definitively say that this would be the answer in all databases.
    Good luck with your class.

  • Inserting a new row in a child table referencing an already existing parent

    I have two tables PARENT & CHILD (one to many), both of which are populated at different times.
    In our toplink mappings, parent contains a collection of child Domain Objects, & and child Domain object contains a one - one to parent.
    How can I insert a new row in a child table with reference to an already existing row in parent?
    When I fetch the parent Domain object and try to set it in the child Domain Object and use the unitOfWork.registerObject() it goes into a circular loop of selecting from 2 other tables.
    Please suggest.

    Odd, have you disabled caching and indirection? (NoIdentityMap, dontUseIndirection, or alwaysRefresh/disableCacheHits). If so, then this could be the issue.
    Otherwise please include the sample code you use to perform this, and verify that you do not have any unusual code in your set/get methods or in descriptor events. Also turn TopLink logging on and include a sample. Also ensure that you do not modify your objects until after registering them in the unit of work, and only modify the unit of work clones.

  • Generate a surregate key only when insert a new row - (SCD1)

    Hi all,
    I&acute;m starting with OWB (10gR2) and I'm creating a simple template dimension with SDC type 1 with one source, one target and a sequence do generate the surrogate key.
    The main properties configurations are:
    - Target property: Loading type = INSERT/UPDATE.
    - Only match the natural key between source and target.
    - Only use the sequence.nextval when inserting a new row.
    - Mapping: Set based.
    The generated code was something like this:
    {color:#000080}+MERGE INTO DIM_DEFAULT+{color}
    {color:#000080}+USING SCR_TABLE+{color}
    {color:#000080}+ON(SCR_TABLE.NATURALKEY=DIM_DEFAULT.NATURALKEY)+{color}
    {color:#000080}+WHEN MATCHED THEN+{color}
    {color:#000080}+UPDATE SET NAME=SCR_TABLE.NAME+{color}
    {color:#000080}+WHEN NOT MATCHED THEN+{color}
    {color:#000080}+INSERT(SK_DEFAULT,NATURALKEY,NAME)+ {color}
    {color:#000080}+VALUES(SQ_DIM_DEFAULT.NEXTVAL,SCR_TABLE.NATURALKEY,SCR_TABLE.NAME)+{color}
    Ok, it works fine! But the merge statement generates a new SK for each merged row even if the action is update! What I want is a new SK only when the process inserts a new row. Hard-coding, I possible solve this problem creating a function to return the nextval from a sequence and put it on the insert clause like this:
    {color:#000080}+MERGE INTO DIM_DEFAULT+{color}
    {color:#000080}+USING SCR_TABLE+{color}
    {color:#000080}+ON(SCR_TABLE.NATURALKEY=DIM_DEFAULT.NATURALKEY)+{color}
    {color:#000080}+WHEN MATCHED THEN+{color}
    {color:#000080}+UPDATE SET NAME=SCR_TABLE.NAME+{color}
    {color:#000080}+WHEN NOT MATCHED THEN+{color}
    {color:#000080}+INSERT(SK_DEFAULT,NATURALKEY,NAME)+ {color}
    {color:#000080}+VALUES(FN_SQC_NEXTVAL('SQ_DIM_DEFAULT'),SCR_TABLE.NATURALKEY,SCR_TABLE.NAME)+{color}
    Hard-coded it works fine as I need and that&acute;s the point that I want to know:
    It&acute;s possible perform this solution using OWB?
    I tried to use Constants but this solution doesn&acute;t work then I tried an expression calling my sequence.nextval function but the result was:
    {color:#000080}+MERGE INTO DIM_DEFAULT+{color}
    {color:#000080}+USING (SELECT FN_SQC_NEXTVAL('SQ_DIM_DEFAULT') AS SK_DEFAULT_0,NATURALKEY,NAME FROM SCR_TABLE) AS SCR_TABLE+{color}
    {color:#000080}+ON(SCR_TABLE.NATURALKEY=DIM_DEFAULT.NATURALKEY)+{color}
    {color:#000080}+WHEN MATCHED THEN+{color}
    {color:#000080}+UPDATE SET NAME=SCR_TABLE.NAME+{color}
    {color:#000080}+WHEN NOT MATCHED THEN+{color}
    {color:#000080}+INSERT(SK_DEFAULT,NATURALKEY,NAME)+ {color}
    {color:#000080}+VALUES(SK_DEFAULT_0,SCR_TABLE.NATURALKEY,SCR_TABLE.NAME)+{color}
    It&acute;s the same of merge the row using the SEQUENCE.NEXTVAL direct.
    Does anyone have a workaround to solve this situation?

    Hi,
    Perhaps this comes a bit late but...
    Have you tried to change attribute properties in the mapping? For simple example you have a source table in sa-stage which have to fields: code (varchar2(2), natural key) and description (varchar2(50)). You want to map those fields to target table where you have 3 fields: id (NUMBER(10), surrogate id, nextval from sequence when new row inserted), code (as from the source, natural key, the field to determine if the coming row is new or one to be merged) and description as in source table. Fields and datatypes are just for an example.
    When you have source and target tables in your mapping (and fields mapped), drag the sequence operator to the mapping and map the nextval to target table's surrogate id field.
    - Change target table operator properties:
    * loading type = UPDATE/INSERT
    * Match by constraint = no constraint
    - Change target table attribute properties for:
    * surrogate id field: Load column when updating row = no; match column when updating row = no; load column when inserting row = yes
    * natural key field(s): Load column when updating row = no; match column when updating row = yes; load column when inserting row = yes
    * all the regular fields: Load column when updating row = yes; match column when updating row = no; load column when inserting row = yes
    - change the deleting rules as you want them to be
    - Validate your mapping. If the green light is shown, the settings in field properties are suitable for merge.
    Hope this is what you wanted to get. I think this kind of solution works fine. Trigger in the table that holds and where one inserts millions of rows sounds scary...
    Regards,
    jk
    Added text: sorry about false alarm. I think that was what you did. The solution above steals the nextvals from sequence. Perhaps no-native-english-reader should be more careful when reading questions ;-)
    Edited by: jkoski on 5.11.2008 1:30

  • How to create the new row with existing values

    Hi all,
    first of all i create a row,
    i opened that in edit mode,
    suppose i want to edit any one of the value in that recordd,
    that time compulsory create a new row with those valuess.
    how can i create a new row with those valuess.

    Hi Anusha,
    This code correct for your requirement, only thing is you are not able to modify it as per your requirement.
    What you have to do is:
    1. Copy queried row into into new row, change primary key values(but don't commit your changes here).
    2. Now you have two rows in your VO(OLD as well as New)
    3. Make any changes if you want using User Interface.
    4. At the save button first compare OLD and NEW row, if any value is differing then commit the chnages(it will insert new row in corresponding database table), if no changes are there I mean to say OLD value and NEW rows are same then rollback(it will remove copied row from VO and no row will be inserted in database.)
    While comparing rows please note that Primary keys will not be same so don't compare Primary keys while comparing rows.
    I hope it will help you.
    Regards,
    Reetesh Sharma

  • 30EA1: Database mounted, can't get rows with DATEs

    I'm starting to use SQL Developer 3.0.02 build MAIN-02.37. I tried to use it with a 10g standby database that is only mounted, to check on its recovery progress, and it appears to NOT return rows with DATE columns in them. I've tried this with both a TNS connection and a basic connection. If the database is open, no problem.
    Example: select instance_name, host_name, startup_time from v$instance;
    If I remove the DATE column "startup_time" from the query, I get the expected rows. The Logging Page pane at the bottom shows ORA-01219 errors "database not open, queries allowed on fixed tables/views only."
    I get that ORA-01219 message in TOAD against the mounted standby database, but I also get all the rows including the DATE column when I run the exact same statement there.
    Is this a bug, or expected behaviour, or is there some setting I'm missing?
    Edited by: gmaccrim on Nov 25, 2010 4:26 PM

    I have similar problem on standby database with query on v$database.
    This query
    SELECT name,dbid FROM V$database
    works fine, but this one
    SELECT name,dbid,created FROM V$database
    doesn't return any row.
    I have Version 2.1.1.64 Build MAIN-64.45.

  • How to insert a new row in the middle of an set of rows

    Hi
    How to insert a new  row in the middle of an set of rows ? and How to Reset the line id after the new row added ?
    Regards,
    Sudhir B.

    Hai,
    just try this,
    Instead of using omatrix.Addrow(1,-1) use like
    omatrix.AddRow( RowCount , Position)
    RowCount
    The number of rows to add (default is 1)
    Position
    The position of the new rows (0-based; default is -1, meaning append row to the end)
    After adding rows in matrix For, sno.
    for i=1 to omatrix.visualrowcount
    otext=omatrix.getcellspecific("columnid",i)  '--where columnid is the unique id of the sno column
    otext.value=i
    next i
    Hope this helps you.
    Thanks & Regards,
    Parvatha Solai.N

  • How to insert the new row after current row in RowIterator - Steve Muench

    Hi,
    Our client wants the new row to be added after current row on the front end instead of before current row.
    we were using "new JUActionBinding(this,iterBinding,JUActionBinding.ACTION_CREATE_INSERT_ROW);" this code inserts the new row after current row.
    I tried a lot to insert the new row after current row. Used new JUActionBinding(this,iterBinding,JUActionBinding.ACTION_LAST to move the cursor to last row in rowiterator and the used .ACTION_CREATE_INSERT_ROW but this thing inserts the new row as the second last row.
    Could somebody plesae help ?
    Message was edited by:
    user556161

    I am using JDeveloper 9.0.4.2.0 (Build 1459)

  • I'm trying to insert a new row, but not a whole row  on  a spreadsheet, but all i can seem to do is insert a full complete row? iPad Air Wi-Fi

    I'm trying to insert a new row, but not a whole row  on  a  pages app spreadsheet, but all i can seem to do is insert a full complete row?

    What exactly are you trying to do? As I stated in your other thread, there is no such thing as a partial row.

Maybe you are looking for