Using ROWID returns less rows than if use distinct in query
Hi,
I am writting the following query to get distinct purchase order number from a specific received date. this returns me total 620 rows.:
select distinct pha.segment1 from apps.po_headers_all pha, apps.RCV_TRANSACTIONS rcv
where 1=1
and trunc(rcv.transaction_date) between to_date(:P_FROM_DATE,'YYYY/MM/DD HH24:MI:SS') and to_date(:P_TO_DATE,'YYYY/MM/DD HH24:MI:SS')
and pha.po_header_id=rcv.po_header_id
and pha.type_lookup_code='STANDARD'
and pha.authorization_status ='APPROVED'
and pha.cancel_flag='N'
if i write the query using ROWID to get the distinct Purchase order number its giving me 580 rows:
select pha.segment1 from apps.po_headers_all pha, apps.RCV_TRANSACTIONS rcv
where 1=1
and trunc(rcv.transaction_date) between to_date(:P_FROM_DATE,'YYYY/MM/DD HH24:MI:SS') and to_date(:P_TO_DATE,'YYYY/MM/DD HH24:MI:SS')
and pha.po_header_id=rcv.po_header_id
and rcv.rowid=(select max(rowid) from apps.RCV_TRANSACTIONS rcv where rcv.po_header_id=pha.po_header_id)
and pha.type_lookup_code='STANDARD'
and pha.authorization_status ='APPROVED'
and pha.cancel_flag='N';
Can anyone tell me why? I want to use this ROWID query in a valueset in oracle apps.
That's probably because some purchase orders have rcv transactions out of the range (p_from_date, p_to_date). You should include the condition on the dates in the (select max(rowid)...) subquery as well. And more generally, the first query seems like a better/simpler choice than the second one.
Hope it helps.
Similar Messages
-
Query returns more row than expected
1. select * from view_name where col1 = 'value1' returns 12 rows
2. select * from (view script) where col1 = 'value1' returns 24 rows
i have a view called view_name. If i use view_name directly in the query, it returns 12 rows. But if i use the select script directly in from clause, it returns more rows. I am not able to find out why it is happening so. Any pointers will be helpful.Are you saying that the SQL for view_name and view_script are identical? Can you post them?
-
Oracle view return more rows than its base query
O/S : AIX
Database : 11g R (11.1.0.6.0)
Query in questioon :
select A.CompanyCode, A.Code ElementCode, A.ItemTypeCode ElementItemTypeCode, A.SubcodeKey ElementSubcodeKey,
D.DecoSubcode01 SubCode01, D.DecoSubcode02 SubCode02, D.DecoSubcode03 SubCode03, D.DecoSubcode04 SubCode04,
D.DecoSubcode05 SubCode05, D.DecoSubcode06 SubCode06, D.DecoSubcode07 SubCode07, D.DecoSubcode08 SubCode08,
D.DecoSubcode09 SubCode09, D.DecoSubcode10 SubCode10, C.ItemTypeBCode, C.SubCode01B, C.SubCode02B, C.SubCode03B,
C.SubCode04B, C.SubCode05B, C.SubCode06B, C.SubCode07B, C.SubCode08B, C.SubCode09B, C.SubCode10B,
B1.ValueString SlipNo, B2.ValueString EmployeeCode, B3.ValueString SetNo, B4.ValueString SalesOrderCounterCode,
B5.ValueString SalesOrderCode, B6.ValueString Remarks, B7.ValueDecimal SumTareWeight, B8.ValueString PackingUMCode,
B9.ValueString PrimaryUMCode, B10.ValueString PlantCode, B11.ValueDecimal PackingFormCode, D.LogicalWarehouseCode FromWarehouseCode,
D.TemplateCode FromTemplateCode, D.PhysicalWarehouseCode FromPhysicalWarehouseCode, D.WHSLOCATIONWAREHOUSEZONECODE FromZoneCode,
D.WarehouseLocationCode FromLocationCode, E.LogicalWarehouseCode ToWarehouseCode, E.TemplateCode ToTemplateCode, E.PhysicalWarehouseCode ToPhysicalWarehouseCode,
E.WHSLOCATIONWAREHOUSEZONECODE ToZoneCode, E.WarehouseLocationCode ToLocationCode, D.TransactionDate, D.ItemTypeCode, E.WeightGross SumGrossWeight, E.WeightNet SumNetWeight
FROM Elements A, ADStorage B1, ADStorage B2, ADStorage B3, ADStorage B4, ADStorage B5, ADStorage B6, ADStorage B7,
ADStorage B8, ADStorage B9, ADStorage B10, ADStorage B11, GoodCutAndFentDetail C, StockTransaction D, StockTransaction E
where A.ABSUNIQUEID=B1.UNIQUEID and B1.NameEntityName='Elements' and B1.FieldName ='GoodCutAndFentSlipNo'
and A.ABSUNIQUEID=B2.UNIQUEID and B2.NameEntityName='Elements' and B2.FieldName ='GoodCutAndFentEmployee'
and A.ABSUNIQUEID=B3.UNIQUEID and B3.NameEntityName='Elements' and B3.FieldName ='GoodCutAndFentSetNo'
and A.ABSUNIQUEID=B4.UNIQUEID and B4.NameEntityName='Elements' and B4.FieldName ='GoodCutAndFentSOCounterCode'
and A.ABSUNIQUEID=B5.UNIQUEID and B5.NameEntityName='Elements' and B5.FieldName ='GoodCutAndFentSOCode'
and A.ABSUNIQUEID=B6.UNIQUEID and B6.NameEntityName='Elements' and B6.FieldName ='GoodCutAndFentRemarks'
and A.ABSUNIQUEID=B7.UNIQUEID and B7.NameEntityName='Elements' and B7.FieldName ='GoodCutAndFentTareWeight'
and A.ABSUNIQUEID=B8.UNIQUEID and B8.NameEntityName='Elements' and B8.FieldName ='GoodCutAndFentPackingUM'
and A.ABSUNIQUEID=B9.UNIQUEID and B9.NameEntityName='Elements' and B9.FieldName ='GoodCutAndFentPrimaryUM'
and A.ABSUNIQUEID=B10.UNIQUEID and B10.NameEntityName='Elements' and B10.FieldName ='GoodCutAndFentPlant'
and A.ABSUNIQUEID=B11.UNIQUEID and B11.NameEntityName='Elements' and B11.FieldName ='GoodCutAndFentPackingForm'
and A.CompanyCode=C.CompanyCode and SlipNo=C.SlipNo and C.SeqNo=1 and A.ItemTypeCode=C.ElementItemTypeCode
and A.SubcodeKey=C.ElementSubcodeKey and A.Code=C.ElementCode and A.CompanyCode=D.CompanyCode
and C.FromSTTransactionNumber=D.TransactionNumber and C.FromSTTransactionDetailNumber=D.TransactionDetailNumber
and A.CompanyCode=E.CompanyCode and C.ToSTTransactionNumber=E.TransactionNumber
and C.ToSTTransactionDetailNumber=E.TransactionDetailNumber
and SLIPNO='57575763636'
This query return 1 row.
Then i created a view on this query except condition SLIPNO='57575763636'
Now when i use the view as shown below return two rows.
select * from ViewGoodCutAndFent WHERE SLIPNO = '57575763636'
I am not able to determine where is problem area is. Thanks & RegardsIn the query SLIPNO is probably C.SlipNo
In the view SLIPNO is probably B1.ValueString -
Downstream server has less updates than the Upstream server.
Hi, I have a DSS (Downstream server) that syncs the metadata from a USS(Upstream server) at our place. I counted the number of updates in the database using the `IsLatestRevision` field in the revision table. They are different on both the WSUS servers.
The DSS has less updates than the USS. The query is as follows.
SELECT COUNT(*)
FROM [SUSDB].[dbo].[tbRevision]
where IsLatestRevision=1
Is this the proper way to count the number of updates, if yes, why there is a mismatch.
Please help, i am confused on this. Any help appreciated.Hi Suraj,
is the downstream server configured in autonomous mode (the default), or is it in replica mode? It's only in replica mode that all of the updates will be replicated.
If you find the answer of assistance please "Vote as Helpful"and/or "Mark as Answer" where applicable. This helps others to find solutions for there issues, and recognises contributions made to the community :) -
Using index in a query return few records than full table access
Today we have an issue with a query, when it use the ok index the returned are not all records that apply to where clause condition.
See bellow
explain plan for
select * from movdb.zan_m03 where
M00AF = TO_DATE('11/01/28','YY/MM/DD') AND
M00za = 10 AND
m00AC = 50 AND
M00AD between 136906 and 136999
SELECT * FROM TABLE(dbms_xplan.display);
PLAN_TABLE_OUTPUT
Plan hash value: 1882720105
| Id | Operation | Name |
| 0 | SELECT STATEMENT | |
| 1 | TABLE ACCESS BY INDEX ROWID| ZAN_M03 |
|* 2 | INDEX RANGE SCAN | PK_ZAN_M03 |
Predicate Information (identified by operation id):
PLAN_TABLE_OUTPUT
2 - access("M00AF"=TO_DATE('11/01/28','YY/MM/DD') AND "M00ZA"=10 AND
"M00AC"=50 AND "M00AD">=136906 AND "M00AD"<=137141)
filter("M00AD"<=137141 AND "M00AD">=136906)
Note
- rule based optimizer used (consider using cbo)
20 rows selected.
The query above return only one row insted 1579 record that apply to this conditions.
When forcing a full table acess with a hint, the query return all records that apply, the 1579 record.
select /*+ FULL(zan_m03) */ M00AF, M00za, m00AC , M00AD from movdb.zan_m03 where
M00AF = TO_DATE('11/01/28','YY/MM/DD') AND
M00za = 10 AND
m00AC = 50 AND
M00AD between 136906 and 137141
Can you help me to identify what's happening?
I am with Oracle 10g R2 10.2.0.4 standard edition
the statistics are up to date
the opitimizer_mode are rule, but altering in session level to all_rows happens the same issue.
Nothing about corruption in the alert log.
Thanks in advance
Regards
CristianoYes the query are the same and correct restriction for where clause are M00AD between 136906 and 137141.
I've pasted, by mistake, another test query
The corrects are:
select M00AF, M00za, m00AC , M00AD from movdb.zan_m03 where
M00AF = TO_DATE('11/01/28','YY/MM/DD') AND
M00za = 10 AND
m00AC = 50 AND
M00AD between 136906 and 137141
This use pk index and return one row
select /*+ FULL(zan_m03) */ M00AF, M00za, m00AC , M00AD from movdb.zan_m03 where
M00AF = TO_DATE('11/01/28','YY/MM/DD') AND
M00za = 10 AND
m00AC = 50 AND
M00AD between 136906 and 137141
This does a full table access and return 1579 records
I´ve been searching for wrong results bugs on my oracle support, but not found one that mentions something like our issue.
I checked the dba_tables and dba indexes and the number of rows are different, and I think this would be the same because it's is a pk.
Look this
SQL> select NUM_ROWS from dba_tables where table_name = 'ZAN_M03'
2 /
NUM_ROWS
228527878
select NUM_ROWS from dba_indexes where index_name = 'PK_ZAN_M03';
SQL> select NUM_ROWS from dba_indexes where index_name = 'PK_ZAN_M03';
NUM_ROWS
217510185
Is normal a index for pk having much fewer rows than table? I think not, but not sure.
Again
Thanks in advance
Regards
Cristiano -
Had a problem with newest update and the advice from turingtest2 resolved my problem just to say thanks! Had never used this route before so was less painful than thought it would be again thanks.
how can i find out what the fix is that works..please
-
Problem with database control returning multiple rows as Array using Oracle
Has anybody using Oracle gotten a Database control that
returns multiple rows to work returning an array?
The only way I can seem to return multiple rows is by returning
a RowSet. Returning an array gives me a NullPointerException
(when called within a pageFlow). When calling a database control
that returns an array from a web service I get a
"java.sql.SQLException: ResultSet has no more data." error.
The samples using the pointbase database seem to work, but when I
converted the CustomerDBClient web service to use Oracle, it starts
failing on calling the database control that returns an array
with: "java.sql.SQLException: ResultSet has no more data."
Has anybody gotten this to work using Oracle?
I'm also having some problem returning an Iterator. It seems
to work when called from a web service, but returns nothing
if called from a page flow.
I'm using Oracle 8.1.7 and WebLogic 8.1.
EricDo you need a particular service pack installed to return an array of custom object?
I am getting a ResultSet contained no data error when trying.
Thanks,
-Thomas
"Robin Karlin" <[email protected]> wrote:
>
Eddie O'Neil <[email protected]> wrote:
All--
Unfortunately, returning an Iterator to a JPF (or JSP) from a
database control is broken in WLW 8.1, though it will work inside of
a
JWS or JCS.
There shouldn't be a problem with returning an array of objects out
of Oracle to the JPF, and if you need an Iterator specifically, youcan
wrap the array in an Iterator implementation.
Sorry for the inconvenience.
Eddie
Lenny wrote:
I have gotten it to work on Oracle using Array:)
However, I haven't gotten it to work on Oracle using Iterator:( Itis so
simple, but doesn't work:(
"Eric Dokken" <[email protected]> wrote in message
news:[email protected]...
Has anybody using Oracle gotten a Database control that
returns multiple rows to work returning an array?
The only way I can seem to return multiple rows is by returning
a RowSet. Returning an array gives me a NullPointerException
(when called within a pageFlow). When calling a database control
that returns an array from a web service I get a
"java.sql.SQLException: ResultSet has no more data." error.
The samples using the pointbase database seem to work, but when I
converted the CustomerDBClient web service to use Oracle, it starts
failing on calling the database control that returns an array
with: "java.sql.SQLException: ResultSet has no more data."
Has anybody gotten this to work using Oracle?
I'm also having some problem returning an Iterator. It seems
to work when called from a web service, but returns nothing
if called from a page flow.
I'm using Oracle 8.1.7 and WebLogic 8.1.
Eric
I get the same error that Eric reported when trying to return an Array
of objects.
It is really frustrating because I can't use much of the built-in control
logic
that WLW provides. All I did was create a data pool for Oracle and a
datasource.
I modified the sample app in C:\bea81\weblogic81\samples\workshop\SamplesApp\WebApp\callJavaControl
to point to that datasource and I get the error that Eric reports above.
Can
anyone help me out????
Thanks,
Robin -
SCAN_Op returns one less sample than expected.
I'm acquiring data from a SCXI chassis using a WinXP P4 computer. Sometimes when I run my app, SCAN_Op returns one less sample than it should. Looking at the data array, it appears that one sample is missing down in the array where there should be a reading from the first channel. The rest of the readings are all shifted up by one and the first of these is garbage. The rest are correct. This only happens some of the time, but when it does, it happens no matter how many modules I'm using in the chassis (I've tried up to three at once). It also happens using just one high voltage module, As a result, the data I send to SCAN_Demux is incorrect and comes out scrambled. I've checked my inputs to the function repeatedly and am confid
ent they are correct. I am in debug mode when this happens. So far, I haven't seen it happen in release mode. Has anyone seen this condition?Hello,
I am not sure exactly what could be causing this problem. However, we could try something.
Try allocating your memory as an i32 array that is half the size of the array that you want. This will force memory to be allocated slightly differently. Then just typecast your array whenever you need to use it.
I know this has fixed some alignment issues in the past.
Let us know if this does not work.
Best regards,
Justin T.
National Instruments -
How I can delete a row using a simple query?
SZSLIFE_SPRIDEN_PIDM SZSLIFE_SGBSTDN_TERM_CODE_EFF SZSLIFE_SLRRASG_BLDG_CODE SZSLIFE_SLRRASG_ROOM_NUMBER SZSLIFE_SLRRASG_BEGIN_DATE SZSLIFE_SLRRASG_END_DATE
48547 199890
48547 199990
48547 199990 BLU 205 09/03/1999 12/23/1999
48547 200010
48547 200010 BLU 205 01/25/2000 05/25/2000
48547 200090
48547 200090 MOR 406 09/03/2000 12/23/2000
48547 200110
48547 200110 MOR 406 01/25/2001 05/25/2001
48547 200190
48547 200210
48547 200290
48547 200310
48547 200390
48547 200410
48547 200610
Here is what a simple question is probably for some of you; I can not get this to work. I need to delete all the rows that are duplicate like row #2 with the same SZSLIFE_SGBSTDN_TERM_CODE_EFF but with not
SZSLIFE_SLRRASG_BLDG_CODE and SZSLIFE_SLRRASG_ROOM_NUMBER
I need to write a code where it counts the SZSLIFE_SGBSTDN_TERM_CODE_EFF and if it have the same (2 times.
I need to delete the row without SZSLIFE_SLRRASG_BLDG_CODE and SZSLIFE_SLRRASG_ROOM_NUMBER
The SZSLIFE_SLRRASG_BLDG_CODE NEEDS to be not null, because I do an insert in this table I need to be able to insert null values.
How I can use a simple query where I can delete all the duplicate records without bldg_code and room number…
Here is the table description
SZSLIFE_SPRIDEN_PIDM NUMBER(8)
SZSLIFE_SPRIDEN_ID VARCHAR2(10)
SZSLIFE_SPRIDEN_LAST_NAME VARCHAR2(60)
SZSLIFE_SPRIDEN_FIRST_NAME VARCHAR2(60)
SZSLIFE_SPRIDEN_MI VARCHAR2(15)
SZSLIFE_SGBSTDN_TERM_CODE_EFF VARCHAR2(6)
SZSLIFE_SGBSTDN_STST_CODE VARCHAR2(2)
SZSLIFE_STVSTST_DESC VARCHAR2(30)
SZSLIFE_SGBSTDN_STYP_CODE VARCHAR2(2)
SZSLIFE_STVSTYP_DESC VARCHAR2(30)
SZSLIFE_SGBSTDN_LEVL_CODE VARCHAR2(2)
SZSLIFE_STVLEVL_DESC VARCHAR2(30)
SZSLIFE_SGBSTDN_RESD_CODE VARCHAR2(10)
SZSLIFE_STVRESD_DESC VARCHAR2(40)
SZSLIFE_SLRRASG_BLDG_CODE VARCHAR2(10)
SZSLIFE_SLRRASG_ROOM_NUMBER VARCHAR2(10)
SZSLIFE_SLRRASG_BEGIN_DATE VARCHAR2(12)
SZSLIFE_SLRRASG_END_DATE VARCHAR2(12)
SLRRASG_ASCD_CODE VARCHAR2(2)
I will appreciate any help!
SLRRASG_ROLL_IND VARCHAR2(2)Thank you very much Sandeep, this works!
1 DELETE SZSLIFE_TEMP2
2 WHERE
3 SZSLIFE_SGBSTDN_TERM_CODE_EFF
4 IN
5 (SELECT SZSLIFE_SGBSTDN_TERM_CODE_EFF
6 FROM SZSLIFE_TEMP2
7 GROUP BY
8 SZSLIFE_SGBSTDN_TERM_CODE_EFF
9 HAVING COUNT(*) > 1)
10 AND
11* SZSLIFE_SLRRASG_BLDG_CODE = ' '
12 /
4 rows deleted.
The only thing here is that the SZSLIFE_SLRRASG_BLDG_CODE can not be defined as a a NULL, so I can not use
where SZSLIFE_SLRRASG_BLDG_CODE is null
Here is how those two columns are define:
SZSLIFE_SLRRASG_BLDG_CODE VARCHAR2(10)
SZSLIFE_SLRRASG_ROOM_NUMBER VARCHAR2(10)
So,
my question is it will be safe to do SZSLIFE_SLRRASG_BLDG_CODE = ' ' ?
Again, it works, it deleted the rfows that I wanted...
Thank you very much!!!
Rogelio -
Display distinct rows from Oracle table without using "DISTINCT" keyword.
How to retrieve distinct rows from oracle table without using 'DISTINCT' keyword in SQL?
Thanks in advance.
MihirWelcome to the forum.
Besides GROUP BY you can use UNIQUE instead of DISTINCT as well, but that's probably not wanted here ;) , and the ROW_NUMBER() analytic:
SQL> create table t as
2 select 1 col1 from dual union all
3 select 1 from dual union all
4 select 2 from dual union all
5 select 3 from dual union all
6 select 4 from dual union all
7 select 4 from dual;
Table created
SQL> select col1 from t;
COL1
1
1
2
3
4
4
6 rows selected
SQL> select distinct col1 from t;
COL1
1
2
3
4
SQL> select unique col1 from t;
COL1
1
2
3
4
SQL> select col1 from t group by col1;
COL1
1
2
3
4
SQL> select col1
2 from ( select col1
3 , row_number() over (partition by col1 order by col1) rn
4 from t
5 )
6 where rn=1;
COL1
1
2
3
4 -
Custom database functoid to return multiple rows from database
Hi,
I have created a custom database fucntoid to execute a stored procedure which returns just single row from the database.But I could not manage to return multiple rows from the database.
Does anyone know how to return multiple rows from DB and create a node with that many occurrences in the target schema?
Thanks
JBIf you want to do this in messaging-only way without orchestration, then only option let to you is using .NET in BizTalk:
We had similar requirement with one of our clients, where they didn’t want to use orchestration (though we emphasised on less impact orch would have compared to manageability),
they still wanted to have pure-messaging only.
We extended the custom XslTransform component that ships with BizTalk SDK (<BizTalk installation directory>\SDK\Samples\Pipelines\XslTransformComponent)).
Created a custom disassembler pipeline component, used the XslTransform component from SDK to execute the map’s XSLT. Here we created a map with every links except the database ones. After executing the map, access the database, execute the store procedure
which returns more than one row/dataset, enrich the XSLT transformed message with the dataset from your database in disassembler.
Since .NET gives you the flexibility of access the dataset with more than one row, you can enrich the message in custom pipeline code.
Other option is code the message transformation completely in .NET code in custom disassembler by passing the received message to method/code which would code the map/enrichment.
While enriching you can execute the store procedure which returns more than one row/dataset, enrich the message further with the dataset from db.
If this answers your question please mark it accordingly. If this post is helpful, please vote as helpful by clicking the upward arrow mark next to my reply. -
The simplest way for plsql procedure to return multiple rows
Hi,
What is the simplest way for plsql procedure to return multiple rows (records). There are many combination of ways to do it but I am looking for a solution that is appropriate for plsql beginners. Many solutions use cursors, cursor variables, collections and more that kind of things that are complex on the face of it. Is it somehow possible to achieve the same with less effort?
Sample query would be: SELECT * FROM EMPLOYEES;
I want to use returned rows in APEX to compose APEX SQL(in that context plsql) report.
It is enough to use just SELECT * FROM EMPLOYEES query in APEX but I want to use plsql procedure for that.
Thank you!Hi,
It depends :-).
With +...that is appropriate for plsql beginners...+ in mind... it still depends!
The list of techniques (ref cursors, cursor variables, collections, arrays, using explict SQL) you have referenced in your post can be made to work. but...
+Is it somehow possible to achieve the same with less effort?+ Less effort : That needs to be defined (measured). Especially in the context of pl/sql beginners (who is a beginner?) .
What is the level of "programming experience" ?
What is the level of understanding of "Relational Result set" as processible in Oracle?
If you are looking for
Process_the_set_of rows_in APEX () kind of capabilitywhich "abstracts/hides" relation database from developers when working on relation database, it may not be the best approach (at least strategically). Because I believe it already is abstracted enough.
I find REF CUROSOR most effective for such use, when the "begginer" has basic understanding of processing SQL result set .
So in a nut shell, the techniques (that you already are familiar with) are the tools available. I am not aware of any alternative tools (in pure Oracle) that will simplify / hide basics from develpers.
vr,
Sudhakar B. -
How to make an index use in a query execution
Hi,
I have the below query for which ename column has an index. As of my knowledge below queries 1st and 2st will not use index. Hence i used the 3rd statement and that too its not using the index. Finally i used the 4th query, but even the 4th query is not using the index. Then how do i make this query to use my index??? Do i need to create a function based index for this??? Is that the final option????
1. select * from emp where ename !='BH' ;
2. select * from emp where ename <> 'BH';
3. select * from emp where ename not in ('BH');
4. select * from emp where ename < 'BH' or ename > 'BH';
Regards,
007
Edited by: 007 on Jun 6, 2013 7:56 AM
Edited by: 007 on Jun 6, 2013 8:06 AM
Edited by: 007 on Jun 6, 2013 8:06 AM
Edited by: 007 on Jun 6, 2013 8:06 AM
Edited by: 007 on Jun 6, 2013 8:12 AMSorry 007, I really thought you were posting a trick question as on the OCP tests.
Anyway, as Justin mentioned, if you have an index on ename, it may be used when doing a comparison predicate statement with the ename value.
What it depends on are several other things: stats, how many rows in the table, use of an index hint, etc.
Rather than questioning the group on this, why not just turn on autotrace and run the query for the different scenarios.
The output will show you if it used the index, number of rows returned, blocks read, etc.
SQL> create table emp (ename varchar2(40));
Table created.
SQL> insert into emp select username from sys.dba_users;
25 rows created.
SQL> commit;
Commit complete.
SQL> set autotrace on
SQL> select * from emp where ename != 'SYSTEM';
Execution Plan
Plan hash value: 2951343571
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 24 | 528 | 1 (0)| 00:00:01 |
|* 1 | INDEX FULL SCAN | ENAME_IDX | 24 | 528 | 1 (0)| 00:00:01 |
Predicate Information (identified by operation id):
1 - filter("ENAME"<>'SYSTEM')As you can see, the above used an index, even though there were only 25 rows in the table.
You can test each of your scenarios, one by one, including use of a hint. -
Returning Multiple Rows From DBAdapter Calling PL/SQL Procedure
Oracle XE 10g Express Edition
JDeveloper 11.1.1.2.0
WebLogic Server 11g
Guys,
I have a table of orders, which I need to interrogate, and pass back any matching rows which meet certain criteria (e.g. status = 'OPEN').
However, rather than create a DBAdapter using an Operation Type of "Peform an Operation on a Table/Select", I need to use an Operation Type of "Call a Stored Procedure or Function".
I therefore need the procedure to return all the matching rows, rather than a single row.
I have looked at declaring return parameters for the procedure of the following types:
RECORD - is good because it allows me to return the elements of the row with their correct datatypes, but does not meet my needs because it will only support the return of a single row.
VARRAY - good because it can contain many row elements, but not good because it only supports a single row return, and also because all elements of the VARRAY must be of the same data type.
TABLE - good because it can contain many rows, but bad because each row can contain only two elements - the index element and the data element.
I think I could first define a RECORD (to hold a row), and then define a TABLE, with the data element being the RECORD, but I have found JDeveloper very fussy indeed when dealing with 'non-standard' data types in the DBAdapter.
Apologies if I am missing something obvious, but can anyone suggest a way of doing this?
Many thanks in advance.
Edited by: user2541290 on 17-Feb-2010 02:48Hi, I've been able to create process that seems to work. My platform is a but different but I don't think this is important for your question.
Here is the PL/SQL code. Just make Db Adapter for Calling stored procedure and it returns all rows!
Be aware of possible limitations on how manyrows you could return in one select! This can have severe impact on performance.
Succes.
Jos Baan
CREATE OR REPLACE PACKAGE lab2_multiple_rows IS
-- Author : 801455
-- Created : 18-2-2010 8:05:52
-- Purpose :
-- Public type declarations
TYPE rrows IS RECORD(
mutdat DATE,
opmerking VARCHAR2(20));
TYPE trows IS TABLE OF rrows INDEX BY BINARY_INTEGER;
-- Public constant declarations
-- Public variable declarations
-- Public function and procedure declarations
FUNCTION retrows RETURN trows;
END lab2_multiple_rows;
CREATE OR REPLACE PACKAGE BODY lab2_multiple_rows IS
-- Private type declarations
-- Private constant declarations
-- Private variable declarations
-- Function and procedure implementations
FUNCTION retrows RETURN trows IS
lrows trows;
lidx binary_integer := 1;
BEGIN
FOR rsql IN (SELECT t.* FROM jba_transactions t ORDER BY t.mutdat)
LOOP
lrows(lidx).mutdat := rsql.mutdat;
lrows(lidx).opmerking := rsql.opmerking;
lidx := lidx + 1;
END LOOP;
RETURN(lrows);
END;
BEGIN
-- Initialization
NULL;
END lab2_multiple_rows;
Edited by: Baan, Jos on 18-feb-2010 8:53 -
DECODE is not working in WHERE clause when subquery returns more rows
Hi Gurus,
I want to write a query on CCENTERS table(Script given below) and expect the following result:
1. When I pass a value of 0 for ID, It returns all the rows given in the table.
2. When I pass a value other than 0, It returns the row for the given value as well as all its child records.
CCENTER has parent-child relationship in ID and BASE column. I am using a query with DECODE function. but DECODE function in WHERE clause is not capable of handling sub-query with multiple rows.
VARIABLE ParaCCenter NUMBER
BEGIN
:paraccenter:=0;
END;
CREATE TABLE ccenters
(id NUMBER,
name VARCHAR2(20),
base number);
INSERT INTO ccenters VALUES(1,'NUST',null);
INSERT INTO ccenters VALUES(2,'SEECS',1);
INSERT INTO ccenters VALUES(3,'NBS',1);
commit;
SELECT * FROM ccenters
WHERE id IN DECODE(:ParaCCenter, 0, id,
(SELECT id FROM ccenters
START WITH base=:ParaCCenter
CONNECT BY PRIOR id = base
UNION
SELECT :ParaCCenter FROM dual
BEGIN
:paraCCenter:=1;
END;
SELECT * FROM ccenters
WHERE id IN DECODE(:ParaCCenter, 0, id,
(SELECT id FROM ccenters
START WITH base=:ParaCCenter
CONNECT BY PRIOR id = base
UNION
SELECT :ParaCCenter FROM dual))
The result is
(SELECT id FROM ccenters
ERROR at line 3:
ORA-01427: single-row subquery returns more than one row
How this query can be rewritten for the given functionality. Any response will be highly appreciated.
ThanksAnd if you want to use DECODE:
SQL> BEGIN
2 :paraccenter:=0;
3 END;
4 /
PL/SQL procedure successfully completed.
SQL> select *
2 from ccenters
3 where :paraccenter = decode(:paraccenter,0,0,id)
4 /
ID NAME BASE
1 NUST
2 SEECS 1
3 NBS 1
SQL> BEGIN
2 :paraccenter:=2;
3 END;
4 /
PL/SQL procedure successfully completed.
SQL> select *
2 from ccenters
3 where :paraccenter = decode(:paraccenter,0,0,id)
4 /
ID NAME BASE
2 SEECS 1
SQL> SY.
Maybe you are looking for
-
3 Ipod Shuffles have crapped out on me
I purchased a second generation Ipod Shuffle in December. It worked well for about a month and then I kept getting the message that my Ipod could not be updated. The Disk could not be read from or written to. I returned it to Best Buy and got a new o
-
In Snow Leopard, Autofill cannot see the Access file.
For years this MacBookPro running older OS X versions had no problem with autofill accessing the Access Keychain or the Address Book. I relied on it andit was always there. But ever since I installed and updated Snow Leopard, autofill fails nearly ev
-
One Workcenter for multiple machines and multiple labor.
ZHi, I have to map a scenario in which i have 10 machines, that do same operation, have same cycle time for product, same capacity. So i have clubbed these together and maintained "No. of Individual Capacities" in workcenter as 10 and created 1 workc
-
ComponentWorks and Visual C++ 6.0
How do I load the ComponentWorks 2.0.1 Controls in Visual C++ 6.0 ? Caroline Catel | mailto:[email protected] SINFOR Rhone-Alpes | Phone: (+33|0) 4 72 13 56 00 10 Place Charles Beraudier | Fax: (+33|0) 4 72 13 56 01 F-69428 LYON Cedex 03 | Web: http:
-
Enterprise Portal: Testing Components Example
Hello, I am developing enterprise portal component iviews which also connects to a SAP R3 backend system. For a long time I am searching for automatic testing tools or guides for that. But only the very short documentation about the Enterprise Portal