Create an account

Very important

  • To access the important data of the forums, you must be active in each forum and especially in the leaks and database leaks section, send data and after sending the data and activity, data and important content will be opened and visible for you.
  • You will only see chat messages from people who are at or below your level.
  • More than 500,000 database leaks and millions of account leaks are waiting for you, so access and view with more activity.
  • Many important data are inactive and inaccessible for you, so open them with activity. (This will be done automatically)


Thread Rating:
  • 271 Vote(s) - 3.42 Average
  • 1
  • 2
  • 3
  • 4
  • 5
create table with sequence.nextval in oracle

#1
i created a sequence using the following query,

create sequence qname_id_seq start with 1 increment by 1 nocache;

Now when i try to create a table which uses the above sequence, it is throwing the following error,

Error report:
SQL Error: ORA-00907: missing right parenthesis
00907. 00000 - "missing right parenthesis"

I used the following query to create a table with sequence.nextval,

CREATE TABLE qname
(
qname_id integer NOT NULL default qname_id_seq.nextval PRIMARY KEY,
qname VARCHAR2(4000) NOT NULL -- CONSTRAINT qname_uk UNIQUE
);
Reply

#2
I for myself prefer Lukas Edger's solution.

But you might want to know there is also a function [SYS_GUID][1] which can be applied as a default value to a column and generate unique ids.

you can read more about pros and cons [here][2]


[1]:

[To see links please register here]

[2]:

[To see links please register here]

Reply

#3
In Oracle 12c, you can now specify the CURRVAL and NEXTVAL sequence pseudocolumns as default values for a column. Alternatively, you can use Identity columns; see:

* [reference doc](

[To see links please register here]

)
* articles: Enhancements in Oracle DB 12cR1 (12.1): [Default Values for Table Columns](

[To see links please register here]

) and [Identity Columns in 12.1](

[To see links please register here]

)

E.g.,

CREATE SEQUENCE t1_seq;
CREATE TABLE t1 (
id NUMBER DEFAULT t1_seq.NEXTVAL,
description VARCHAR2(30)
);

Reply

#4
You can use Oracle's **SQL Developer** tool to do that (My Oracle DB version is 11). While creating a table choose **Advanced option** and click on the **Identity Column** tab at the bottom and from there choose **Column Sequence**. This will generate a *AUTO_INCREMENT* column (Corresponding Trigger and Squence) for you.
Reply

#5
In **Oracle 12c** you can also declare an **identity column**

CREATE TABLE identity_test_tab (
id NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY,
description VARCHAR2(30)
);


examples & performance tests [here][1] ... where, is shorts, the conclusion is that the *direct use of the sequence* or the new *identity column* are **much faster than the triggers.**

[1]:

[To see links please register here]

Reply

#6
### Oracle 12c

We now finally have `IDENTITY` columns like many other databases, in case of which a sequence is auto-generated behind the scenes. This solution is much faster than a trigger-based one [as can be seen in this blog post][1].

So, your table creation would look like this:

CREATE TABLE qname
(
qname_id integer GENERATED BY DEFAULT AS IDENTITY (START WITH 1) NOT NULL PRIMARY KEY,
qname VARCHAR2(4000) NOT NULL -- CONSTRAINT qname_uk UNIQUE
);

### Oracle 11g and below

According to the [documentation][2], you cannot do that:

> Restriction on Default Column Values A DEFAULT expression cannot contain references to PL/SQL functions or to other columns, the pseudocolumns CURRVAL, NEXTVAL, LEVEL, PRIOR, and ROWNUM, or date constants that are not fully specified.

The standard way to have "auto increment" columns in Oracle is to use triggers, e.g.

CREATE OR REPLACE TRIGGER my_trigger
BEFORE INSERT
ON qname
FOR EACH ROW
-- Optionally restrict this trigger to fire only when really needed
WHEN (new.qname_id is null)
DECLARE
  v_id qname.qname_id%TYPE;
BEGIN
-- Select a new value from the sequence into a local variable. As David
-- commented, this step is optional. You can directly select into :new.qname_id
SELECT qname_id_seq.nextval INTO v_id FROM DUAL;

-- :new references the record that you are about to insert into qname. Hence,
-- you can overwrite the value of :new.qname_id (qname.qname_id) with the value
-- obtained from your sequence, before inserting
:new.qname_id := v_id;
END my_trigger;

Read more about [Oracle TRIGGERs][3] in the documentation


[1]:

[To see links please register here]

[2]:

[To see links please register here]

[3]:

[To see links please register here]

Reply



Forum Jump:


Users browsing this thread:
1 Guest(s)

©0Day  2016 - 2023 | All Rights Reserved.  Made with    for the community. Connected through