USING ROWNUM in SQL
Hi
I have a SQL query which a few nested queries. However, what I would like to do when each query is executed, is to count the number of rows returned in each query with rownum, and return this result up to the next query and so forth. How can I do this? I have had a go, but I can't seem to get it to work.
Thanks
Ganesh Srivatsav wrote:
>
more readable construction is count(*). It is not recommended to substitute arbitrary literals.
>
oracle documentation clearly says you can use count(expression). As long as the expression is not null it counts it.You can... but... count(1) doesn't make as much sense when reading the code as count(*) does. Count(*) sort of intimates a "count everything", whereas count(1) intimates "count 1 thing" even though it really counts everything.
Even Oracle itself rewrites count(1) as count(*) internally, so why make it have to do that step? Why not just provide it with what it wants in the first place?
{message:id=9360008}
Anyways Oracle will take care of it ;-) . And I also think that with all new versions and features coming in, Optimizer is becoming more and more intelligent.
I am sure the term standard will easily subside over years.Erm... no. Standards are standards. The standard is to use "count(*)". Count(1) is left over from those days when people believed that count(1) was somehow faster than count(*), which it isn't.
Similar Messages
-
Java.sql.SQLException: Invalid column index Query: while using ROWNUM
hi ,
i am getting the invalid column index query error while executing following query .i m able to run it properly without using rownum but when i append rownum i m getting error.i m using apache queryrunner for execution of query.
java.sql.SQLException: Invalid column index Query: select * from (
SELECT
TO_CHAR(A.REQ_FOR_RATING_ID) RFQID,
TO_CHAR(F.COV_PLAN_ID) COVPLANID,
B.FIRM_NAME FIRMNAME,
B.PRIMARY_ZIP_CD ZIP,
A.PRODUCR_CD PRODUCERCD,
A.PRODUCR_NAME PRODUCER,
H.COV_NAME COVDESP,
C.SALE_OFFC_CD SALEOFFCCD,
C.USR_OFFC_NAME USROFFC,
C.USR_NAME USR,
C.USR_REP_CD USRREPCD,
to_char((SELECT TO_CHAR(COUNT(EMP_NBR)) COUNT FROM ROSTR_DATA WHERE ROSTR_ID = F.ROSTR_ID)) AS count,
TO_CHAR(B.SIC_CD) SICCD,
F.INDSTRY_TYPE_IND INDTYPEIND,
TO_CHAR(F.MANL_SIC_FCTR_NBR) MANSICFACTOR,
TO_CHAR(F.UW_OVERD_SIC_FCTR_NBR) UWOVERDSICFACTOR,
TO_CHAR(G.AREA_FCTR_NBR) STRAREAFACTOR,
G.COV_ID COVID,
F.PLAN_APPRVL_STATUS_CD PLANAPPRVLCD,
F.PLAN_PROGRS_STATUS_CD PLANPROGRESSSTATUSCD ,
F.PLAN_SALE_ASSMNT_CD PLANSALEASSMTCD,
F.CREATD_DT CREATEDDT,
NVL(to_char(F.PLAN_RELSED_DT),' ') PLANRELSEDDT,
TO_CHAR(F.PLAN_RELSED_BY_ID) PLANRELSEDBYID,
TO_CHAR(F.PROPOSD_EFF_DT) PROPOSDEFFECTIVEDT,
TO_CHAR(A.GRACE_PERIOD_NBR) GRACEPERIOD,
A.RNWL_15_MONTH_IND FIFTEENMONTHRNWLIND ,
I.CO_DESC_TXT COMPANYNAME ,
NVL(to_char(F.PLAN_APPRVL_DT),' ') approvedDt,
(Select U.USR_NAME from USR_DETL U WHERE U.USR_ID = F.PLAN_RELSED_BY_ID) as planRelsedByName,
(Select U.USR_NAME from USR_DETL U WHERE U.USR_ID = F.PLAN_APPRVR_ID) as approvedByName,
'' createdByName,
ROWNUM rnum
FROM
REQ_FOR_RATING A,
FIRM B,
USR_DETL C,
SALE_OFFICE D,
QUOTE_SCENRIO E,
QUOTE_COV G,
COV_PLAN F,
COV_LKUP H,
CO_LKUP I
WHERE
A.FIRM_ID = B.FIRM_ID AND
A.SALE_REP_ID = C.USR_ID AND
C.SALE_OFFC_CD = D.SALE_OFFC_CD AND
A.REQ_FOR_RATING_ID=E.REQ_FOR_RATING_ID AND
E.QUOTE_SCENRIO_ID=G.QUOTE_SCENRIO_ID AND
G.QUOTE_COV_ID=F.QUOTE_COV_ID AND
G.COV_ID=H.COV_ID AND
I.CO_CD = F.CO_CD AND
TO_CHAR(F.CREATD_DT,'YYYYMMDD') > TO_CHAR(TO_DATE('07/16/2007', 'MM/DD/YYYY HH24:MI:SS'),'YYYYMMDD') AND
TO_CHAR(F.CREATD_DT,'YYYYMMDD') < TO_CHAR(TO_DATE('10/16/2007', 'MM/DD/YYYY HH24:MI:SS'),'YYYYMMDD')
and rownum <=?) where rnum >=? Parameters: [07/15/2007 00:00:00, 10/15/2007 23:59:59, 1117, 1]That's a SQL fault, not a JDBC/Java fault.
-
Select a range of rows to be displayed using ROWNUM
I am trying to select a range of records to be displayed using Rownum
It works using MINUS
SQL> select rownum,department_id,department_name from departments where rownum <= 20
minus
select rownum,department_id,department_name from departments where rownum < 11;
but does not work if a range is specified
select rownum,department_id,department_name from departments where rownum >= 11 and rownum <= 20;
What has gone wrong?
Details of what I have tried are as follows:
Connect to the sample schema HR
SQL> connect hr/hr
SQL> desc departments
Name Null? Type
DEPARTMENT_ID NOT NULL NUMBER(4)
DEPARTMENT_NAME NOT NULL VARCHAR2(30)
MANAGER_ID NUMBER(6)
LOCATION_ID NUMBER(4)
List all records in Departments
SQL> select rownum,department_id,department_name from departments;
ROWNUM DEPARTMENT_ID DEPARTMENT_NAME
1 10 Administration
2 20 Marketing
3 30 Purchasing
4 40 Human Resources
etc......
26 260 Recruiting
27 270 Payroll
27 rows selected.
List the first 10 records in DEPARTMENTS
SQL> select rownum,department_id,department_name from departments where rownum <= 10;
ROWNUM DEPARTMENT_ID DEPARTMENT_NAME
1 10 Administration
2 20 Marketing
etc.....
10 100 Finance
List row number from 11 to 20, but cannot no rows selected. Why?
SQL> select rownum,department_id,department_name from departments where rownum >= 11 and rownum <= 20;
no rows selected
Use of MINUS can retrieve row number from 11 to 20
SQL> select rownum,department_id,department_name from departments where rownum <= 20
minus
select rownum,department_id,department_name from departments where rownum < 11;
ROWNUM DEPARTMENT_ID DEPARTMENT_NAME
11 110 Accounting
12 120 Treasury
13 130 Corporate Tax
14 140 Control And Credit
15 150 Shareholder Services
16 160 Benefits
17 170 Manufacturing
18 180 Construction
19 190 Contracting
20 200 Operations
10 rows selected.For each row returned by a query, the ROWNUM pseudocolumn returns a number indicating the order in which Oracle selects the row from a table or set of joined rows. The first row selected has a ROWNUM of 1, the second has 2, and so on.
Conditions testing for ROWNUM values greater than a positive integer are always false. For example, this query returns no rows:
SELECT * FROM employees
WHERE ROWNUM > 1;
You can get the selected records based on the rownum using the inline query....
SQL> select rownum, empno from emp;
ROWNUM EMPNO
1 7369
2 7499
3 7521
4 7566
5 7654
6 7698
7 7782
8 7788
9 7839
10 7844
11 7876
ROWNUM EMPNO
12 7900
13 7902
14 7934
14 rows selected.
SQL> select * from (select rownum rn, empno from emp) where rn > 2 and rn < 5;
RN EMPNO
3 7521
4 7566 -
Needs help to retrive the last row in a select query without using rownum
Hi ,
i need to retrive the last row from the select sub query without using rownum.
is there any other way to retrive the last row other than the below query.
is that the ROWNUM=1 will always retrive the 1 row of the select query ?
select from*
*(select ename from employee where dept_id=5 order by desc) where rownum=1;*
Please advise.
thanks for your help advance,
regards,
Senthur957595 wrote:
Actually my problem is ithat while selecting the parents hiearchy of the child data using
CONNECT BY PRIOIR query
I need the immediate parent of my child data.
For example my connect BY query returns
AAA --- ROOT
BBB --PARENT -2
CCC --PARENT-1
DDD IS my input child to the connect by query
Immediate parent of my child data "DDD" ---> CCC(parent -1)
i want the data "CCC" from the select query,for that i am taking the last row of the query with rownum.
I got to hear that using ROWNUM to retrive the data will leads to some problem.It is a like a magic number.I am not sure what the problem will be.
So confusing with using this rownum in my query.
Please advice!!!It's not quite clear what you're wanting, but perhaps this may help?
you can select the PRIOR values to get the parent details if you want...
SQL> ed
Wrote file afiedt.buf
1 select empno, lpad(' ',(level-1)*2,' ')||ename as ename, prior empno as mgr
2 from emp
3 connect by mgr = prior empno
4* start with mgr is null
SQL> /
EMPNO ENAME MGR
7839 KING
7566 JONES 7839
7788 SCOTT 7566
7876 ADAMS 7788
7902 FORD 7566
7369 SMITH 7902
7698 BLAKE 7839
7499 ALLEN 7698
7521 WARD 7698
7654 MARTIN 7698
7844 TURNER 7698
7900 JAMES 7698
7782 CLARK 7839
7934 MILLER 7782
14 rows selected.(ok, not the best of examples as the mgr is already known for a row, but it demonstrates you can select prior data) -
Using Parameters in SQL-Query not only in where clauses
Hi,
I try to use Publisher parameters in the SQL Query from a Data Set.
All of them have default values.
So far, this is no problem, unless I try to use such a parameter value as an ordinary attribute value:
>
select
case when (:pv_Group = 'no') then "DM15D_BETRIEBSTEIL"."BETR_TEIL"
else :pv_some_Text end as Betr_Teil,
case when (:pv_Group = 'no') then "DM15D_BETRIEBSTEIL"."SUVA_NR_FORM"
else :pv_some_Text end as Suva_Nr,
case when (:pv_Group = 'no') then "DM15K_RIS_FAKTEN_PRO_BTT_JHR"."RIS_VOLLBESCH"
else sum("DM15K_RIS_FAKTEN_PRO_BTT_JHR"."RIS_VOLLBESCH") end as Vollbesch
from "GDWH05"
where
"DM15D_BETRIEBSTEIL"."SUVA_NR_FORM" in (:pv_nim100)
fetch first 65001 rows ONLY
>
The parameters 'pv_Group' and 'pv_nim100' are working fine. (when or where clauses)
The parameter 'pv_some_Text' unfortunately not. (simple literals)
When I try to validate the above SQL, I get the following Error:
<font color="red">
java.io.IOException: prepare query failed[nQSError: 43113] Message returned from OBIS. [nQSError: 46033] Datatype: 25 is not supported.
</font>
After use a cast function:
>
else CAST(:pv_some_Text AS CHARACTER)
>
I get this ERROR:
<font color="red">
java.io.IOException: prepare query failed[nQSError: 43113] Message returned from OBIS. [nQSError: 19002] Incorrect use of parameters. The parameters used in CAST cannot be resolved without ambiguity.
</font>
We use OBIEE 11.1.1.6.4 on a Win64-System.
Thank's for any help.Hi Alex,
let's leave away any unnecessary details.
This is the SQL, inserted in the window 'Edit Data Set' of BIP Data Model:
>
select
'--1' as Betr_Teil,
'--2' as Suva_Nr,
sum("GDWH05"."DM15K_RIS_FAKTEN_PRO_BTT_JHR"."RIS_VOLLBESCH") as Vollbesch
from "GDWH05"
where
"DM15D_BETRIEBSTEIL"."SUVA_NR_FORM" in ('122-4.4')
fetch first 65001 rows ONLY
>
Everything is fine when I click OK, the script goes back to the metadata.
Let's try this script with bind values in ORACLE SQL Developer.
This SQL is the physical part, found in the OBIEE-Log (Log level 5), except the bind values. Therefore we find, in the where clause, the join. In the logical sql, we don't have to join, because it's handled in the Common Enterprise Information Model (CEIM)
>
with
sawith0 as
select
sum(t39617.ris_vollbesch) as c1
from
dm15d_betriebsteil t39455,
dm15k_ris_fakten_pro_btt_jhr t39617
where
t39455.id_betriebsteil = t39617.id_betriebsteil
and t39455.suva_nr_form = '122-4.4'
select
d1.c1 as c1,
d1.c2 as c2,
d1.c3 as c3
from
select
:pv_some_text as c1,
:pv_some_text as c2,
sum(d1.c1) as c3
from
sawith0 d1
d1
where
rownum <= 65001
>
This SQL works fine, even with bind values for 'pv_some_text'.
But, when using the following SQL in the BIP Data Model:
>
select
:pv_Text as Betr_Teil,
:pv_Text as Suva_Nr,
sum("GDWH05"."DM15K_RIS_FAKTEN_PRO_BTT_JHR"."RIS_VOLLBESCH") as Vollbesch
from "GDWH05"
where
"DM15D_BETRIEBSTEIL"."SUVA_NR_FORM" in ('122-4.4')
fetch first 65001 rows ONLY
>
The following ERROR occurs:
<font color="red">java.io.IOException: prepare query failed[nQSError: 43113] Message returned from OBIS. [nQSError: 46008] Internal error: File server\Query\Optimizer\ServiceInterfaceMgr\Utility\Src\SQOIUTypeVisitor.cpp, line 643.</font>
In my opinion, either I use a wrong syntax, or BIP has a problem with parsing the script.
Thank you for your most welcome help. -
Using rownum in EJB-QL ..Pagination using CMP 2.1
Hi ,
Hope this is the right forum .. rather than JDBC .
My requirement is to implement Pagination using EJB2.1 on weblogic with Oracle DB. This is for an application which is quite old system and is not ready yet to be migrated to EJB3.0. So we are struck with EJB2.1 at the moment.
We are using EJB-QL to get Search result and now need to add Pagination logic in it. I can find weblogic.ejb.PreparedQuery.setMaxElements() API to specify the upper limit but what am looking for is a lower limit ..somthing like setFirstRow() ..
Can it be done using CMP Entity Bean 2.1 .. EJBQL or someother way ?
I have the sql for pagination but am not sucessful in translating it to EJB-QL
select * from
select /*+ FIRST_ROWS(n) */ a.*, ROWNUM rnum from
(your_query_goes_here) a
where ROWNUM <=:MAX_ROW_TO_FETCH
where rnum >= :MIN_ROW_TO_FETCH;
Thanks in advance ! I hope I get a solution soon ..
Edited to get some answers !!!
is it possible to use rownum in EJBQL ? I know rownum is specific to Oracle and my application will stay with Oracle. I get this exception
"EJB QL compilation encountered error: [EJB:013042]The Identifier 'rownum' is neither a cmp-field nor a cmr-field. Re-examine your query."
Edited by: user11305835 on Oct 12, 2009 10:48 PMBeevin
Both two are not even validated,
but with the first one as select max(c.id) from customer as c , in this case it is validated but while deploying it is error as , object must be return
But when i saw the ejb2.1 specification we can write this type of queries also ?
Is it problem with was any thing
Regards
Somaraju -
Issue While executing the Query for Pagination using ROWNUM with like
Issue While executing the Query for Pagination using ROWNUM with like.
Database is Oracle11G.
Oracle Database Table contains 8-9 lakh records
1) SQL equal (=)
SELECT /*+ FIRST_ROWS(n) */ ROWNUM RNUM, A.* FROM LINE A
WHERE A.REFERENCE = 'KMF22600920'
Execution Time:- 0.00869245 seconds
Returns 2 resultsets
2) SQL like (one %)
SELECT /*+ FIRST_ROWS(n) */ ROWNUM RNUM, A.* FROM LINE A
WHERE A.REFERENCE = 'KMF22600920%'
Execution Time:- 0.01094301 seconds
Returns 2 resultsets
3) SQL like (two%)
SELECT /*+ FIRST_ROWS(n) */ ROWNUM RNUM, A.* FROM LINE A
WHERE A.REFERENCE like '%KMF22600920%'
Execution Time:- 6.43989658 seconds
Returns 2 resultsets
In Pagination, we are using Modified version of SQL Query 3) with ROWNUM as mentioned below :-
4) SELECT * FROM (
SELECT /*+ FIRST_ROWS(n) */ ROWNUM RNUM, A.* FROM LINE A
WHERE REFERENCE like '%KMF22600920%' AND ROWNUM <= 20 ) WHERE RNUM > 0
Execution Time:- Infinite
ResultSets:- No as execution time is infinite
a) Instead of like if we use = in the above query it is returning the 2 resultsets (execution time 0.02699282 seconds)
b) Instead of two % in the above query, if use one example REFERENCE like 'KMF22600920%' it is returning the 2 resultsets (execution time 0.03313019 seconds)
Issue:- When using two % in like in the above query i.e. REFERENCE like '%KMF22600920%' AND ROWNUM <= 20 ) , it is going to infinite.
Could you please let us know what is the issue with two % used in like and rownum
5) Modified version of Option1 query (move out the RNUM condition AND RNUM <= 20)
SELECT * FROM (
SELECT /*+ FIRST_ROWS(n) */ ROWNUM RNUM, A.* FROM LINE A
WHERE REFERENCE like '%KMF22600920%' ) WHERE RNUM > 0 AND RNUM <= 20
Execution Time:- 7.41368914 seconds
Returns 2 resultsets
Is the above query is best optimized query which should be used for the Pagination or still can improve on this ?This would be easier to diagnose if there was an explain plan posted for the 'good' and 'bad' queries. Generally speaking using '%' on both sides precludes the use of any indexes.
-
Can we use rownum in procedures?
Hi,
Can we use rownum in procedures"
Thanks and regards
Gowtham Sen.here is some examples that might be of help.
SQL> set serveroutput on;
SQL> create or replace procedure get_employee(p_empno number) as
2 cursor c1(pEmpNo number) is
3 select e.rn, e.empno, e.ename
4 from (select rownum rn, empno, ename
5 from emp
6 order by empno) e
7 where e.empno = pEmpNo;
8 begin
9 for c1_rec in c1(p_empno) loop
10 dbms_output.put_line('The rownum is '||to_char(c1_rec.rn));
11 dbms_output.put_line('The employee name is '||c1_rec.ename);
12 end loop;
13 end;
14 /
Procedure created.
SQL> execute get_employee(7788);
The rownum is 8
The employee name is SCOTT
PL/SQL procedure successfully completed.
SQL> execute get_employee(7654);
The rownum is 5
The employee name is MARTIN
PL/SQL procedure successfully completed.
SQL> -
Hi,
I have 4 tables ( 1 parent - 3 child). Reference is the primary key/FK in these tables. Two of the child tables have 1..1 mapping with the parent table and I have created a view called data_view that would have all the essential columns from the parent + 2 child tables.
One of the child table (WORKFLOW) holds a 1.. m relationship with the parent table.
Now I want to move data from the 4 tables to two history
tables . One history table has the structure just similar to the data_view and the other history table has the same set of columns as the workflow table.
I tried to code a logic where by I insert the first 1000 rows into the history tables and then delete the same from the base tables. I placed this in a loop and gave the exit criteria as SQL%NOTFOUND
After inserting the first 1000 rows into the history tables and deleting the same from the base tables, the loops exits during the second iteration with the error, primary key constraint in the history table violated.
Am I missing something. Your comments on this would be appreciated
FUNCTION MOV(p_date DATE)
RETURN NUMBER
AS
BEGIN
LOOP
INSERT INTO HIST (
column_names(SELECT
column_names
FROM
dATA_VIEW
WHERE
TE_DATE <= P_DATE
AND REFERENCE NOT IN (SELECT REFERENCE FROM WORKFLOW WHERE PROCESSING_TYPE IN ('K','E'))
AND ROWNUM < 1000 );
EXIT WHEN SQL%NOTFOUND;
INSERT INTO WORKFLOW_HIST
(column_names)
(SELECT
column_names
FROM WORKFLOW
WHERE REFERENCE IN (SELECT reference FROM DATA_VIEW WHERE TE_DATE <= P_DATE
AND REFERENCE NOT IN (SELECT REFERENCE FROM WORKFLOW WHERE PROCESSING_TYPE IN ('K','E'))
AND ROWNUM < 1000));
DELETE FROM BASE CASCADE
WHERE REFERENCE IN ( SELECT reference FROM DATA_VIEW
WHERE TE_DATE <= P_DATE
AND REFERENCE NOT IN (SELECT REFERENCE FROM WORKFLOW WHERE PROCESSING_TYPE IN ('K','E'))
AND ROWNUM < 1000);
COMMIT;
END LOOP;
RETURN 0;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
ROLLBACK;
RETURN SQLCODE;
END MOV;
thanksHi,
The problem is just beacuse of ROWNUM..
SELECT REFERENCE FROM WORKFLOW WHERE PROCESSING_TYPE IN ('K','E'))
AND ROWNUM < 1000 );
Instead try this statement...
SELECT REFERENCE FROM (Select Reference from WORKFLOW WHERE PROCESSING_TYPE IN ('K','E')
Order By Reference)
Where ROWNUM <= 1000;
Sol is if you use "order by" inside a subquery and then use ROWNUM, it should solve your problem.
My suggestion is plz dont rely on ROWNUM on these kind of operations. You can get unexpected results.
You can also use ROWNUMBER() instead of ROWNUM.
Thanks... -
Creating Object views using XSU PL/SQL.Please SEE.
Hi,
I am presently using XSU PL/SQL utility with Oracle 9i and using the
DBMS_XMLQuery.newContext(<My Select clause goes here>,and the
DBMS_XMLQuery.getXML()which generates an XML document.
My query is:
I have 2 tables (One master and the other detail table.).
Table : DI_Master
di_num
00001
Table: DI_Details
di_num di_act
00001 ABCD
00001 ANCF
00001 IOPP
Now the XML I'd like is :
<di_num>00001</di_num>
<di_act>
<val>ABCD</val>
<val>ANCF</val>
<val>IOPP</val>
</di_act>
Do I need to create object tables for this,insert data into object tables
and then read this table? It will become an extremely tedious process
I guess an OBJECT view can do what I want.Can anyone please tell me how
to write an object view for the 2 tables please and the get the output as
desired.?Supposing you have further
nesting of the tables.Then how will you go about doing that.You can have multiple levels of CURSOR expressions (see an example below, not a real-life example, but illustrates the point).
SQL> set long 4000
SQL> select dbms_xmlquery.getXML('select deptno,' ||
2 'cursor(select empno, cursor(select losal, hisal from salgrade) salgrades '||
3 'from emp e where e.deptno = d.deptno and rownum < 3) EMPLOYEES ' ||
4 'from dept d where d.deptno = 10')
5 FROM DUAL;
DBMS_XMLQUERY.GETXML('SELECTDEPTNO,'||'CURSOR(SELECTEMPNO,CURSOR(SELECTLOSAL,HIS
<?xml version = '1.0'?>
<ROWSET>
<ROW num="1">
<DEPTNO>10</DEPTNO>
<EMPLOYEES>
<EMPLOYEES_ROW num="1">
<EMPNO>7782</EMPNO>
<SALGRADES>
<SALGRADES_ROW num="1">
<LOSAL>700</LOSAL>
<HISAL>1200</HISAL>
</SALGRADES_ROW>
<SALGRADES_ROW num="2">
<LOSAL>1201</LOSAL>
<HISAL>1400</HISAL>
</SALGRADES_ROW>
<SALGRADES_ROW num="3">
<LOSAL>1401</LOSAL>
<HISAL>2000</HISAL>
</SALGRADES_ROW>
<SALGRADES_ROW num="4">
<LOSAL>2001</LOSAL>
<HISAL>3000</HISAL>
</SALGRADES_ROW>
<SALGRADES_ROW num="5">
<LOSAL>3001</LOSAL>
<HISAL>9999</HISAL>
</SALGRADES_ROW>
</SALGRADES>
</EMPLOYEES_ROW>
<EMPLOYEES_ROW num="2">
<EMPNO>7839</EMPNO>
<SALGRADES>
<SALGRADES_ROW num="1">
<LOSAL>700</LOSAL>
<HISAL>1200</HISAL>
</SALGRADES_ROW>
<SALGRADES_ROW num="2">
<LOSAL>1201</LOSAL>
<HISAL>1400</HISAL>
</SALGRADES_ROW>
<SALGRADES_ROW num="3">
<LOSAL>1401</LOSAL>
<HISAL>2000</HISAL>
</SALGRADES_ROW>
<SALGRADES_ROW num="4">
<LOSAL>2001</LOSAL>
<HISAL>3000</HISAL>
</SALGRADES_ROW>
<SALGRADES_ROW num="5">
<LOSAL>3001</LOSAL>
<HISAL>9999</HISAL>
</SALGRADES_ROW>
</SALGRADES>
</EMPLOYEES_ROW>
</EMPLOYEES>
</ROW>
</ROWSET>
1 row selected.
SQL>
Also,isnt it a better option to create a VIEW of the
Select clause and pass a view to the select clause? At the end of the day, you could use whatever you feel comfortable with, provided that it produces your expected output and looks clean. We are just giving you the ideas, how you implement it actually in your situation, depends upon a lot of factors, that only you know about. -
How Oracle returns queries & using rownum
Hi, I need to limit query results using rownum, but my question is regarding how Oracle retrieves its data.
Assume I have a table containing 500 records and my query without using rownum will retrieve 62 of those records. The actual query will use rownum and limit results to 20.
I have a JSP that will display those first 20. It has a simple feature for pagination, a "next" button that will retrieve the next results. So far simple enough, going forwards is easy. But how about going back.
I am trying to work out the SQL for using a "previous" button, so for example, say records 40-60 are being displayed, and say the first record on that page has a primary key value of 200, what should the SQL be to retrieve the previous 20 records using rownum ? I ask because if I do:
select * from tablename where pri_key < 200 and rownum <=20;
I know it will retrieve 20 records, but would the query fetch its results from the beginning of the table or would it count backwards from 200 ? If it is the first way, how could I word the SQL query to go backwards from 200 ? I am pretty sure it will start from the beginning and thats what I don't want. I know there are pagination tags for jsp out there but I want to do this myself.
Thanks
Kevin
Message was edited by:
MrVenFirst, you need to understand that rownum is only assigned when a record is selected for output, it has nothing to do with any sort of internal order of the table (like insertion order). The same row can have a different rownum even for two invocations of the same query on the same data if the optimizer chooses a different access path. The only way to get a repeatable set of rownum is to sort the records by some field.
Second, any SQL statement you issue will be executed essentially in isolation. Oracle has no idea what query you executed previously. So, your query:
SELECT *
FROM tablename
WHERE pri_key < 200 and
rownum <=20;will select a random set of 20 rows wih a primary key less than 200. It is likely to be the first (i.e. lowest values of the pk) rows, but that is not guaranteed.
The cannonical way to paginate rows is something like:
SELECT col1, col2, ...
FROM (SELECT col1, col2, ..., rownum rn
FROM (SELECT col1, col2, ...
FROM table
WHERE <conditions>
ORDER BY pk) ti
WHERE rownum <= :maxrownum) to
WHERE rn >= :minrownumThe innermost query (with the <condition>) selects the appropriate rows and sorts them, in this case by the pk.
The middle query (rownum <- :maxrownum) discards the rows that would be after the last record you want to display. By using the maxrownum here, it gives Oracle information that allows it to do a fast sort on the inner query if possible.
In a fast sort, Oracle will get the first maxrownum rows from the query and sort them, then when it gets the next row, it checks if it is less than the highest value already found. If it is, it slots it into the correct place and discards the highest value, otherwise it discards that row.
The outermost query simply discards the records where the row number after sorting is less than the minimum value.
Another alternative may be:
SELECT col1, col2, ...
FROM (SELECT col1, col2, ...,
ROW_NUMBER() OVER(ORDER BY pk) rn
FROM table
WHERE <conditions>)
WHERE rn BETWEEN :minrownum AND :maxrownumdepending on your database version, and your actual query.
Note tha pagination like this is expensive.
HTH
John
The outermost -
Retreiving data from external DB using cursors (Native SQL)
Hi experts,
Iu2019m trying to use some functionality based on the Native SQL on an Oracle Server. Iu2019m facing some difficulties using cursors and fetching data from the external database.
Basically the synonym its zfisicc_c_dblink, and Iu2019m running the for the following code:
TRY.
OPEN CURSOR WITH HOLD c1 FOR SELECT *
FROM zfisicc_c_dblink
WHERE estado_sif = 'I'.
CATCH cx_sql_exception INTO sqlerr_ref.
PERFORM handle_sql_exception USING sqlerr_ref.
ENDTRY.
DO.
* "Move the data from the Cursor into the target area.
FETCH NEXT CURSOR c1 APPENDING TABLE tab.
IF sy-subrc 0.
EXIT.
ENDIF.
ENDDO.
CLOSE CURSOR c1.
The cursor C1 it's cursor type and the table tab it's ZFISICC_C_DBLINK type, but every time i run it it's giving me the ORA-932 error.
Database error text........: "ORA-00932: inconsistent datatypes: expected %s
got %s"
Can anyone help me on this error? What Iu2019m doing wrong when fetching the data ?
Another doubt that Iu2019ve it's when using pl/Sql procedure. Can anyone tell how I can retrieve data from the external database with the following code?
**Select Directo com Cursor
EXEC SQL.
CONNECT TO :gv_db_name AS 'dblink_con'
ENDEXEC.
IF sy-subrc NE 0.
WRITE: 'Não foi possível fazer a ligação à DBCON: ', gv_db_name.
ELSE.
EXEC SQL.
DECLARE CURSOR c_1 IS SELECT tipo_operacao FROM movimento_contribuicao
WHERE ROWNUM <= 10000;
wa movimento_contribuicao.tipo_operacao%type;
BEGIN
OPEN c_1;
LOOP
FETCH c_1 INTO wa; "Not able to return data to SAP system
EXIT WHEN c_1%NOTFOUND;
END LOOP;
END;
ENDEXEC.
EXEC SQL.
DISCONNECT 'dblink_con'
ENDEXEC.
ENDIF.
On the FETCH c_1 INTO wa; code Iu2019m moving the data to an Oracle variable, wa movimento_contribuicao.tipo_operacao%type;, and not to an program variable. Can anyone explain me this how this is +possible using this PL/SQL procedure?
Thanks in advance,
Best Regards
João Martins
Edited by: Rob Burbank on May 7, 2010 10:25 AMHi Joao,
Regarding your first question: It looks like there's a conversion problem (with one or more columns) from your Oracle table to your ABAP internal table.
In the following link you can see (in your case in the SELECT section) the type conversions used for each type combination.
Some combinations lead to an oracle error (specified in the "Result" column), like in your case (error 932).
http://help.sap.com/saphelp_470/helpdata/EN/a3/74caa1d9c411d1950e0000e8353423/content.htm
Regarding your second question: You can use the PERFORMING addition in the EXEC SQL statement.
You can see an example in the following link:
http://help.sap.com/saphelp_470/helpdata/EN/fc/eb3b8b358411d1829f0000e829fbfe/content.htm
Hope it helps.
Regards,
Ana Luisa. -
Issue regarding rownum in sql query
Hi All,
When I'm running the query below
select 'OP',
'ORG_CODE_PROVIDER',
rownum as ranking,
x.ORG_CODE_PROVIDER,
z.description,
x.value_count,
round(x.value_count / 200432, 4) * 100 as value_pct,
NULL as BATCH_KEY,
'9BED55A4328EFD71E040D20A143245E3' as BATCH_SET_KEY,
'OVERALL',
'OVERALL'
from (select ORG_CODE_PROVIDER, count(*) as value_count
from STAGING_TST.OP t
group by ORG_CODE_PROVIDER
order by count(*) desc, 1 asc) x,
(select code, description from ref_hd.MV_ORG_CODE_PROVIDER) z
where z.code(+) = x.ORG_CODE_PROVIDER
and rownum <= 10
it is showing me results based on the rownum of block x.
But when I try to insert these records in a table like
insert into QA_TST.OP_STAGE_COL_VAL_FREQ
select 'OP',
'ORG_CODE_PROVIDER',
rownum as ranking,
x.ORG_CODE_PROVIDER,
z.description,
x.value_count,
round(x.value_count / 200432, 4) * 100 as value_pct,
NULL as BATCH_KEY,
'9BED55A4328EFD71E040D20A143245E3' as BATCH_SET_KEY,
'OVERALL',
'OVERALL'
from (select ORG_CODE_PROVIDER, count(*) as value_count
from STAGING_TST.OP t
group by ORG_CODE_PROVIDER
order by count(*) desc, 1 asc) x,
(select code, description from ref_hd.MV_ORG_CODE_PROVIDER) z
where z.code(+) = x.ORG_CODE_PROVIDER
and rownum <= 10
On querying the table I'm getting totally different result based on the rownum governed by block y.
I could not able to understand why is it happening. Why oracle is not inserting the records that it is showing in select query.
Moreover, how can I fix this issue and get the desired result.
Thanks
TarunHi,
Whenever you post any code, indent it so that how it looks on the screen reflects what it is doing. In particular, make it easy to see what are the sub-queries. Whenever you post formatted text (such as query results as well as code) on this site, type these 6 characters:
\(small letters only, inside curly brackets) before and after each section of formatted text, to preserve spacing.
I originally posted an inaccurate answer becuase I couldn't understand your unformatted code.
How ROWNUM is assigned in a join depends on how the optimizer chooses to perform the join. If you want consistent results, then do the join first (in a sub-query), use ORDER BY clause in that sub-query, and use ROWNUM only in the parent query, which should not include a join.
The analytic ROW_NUMBER function is a lot more powerful and versatile than ROWNUM. You might look into using it (though the extra power may not be needed in this particular problem).
Edited by: Frank Kulash on Feb 10, 2011 11:29 AM -
Issue with complete refresh on materialized view when using rownum
Hi all,
I had an issue with rownum when using complete refresh
I am using rownum when creating materialized view and it is generation correctly.But the issue was when i am refreshing the same ,rownum was not getting sorted in ascending order.
anyone had come across this scenariorownum is determined as the row is output, so "order by rownum" does literally nothing.
http://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns009.htm -
I have had a mixed opinion for SQLCE support in windows phone 8/8.1. Is their still support for a local SQLCE or other database in windows phone 8.1? (A lot of different blog articles created their own handlers it appears and one used
an visual studio app called SQLmetal) I am hoping to at least figure out the libraries to use for Linq to SQL in windows phone 8.1 in order to access a local Database. I only need to retrieve data from a simple Database with one -
two tables and one of the tables has three fields.
I wish to access the local DB from a dll file even if I have to use Linq to SQL. The reason for this is to store data for a simple game while the app is running. However, I may need to send data to the database and would like to separate that
from the main application if possible. The only other question is: how do I add local database support to a dll file in windows phone 8.1? (This is my main objective but I need to know my database options first)
Once you eliminate the impossible, whatever remains, no matter how improbable, must be the truth. - "Sherlock holmes" "speak softly and carry a big stick" - theodore roosevelt. Fear leads to anger, anger leads to hate, hate leads to suffering
- Yoda. Blog - http://www.computerprofessions.co.nrWindows Phone Silverlight 8.1 apps can still use LINQ to SQL (System.Data.Linq) see:
http://msdn.microsoft.com/en-us/library/windows/apps/hh202860(v=vs.105).aspx
For Windows Phone 8.1 [runtime] app you would need to use an external library like
SQLite
There is a jumpstart training talk on using SQLite in Windows Phone 8.1 apps here:
http://channel9.msdn.com/Series/Building-Apps-for-Windows-Phone-8-1/19
I'm not sure what you mean by: "...access the local DB from a dll file..." Do you mean you want the library used to access the database to be portable across
platforms?
Eric Fleck, Windows Store and Windows Phone Developer Support. If you would like to provide feedback or suggestions for future improvements to the Windows Phone SDK please go to http://wpdev.uservoice.com/ where you can post your suggestions and/or cast
your votes for existing suggestions.
I saw the first link and I think I have already been through some of that tutorial on channel 9 already.
I'm not sure what you mean by: "...access the local DB from a dll file..." Do you mean you want the library used to access the database to be portable across platforms?
This would be a yes. I need use it to submit an application to the store (I wish to have the data and business logic in the dll file while having the GUI separate). I am currently using the portable dll but if you think using another dll type would help
I will try that. I am a VB.NET programmer and so I can see where some programmers get their worries about SQLCE (It seems a lot of VB and VB.NET programmers like it from my time helping on the VB.NET forums second to SQL Server only).
Once you eliminate the impossible, whatever remains, no matter how improbable, must be the truth. - "Sherlock holmes" "speak softly and carry a big stick" - theodore roosevelt. Fear leads to anger, anger leads to hate, hate leads to suffering
- Yoda. Blog - http://www.computerprofessions.co.nr
Nevermind, I changed the dll type to "Silverlight" and I can use the System.Data.Linq reference at least.
Once you eliminate the impossible, whatever remains, no matter how improbable, must be the truth. - "Sherlock holmes" "speak softly and carry a big stick" - theodore roosevelt. Fear leads to anger, anger leads to hate, hate leads to
suffering - Yoda. Blog - http://www.computerprofessions.co.nr
Maybe you are looking for
-
Hi Experts. Our requirement is to get the material group column in the output report of MCV1. I have searched the forum but couldn't find any thread regarding the same. So please advice whether it is possible or not? and if possible then what is the
-
I HAVE ADOBE ACROBAT PRO. IT WILL NOT OPEN/WORK.
HAVE HAD THIS SAME PROBLEM BEFORE. HPPSC217. WAS TOLD TO GO TO PHOTOSHOP AND DEACTIVATE ACROBATX PRO. WILL TRY RE-INSTALLING - DON'T KNOW WHAT ELSE TO DO.
-
Hi All We have the MDM setup as follows 1 Normal Repository serving the Preview environment 1 Master Repository 1 Slave Repository serving the Production environment The Slave Repository synchronizes itself with Master Repository using CLIX commands.
-
ADF Framework with Oracle BAM 11g
Can any one guide me for integrating Oracle BAM 11g with Oracle Application Developement Framework (Oracle ADF) ?Thanx in advance. Thanks & Regards, Amik
-
Hi, We need to delete unused queries. Please let me know is there any programme or any procedure to find out the list of unused queries more than 90 days. Thanks in Advance... Chetana.