The IDMS ROWID is a virtual column which can be used to uniquely identify, and directly access, any row in a table. It can be used to access both SQL and network databases when using SQL DML.
Questions
1- Is it a good practice to use ROWID to get the record from VIA table while using JDBC?
2- Will ROWID value get changed when we MODIFY(DML statements) record or it will get changed only when we run DDL statements like in Oracle?
3- 3- Is it a good idea to use ROWID to access an occurrence of a VIA record? For example, where TERMINATION is an owner record stored Calc & ROUTING is a member record stored VIA, is this query advisable?
Query: select term.* from ROUTING rout, TERMINATION term where rout.ROWID=? and "SET-NAME".
IDMS - all supported releases
1- Is it a good practice to use ROWID to get the record from VIA table while using JDBC?
A: There are pros & cons to this approach. Using ROWID is the most efficient way to access data - it's like an OBTAIN USING DBKEY network DML statement/. However, the ROWID is not necessarily a permanent value, so there may be overhead in obtaining the correct DBKey to use when specifying a ROWID value. More details about this later.
2- Will ROWID value get changed when a record is modified or will it get changed only when DDL statements are executed (like in Oracle)?
A: The best documentation on this is in the IDMS SQL Reference. It states the following:
"The value of ROWID is unique for each row of a base table; however, you cannot consider it to be a table's primary key because its value can change over the lifetime of the database. This could happen, for example, after an UNLOAD/RELOAD operation. ... The ROWID value is not persistent for the life of the database, but it never changes within a transaction or other controlled processes, if the row is not deleted, of course."
3- Is it a good idea to use ROWID to access an occurrence of a VIA record? For example, where TERMINATION is an owner record stored Calc & ROUTING is a member record stored VIA, is this query advisable?
Query: select term.* from ROUTING routing, TERMINATION term where routing.ROWID=? and "SET-NAME".
A: In coding a query like this, it’s important to examine how you obtain the value to use for ROWID. As noted above, this value is not guaranteed to never change. So coding in this way either means you must verify that you have the correct value at run-time, which could require overhead that would reduce the effectiveness of the actual I/O. In this example, though, the use of "SET-NAME" is kind of superfluous unless you are wanting to ensure that the ROWID you provide is actually for a record occurrence that is connected to the owner via the member set. To walk all the members of the VIOA set you could use the set name alone; to obtain a specific record occurrence you would not need to use the set name or the owner, if you have the actual ROWID.
The use of ROWID is radically expanded starting in 19.0 . On that release, virtual foreign keys are implemented using ROWIDs. That means to obtain all the members of a VIA set underneath a specific owner record occurrence you can specify something like this:
select * from EXPERTISE
where FKEY_EMP_EXPERTISE =
(select ROWID
from EMPLOYEE
where EMP_ID = 1001) ;
In this example, EXPERTISE is the member record in the EMP_EXPERTISE set, and EMPLOYEE is the owner. The syntax FKEY_EMP_EXPERTISE is the way to refer to the virtual foreign key in the member EXPERTISE record for the EMP_EXPERTISE set. Coding in this way, without specifying a set name, will likely be more useful in a JDBC environment, where the use of SET-NAME as a join criteria may not be supported. The use of SET-NAME is a IDMS extension to the ANSI SQL standard.