ResultSet for Update JDBC2.0
I'm using the latest 8.1.6 JDBC 2.0 thin driver with 8i. Here's the situation:
Get connection, set autocommit off.
Create a PreparedStatement:
SELECT col1, col2, col3 FROM atable WHERE col1=? FOR UPDATE
*** Note: types are NUMBER, NUMBER, DATE, respectively
with:
ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_UPDATABLE
pstmt.setInt(1,...) and executeQuery, then do:
rs.updateInt(2,aInt);
rs.updateDate(3,aSQLDate);
*** rs.getConcurrency() and rs.getType() indicate neither has been downgraded
rs.updateRow()
*** Get ORA-00907: missing right parenthesis here
Why? If I remove the "FOR UPDATE" from the end of the PreparedStatement, everything works fine. However, I need the lock. It looks like this is a bug; is there a workaround?
null
You cannot use "select * FROM ...". A workaround is to use "SELECT t.* FROM TABLE t ..." See
http://technet.oracle.com/doc/oracle8i_816/java.816/a81354/resltse2.htm#1018228
Similar Messages
-
ORA-01002-Error in Select ... for update
I would like to insert CLOB in a table (VP_EVENTS) with a primary key (eventid) with the following code:
String content = "AAAAAAAAAAAAABBBBBBBBBBXXX";
PreparedStatement cs = this.con.prepareStatement("INSERT INTO vp_events (eventid,term,participant)
VALUES (?,?,empty_clob())");
//Register IN-Parameter
cs.setInt(1, 1);
cs.setInt(2, 1);
cs.setTimestamp(3, new java.sql.Timestamp( System.currentTimeMillis() ));
//Execute statement
cs.execute();
cs.close();
Statement stmt = con.createStatement();
ResultSet clobLocatorSet = stmt.executeQuery( "SELECT PARTICIPANT FROM VP_EVENTS WHERE EVENTID=1 FOR UPDATE");
// Get the CLOB-locator
if (clobLocatorSet.next())
oracle.sql.CLOB clob =
((oracle.jdbc.driver.OracleResultSet)
clobLocatorSet).getCLOB(1);
// Write CLOB-Data
// The first parameter to plsql_write, is // the offset from which to start
// writing, and the second parameter is the // data to be written.
// plsql_length(), returns the length of // the data in the CLOB column
countCLOB = clob.plsql_write(
0,content.toCharArray());
At the execution-point of the "Select for Update"-statement the oracle thin driver throws the Error "Fetch out of sequence ORA-01002".
What's wrong?Connection conn = DriverManager.getConnection ("jdbc racle:thin:@myhost:1521:ORCL","scott", "tiger");
conn.setAutoCommit(false);
Statement stmt = conn.createStatement ();
null -
I keep getting this error with some pretty standard CLOB code to update data:
HELLLP!!!
SQLException: ORA-01002: fetch out of sequence
java.sql.SQLException: ORA-01002: fetch out of sequence
Here's the code:
CLOB lob_loc = null;
String buf = new String ("CLOB text buffer test");
Connection myConn=
DriverManager.getConnection("jdbc:oracle:thin:@172.16.11.32:1521:ORCL","outerforce","outerforce");
Statement stmt = myConn.createStatement();
System.out.println("BEFORE SELECT FOR UPDATE........");
ResultSet myResultSet = stmt.executeQuery("SELECT data FROM clobtest WHERE assign_no=7 FOR UPDATE");
System.out.println("SELECT DONE FOR UPDATE........");
if (myResultSet.next())
lob_loc = ((OracleResultSet)myResultSet).getCLOB (1);
OracleCallableStatement cstmt = (OracleCallableStatement)
myConn.prepareCall ("BEGIN DBMS_LOB.OPEN(?, DBMS_LOB.LOB_READWRITE); END;");
cstmt.setCLOB(1, lob_loc);
cstmt.execute();
/* if (myResultSet != null){
while (myResultSet.next()) {
System.out.println(myResultSet.getString("assign_no"));
long pos = 0; // This is the offset within the CLOB where the data is to be written
long length = 0; // This is the size of the buffer to be written.
// This loop writes the buffer three times consecutively:
//for (int i = 0; i < 3; i++)
// Fill the buffer with some data to be written:
length = buf.length();
//pos += length;
// This is an Oracle-specific method:
//lob_loc.plsql_write(pos, buf.toCharArray());
lob_loc.putString(pos, buf);
//}Sorry Email reply was incorrect
send to:
[email protected]
null -
Problem combining select, order by, rownum (top-N) and for update
Hello,
i have serious problems with this.
-- drop table testtable;
create table testTable (id number(10,0) primary key, usage number(10,10));
-- delete from testtable;
insert into testtable values (11, 0.5);
insert into testtable values (10, 0.3);
insert into testtable values (12, 0.3);
insert into testtable values (9, 0.3);
insert into testtable values (8, 0.9);
insert into testtable values (3, 0.0);
insert into testtable values (2, 0.02);
insert into testtable values (1, 0.05);
insert into testtable values (7, 0.7);
insert into testtable values (6, 0.4);
insert into testtable values (5, 0.2);
insert into testtable values (4, 0.1);
select * from testtable;
-- without FOR UPDATE
select * from (
select tt.id id_, tt.*
from testtable tt
where tt.usage > 0.1
order by tt.usage desc, tt.id desc
where rownum <= 10;
--> WORKS
-- without ORDER BY
select * from (
select tt.id id_, tt.*
from testtable tt
where tt.usage > 0.1
where rownum <= 10
for update of id_;
--> WORKS
-- without WHERE ROWNUM <= 10
select * from (
select tt.id id_, tt.*
from testtable tt
where tt.usage > 0.1
order by tt.usage desc, tt.id desc
for update of id_;
--> WORKS
-- But what i need is this:
select * from (
select tt.id id_, tt.*
from testtable tt
where tt.usage > 0.1
order by tt.usage desc, tt.id desc
where rownum <= 10
for update;
--> ORA-02014: cannot select FOR UPDATE from view with DISTINCT, GROUP BY, etc., SQL State: 42000, Error Code: 2014
select * from (
select tt.id id_, tt.*
from testtable tt
where tt.usage > 0.1
order by tt.usage desc, tt.id desc
where rownum <= 10
for update of id_;
--> ORA-02014: cannot select FOR UPDATE from view with DISTINCT, GROUP BY, etc., SQL State: 42000, Error Code: 2014
I have tried every single solution i could come up with.
But nothing worked.
My latest idea is to include a comment in the query and set up an ON SELECT trigger which evaluates the comment and enforeces the lock.
But i'm not sure if this is even possible.
I cannot split the statement into two because i need the lock immediately when the wanted rows are selected.
One major criteria for the rows is the order by. Without it i get a random set of rows.
And the rownum <= 10 is also needed because i don't want to lock the whole table but only the few needed rows.
I tried row_number() over (order by ...) but this is considdered a window/group-function which disallows the for update as well as the order by.
During these tests i noticed, that when using the row_number()-function the resultset is ordered automatically (without an additional order by clause).
But this doesn't help anyway.
I tried using piped functions to wrap the select to apply the rownum manually by cursor skip, but this doesn't work either. First of all i wasn't able to wrap the query the way i imagined and second the lock would be applied to the whole resultset anyway but only the reduced rows would be returned.
I heared about LOCK-hints from other DBs, is there anything similar here?
Any other solution??
btw. it has to be high-performance after all.
Greetings Finomosec;No, not perfect.
This is the expected result (ordered by usage desc, id desc):
ID USAGE
8 0.9
7 0.7
11 0.5
6 0.4
12 0.3
10 0.3
9 0.3
5 0.2
This ist the one produced by your statement:
ID USAGE
5 0.2
6 0.4
7 0.7
8 0.9
9 0.3
10 0.3
11 0.5
12 0.3
Use limit 5 in your tests, and you will also notice that the following doesn't work either:
select * from testtable ww where ww.id in
select id from
select tt.id, tt.usage
from testtable tt
where tt.usage > 0.1
where rownum <= 5
order by usage desc, id desc
for update;
It's because the order is not applied to the result.
But the following modification works (at least principally):
select * from testtable ww where ww.id in
select id from
select tt.id, tt.usage
from testtable tt
where tt.usage > 0.1
order by usage desc, id desc
where rownum <= 5
order by usage desc, id desc
for update;
Thr problem here is:
I need to expand the following Statement to the above form by (Java-) Code:
-- statement-A
select tt.id, tt.usage
from testtable tt
where tt.usage > 0.1
order by usage desc, id desc;
The main problem is:
The order by clause needs to be duplicated.
The problem here is, to identify it (if present) and NOT any order by in inner selects.
I am using Hibernate and to implement this i have to modify the OracleDialect to solve this problem. I get the statement-A (see above) and have to apply the limit.
Isn't there any other solution??
Greetings Finomosec; -
Processing SELECT FOR UPDATE queries
Hello,
Is there any occi sample code that uses "SELECT ... FOR UPDATE" and "WHERE CURRENT OF"?I think "where current of" is not supported in OCI as well.
But, may be I can use the below steps for positioned updates using "select for ... updat" sqls
1. Lock the rows by executing the "select for ...update " SQL.
2. Get the result set
3. Now, as iterating the result set, get the current row id using ResultSet.getRowid() or getRowPosition() (I am not sure which one to use. But, I think getRowPosition() is suitable as it explicitly returns the rowid of the current row position)
4. Execute the update stmt "update tableName set ... where rowid=?"
5. Iterate the Result set and update the row as in pt. 4
6. commit the transaction (this unlocks the rows)
Please let me know if this is correct... -
FOR UPDATE on scrollable cursor and error: ORA-00907: missing right parenthesis
If change my query to have a FOR UPDATE and make it an updatable scrollable cursor I get an error on the updateRow() command saying "ORA-00907: missing right parenthesis"
If I remove the FOR UPDATE it works OK.
The problem I have is trying to update a CLOB from a ResultSet. If I do not upate any other column I get the error saying that the error"
"ORA-22920: row containing the LOB value is not locked"
I can get around this by adding FOR UPDATE. But if I add FOR UPDATE and try to update any non-CLOB column I get the 00907 error above.
Hmmmm. So here is what I can and cannot do:
- I CAN update the CLOB IF I update another column 1st and NO FOR UPDATE clause.
- I CAN update the CLOB only if I have FOR UPDATE clause.
- I CANNOT update just the CLOB without FOR UPDATE.
- I CANNOT update any non-CLOB column with FOR UPDATE.
What a pain in the ***! How am I to provide generic access to the applications being built on my DB layer. This is crazy!<BLOCKQUOTE><font size="1" face="Verdana, Arial">quote:</font><HR>Originally posted by Andrew Edgar ([email protected]):
I have this same problem!
The error occurs when performing updateRow.
The turning off of auto commit only gets the query to work but not the actual update.
Will this be fixed in the next version of the Driver?<HR></BLOCKQUOTE>
Here is the stack Trace I recieved:
java.sql.SQLException: ORA-00907: missing right parenthesis
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:168)
at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:208)
at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:543)
at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1405)
at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteFetch(TTC7Protocol.java:822)
at oracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStatement.java:1446)
at oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.java:1371)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1900)
at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:363)
at oracle.jdbc.driver.UpdatableResultSet.execute_updateRow(UpdatableResultSet.java:2135)
at oracle.jdbc.driver.UpdatableResultSet.updateRow(UpdatableResultSet.java:1322) -
Using updatable ResultSet to update Unicode data ?
Is it possible to use Unicode data in updateString() methods for updatable resultset ? Or I only can do it using OraclePreparedStatement ? I've opened an updatable ResultSet and trying to update NCHAR column using the code below:
rset.updateString(6, "\uFF23\uFF23");
which fails with "java.sql.SQLException: Cannot map Unicode to Oracle character".
An attempt to do the same thing with regulair English data
rset.updateString(6, "CC");
causes "java.sql.SQLException: ORA-12704: character set mismatch" on insertRow(). The server primary encoding is UTF8 and I have AMERICAN_AMERICA.UTF8 in NLS_LANG in the registry. I would really appreciate any help on this ...Thanks ! I guess I was looking in the wrong jdbc directory (the one that comes with JDev) ...
-
with :
resultset = stmt.executeQuery("select nxtid from mytable .. for update");
I have the ora-1002 Erreur.
Could you help me.
null<BLOCKQUOTE><font size="1" face="Verdana, Arial">quote:</font><HR>Originally posted by burgniar:
with :
resultset = stmt.executeQuery("select nxtid from mytable .. for update");
I have the ora-1002 Erreur.
Could you help me.<HR></BLOCKQUOTE>
Solution is :
conn.setAutoCommit(false);
null -
FOR UPDATE on updatable cursor and error: ORA-00907: missing right parenthesis
Anyone run into this? I've searched the message board and bug db to no avail.
- Using latest Oracle JDBC 2.0 compliant "thin" driver and Oracle 8.1.6 database.
1) Using prepareStatement specifying an updatable cursor for something like "SELECT FNAME,LNAME FROM USERS FOR UPDATE OF FNAME,LNAME"
2) Updating FNAME using updateString("FNAME","whatever"), and then calling updateRow() of the ResultSet yields:
ORA-00907: missing right parenthesis
If I remove the FOR UPDATE clause then everything works just fine.
Workarounds/suggestions appreciated!
Thanks,
Ryan
null<BLOCKQUOTE><font size="1" face="Verdana, Arial">quote:</font><HR>Originally posted by Andrew Edgar ([email protected]):
I have this same problem!
The error occurs when performing updateRow.
The turning off of auto commit only gets the query to work but not the actual update.
Will this be fixed in the next version of the Driver?<HR></BLOCKQUOTE>
Here is the stack Trace I recieved:
java.sql.SQLException: ORA-00907: missing right parenthesis
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:168)
at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:208)
at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:543)
at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1405)
at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteFetch(TTC7Protocol.java:822)
at oracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStatement.java:1446)
at oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.java:1371)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1900)
at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:363)
at oracle.jdbc.driver.UpdatableResultSet.execute_updateRow(UpdatableResultSet.java:2135)
at oracle.jdbc.driver.UpdatableResultSet.updateRow(UpdatableResultSet.java:1322) -
I'm trying to issue a SELECT ... FROM ... FOR UPDATE, and under specific verified conditions runs an UPDATE (where the current is positioned!).
The error code I get is:
ORA-01002: Fetch out of sequence.
Here you are my code:
/////////////////////START
import java.sql.*;
import oracle.jdbc.*;
import oracle.sql.*;
public class SelForUpdDin{
static{
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
catch(Exception e){e.printStackTrace();}
// Queries and cursor name
public static void main (java.lang.String[] args){
String cursorName = null;
int codice = 0;
String cognome = null;
String job = null;
int manager = 0;
java.sql.Date dataAss = null;
int salario = 0;
int commissioni = 0;
int reparto = 0;
String rowid = null;
String sqlSelect = "SELECT empno, ename, "+
"job, mgr, hiredate, sal, comm, deptno, ROWID "+
"FROM scott.emp FOR UPDATE";
String sqlUpdate = "UPDATE scott.emp SET comm = ? WHERE ROWID = ? ";
try {
Connection con = DriverManager.getConnection("jdbc:Oracle:oci8:@","system","manager");
// Esecuzione della SELECT e produzione del RESULT SET
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(sqlSelect);
PreparedStatement ps = con.prepareStatement(sqlUpdate);
while (rs.next()) {
codice = rs.getInt(1);
cognome = rs.getString(2);
job = rs.getString(3);
manager = rs.getInt(4);
dataAss = rs.getDate(5);
salario = rs.getInt(6);
commissioni = rs.getInt(7);
reparto = rs.getInt(8);
rowid = rs.getString(9);
// Applicazione della business logic
if (reparto == 30)
{ System.out.println (cognome + " in dept= "+ reparto +
" with salary=" + salario + " has a commission= " +
commissioni);
int newcomm = 5555;
ps.setInt(1,newcomm);
ps.setString(2,rowid);
ps.executeUpdate();
else
{ System.out.println (cognome + " in dept= "+ reparto +
" with salary=" + salario + " has a commission= " + commissioni);
} // if - else
} // end while
rs.close();
ps.close();
stmt.close();
catch(Exception e)
e.printStackTrace();
} // end main()
} // end class
//PS.
//Many thanks to Bachar and Elangovan that ansewerd me to my previous posting and addressed me towards the right solutionHi
The documentation gives following explanation for the error :
ORA-01002 fetch out of sequence
Cause: In a host language program, a FETCH call was issued out of sequence. A successful parse-and-execute call must be issued before a fetch. This can occur if an attempt was made to FETCH from an active set after all records have been fetched. This may be caused by fetching from a SELECT FOR UPDATE cursor after a commit. A PL/SQL cursor loop implicitly does fetches and may also cause this error.
Action: Parse and execute a SQL statement before attempting to fetch the data.
In your program you should set auto commit to false as follows :
con.setAutoCommit(false);
Do this before executing the SELECT FOR UPDATE sql query.
At the end of program you can commit to save the updations as follows:
con.commit();
This should solve the problem.
Chandar -
Sql statement not working with for update
Hi, iam facing an error fetch out of sequence
when iam trying to execute a sql statement
Statement st=con.createStatement();
st.executeQuery(select mycolumn from table where jobno=1 for update);
the statement works well without " for update ".
any solutions????Hi,
The fetch out of sequence error occurs usually when you are trying to read from a cursor that has no data left(like EOF).
After executing the sql statement move the pointer to the first row (or the beginning of the resultset)
This is actually an oracle error bearing number :ORA:01002
Hope this helps.
Thanks,
Creator Team. -
No Resultset for query containing multiple tables
Hi, I am new to Oracle and I have a problem concerning the Oracle datasource/query I am using.
I am using Websphere Application Server v5.1 Test environment, which connects to an Oracle 10g database and a DB2 database.
So basically, I have 2 datasources in my webservice application, one for each database. I have tested both datasources from the admin console of the server and both return no errors. Both datasources are loaded on startup of the application and again, there are no errors.
The problem basically is that I have no resultset elements ( rs.next() is false ) when I have a query that queries multiple tables.
Eg. Case1: Select * From table1
Case2: Select * From table1, table2
Case3: Select * From table1 t1 INNER JOIN table2 t2 on t1.column = t2.column
Case1: Contains resultset
Case2 and Case3: NO resultset
When these queries (case 2 and case3) are run from within the webservice application, there is no resultset; only case1 returns a resultset. However, if I run the same queries above from within Oracle SQL developer, there is a resultset containing the matching records. This problem only happens when using the Oracle datasource; the same problem does not happen for the DB2 datasource.
Basically, I do not have any resultset for a valid query and there aren't any errors as well.
Any ideas as to why this happens?
Thanks for any help.
Edited by: user11220677 on Jun 3, 2009 3:08 AMFinally got to the bottom of this. Turns out that the problem has nothing to do with the Oracle datasource in the webservice application, as what I have initiially thought.
The cause of the problem seems to be related to an import problem/issue in the Oracle SQL developer. Everytime I open Oracle SQL developer, one table (table2 in my example from previous post) is missing its data, so I import the data using the application's import wizard. Once the import is done, I use SQL developer's query interface to verify the data is there, and there are records returned - which made me think the database table was updated successfully. The problem was, I still do not have results when the query is run from the webservice containing the datasource.
We used another SQL command editor to verify if the said table was really updated in the database and to our surprise, it was still empty (even after the import from Oracle SQL developer). That explains why I am not able to retrieve anything from the webservice.
We just imported the data using another SQL command editor and the issue is now fixed.
Thanks anyway. -
Error message: "playlists selected for updating no longer exist"
I tried to update my ipod nano and I guess I had deleted a playlist, but since then, I have not been able to update. Every time I try, I get the following message:
"Cannot be updated because all of the playlists selected for updating no longer exist."
I haven't been able to highlight which playlists are selected to begin with.
I read through the manual and thought that maybe rebooting the whole system might work. So I deleted Itunes from my computer and re-installed.
Then I tried re-setting my ipod. So now I have nothing on my ipod.
I also deleted everything from my library, thinking it might help to start from scratch. Nothing has worked.
How do I "select" and "unselect" playlists so I can get up and running again?Here you go.
http://discussions.apple.com/thread.jspa?messageID=607312򔑐 -
Why does my app store use a different account for downloading and another for updating apps?
My app store used my own account for downloading and my sister's for updating, and it keeps telling me to reset my account. I already did that the other few times it told me to do that!
Have you restored your device from your sister's backup?
-
Lost music on ipod because "playlists selected for updating no longer exist
Not sure what I've done. I recently downloaded newer version of itunes. Then when synching, I had too much music in my library for the ipod to handle so it told me about doing the smart playlist. I erased a couple of playlists on the itunes menu I no longer wanted and then when I went to synch, this error came up "songs on the ipod cannot be updated because all of the playlists selected for updating no longer exist."
Please help.....Check this out.
iPod cannot sync because one or more playlist....
Maybe you are looking for
-
Screen exit in purchase order MM06E005
Dear Experts. I have implemented a USER EXIT (MM06E005) to tcode ME21N at header level (Add new tab and one field in it) and respective field getting updated in the table EKKO. But my problem is that field is not display at ME23N transaction. So plea
-
Tv series will not play in itunes
Please can you tell me why a tv series that i purchased from itunes (Yes Priminister) will not play in itunes. It was playing fine a couple of weeks ago. I have checked i have the latest itunes and quicktime updates.
-
Question about Audiobook file format
Can Audiobooks be in .mp3 format or are they in other file format? I am using iTunes 6.01.4.2 I have the Bible on 6 CDs, in .mp3 format. I'd like to be able to add them to the iTunes Library as Audiobooks if this is possible or do I have to add them
-
Hi, I just have a question regarding XI mapping development. Not sure if this is possible, but we're trying to look at an angle where XI will connect to an MDM Repostory in XI mapping. Has anyone experienced such a scenario before? I'm thinking using
-
How Can I Upgrade on New Computer?
I have Creative Suite Premium Version 8.0 on my old EMac computer Mac OS 10.3.3. I do not want to upgrade my old computer and will not use Creative Suite on it. I have just bought a new IMac computer OS 10.7.2 and cannot install Creative Suitie Prem