[CLOSED] MAX returning two rows
Hi all,
I need to write a query that return 1 row.
If 'part 1' returns a value, the query needs to return null. If 'part 1' returns multiple values for latest_date, I need to return the latest of the dates.
Currently, this is the query I have. However this query returns more than 1 row.
Anny pointers are appreciated. Thanks
select Max(transaction_table.latest_date)
,transaction_table.status
from
---part 1
(select
sysdate latest_date
,'hello' status
from dual
UNION
--part 2
select
NULL latest_date
,NULL status
from dual) transaction_table
group by transaction_table.status;
RESULT:
MAX(TRANSACTION_TABLE.LATEST_DATE) STATUS
17-MAR-08 hello
2 rows selected
Message was edited by:
user594688
THANK YOU for all the replies
Hi,
max funtion never returns two rows :-)
If 'part 1' returns a value, the query needs to
return null. If 'part 1' returns multiple values for
latest_date, I need to return the latest of the
dates.It can't dual always return 1 row.
So, why do you need part 2?
>
Currently, this is the query I have. However this
query returns more than 1 row.
This will make your query return one row, but that's probably not what you want:
SQL> with md AS
2 (select max(latest_date) max_date
3 from
4 ---part 1
5 (select sysdate latest_date
6 ,'hello' status
7 from dual
8 UNION
9 --part 2
10 select NULL latest_date
11 ,NULL status
12 from dual))
13 select transaction_table.*
14 from md
15 ,(select sysdate latest_date
16 ,'hello' status
17 from dual
18 UNION
19 select NULL latest_date
20 ,NULL status
21 from dual) transaction_table
22 where md.max_date = transaction_table.latest_date;
LATEST_DA STATU
17-MAR-08 hello
1 row selected.Regards
Peter
Similar Messages
-
Returning two rows with one column containing only one place
Dear all;
I have a query that returns two rows similar to this below
ID PLACE PROGRAM
A NEWYORK PROGRAM A
A NEWYORK PROGRAM B
I would like this instead
ID PLACE PROGRAM
A NEWYORK PROGRAM A
PROGRAM B
All help is appreciated. Thank you.Edited by: user13328581 on Mar 22, 2011 11:52 AMuser13328581 wrote:
WOW...THanks a lot Solomon, I have never used partitions and row_number in such a manner...can you please explain your logic.Sure:
row_number() over(partition by id order by place,program)This will take all rows returned by the query andsplit them into buckets (partitions) by id. Inside each bucket it will order rows by place and program and assign them row numbers. So for each ID row number 1 will be row with first (alphabetically) place first programt. And this is the row where we want ID to show up. That is why we wrap the above analytic function in CASE statement which will do exactly that. Now:
row_number() over(partition by id,place order by program)does pretty much the same just bucket is ID and PLACE combination. So for each such combination we want to show only for the first (alphabetically) programt.
Now notice in ORDER BY clause I prefix ID and PLACE with table alias. You must do it since otherwise query alias ID and PLACE will take precedence resulting in wrong sort order (remember we nulled all ID and PLACE except for row number 1).
SY. -
Pie graph slice derivation returning two rows
Hi All,
I have a requirement to derive the series name when the user clicks on a pie graph's series.
Below is my pie graphs code
<dvt:pieGraph id="pieGraph1"
value="#{bindings.DashboardTransPieVO1.graphModel}"
subType="PIE" threeDEffect="true"
animationOnDisplay="auto"
seriesRolloverBehavior="RB_HIGHLIGHT"
dynamicResize="DYNAMIC_SIZE" style="Default"
partialTriggers="::cil2"
clickListener="#{viewScope.DashboardScreenBean.drillPie}"
drillingEnabled="true">
<dvt:background>
<dvt:specialEffects/>
</dvt:background>
<dvt:graphPieFrame/>
<dvt:seriesSet>
<dvt:series/>
</dvt:seriesSet>
<dvt:legendTitle text="#{ethuiBundle.TRANSACTION_STATES}"
rendered="true"/>
<dvt:graphFootnote text="Footnote" rendered="false"/>
<dvt:sliceLabel>
<dvt:numberFormat numberType="NUMTYPE_GENERAL"
decimalDigit="0"/>
</dvt:sliceLabel>
<dvt:pieLabel rendered="false"/>
<dvt:graphSubtitle text="Subtitle" rendered="false"/>
<dvt:graphTitle text="Title" rendered="false"/>
</dvt:pieGraph>
I am using following code for that in clickListener of pie graph:
ComponentHandle handle = clickEvent.getComponentHandle();
if (handle instanceof DataComponentHandle)
DataComponentHandle dhandle = (DataComponentHandle)handle;
// Get the value displayed in the series
System.out.println(" @@@@Value: " + dhandle.getValue(DataComponentHandle.UNFORMATTED_VALUE));
// Get the series attributes
Attributes [] seriesInfo = dhandle.getSeriesAttributes();
if(seriesInfo != null)
for(Attributes attrs: seriesInfo)
System.out.println(" @@@@Series value: " + attrs.getValue(Attributes.LABEL_VALUE));
System.out.println(" @@@@Series name: " + attrs.getValue(Attributes.LABEL_ATTRIBUTE));
System.out.println(" @@@@Series value id: " + attrs.getValue(Attributes.ID_VALUE));
System.out.println(" @@@@Series name id: " + attrs.getValue(Attributes.ID_ATTRIBUTE));
The issue is it is returning me two rows for Attributes array. The first row is containing nulls in Attributes array with the exception of ID value and ID Attribute. They carry some standard value like 0 and some text respectively for them.
The 2nd row contains the data I am looking for.
My query is why two rows are being returned?
ThanksCheck this code:
REPORT ytest_pie.
DATA: BEGIN OF data OCCURS 1,
text(36),
feld1 TYPE p,
END OF data,
BEGIN OF opts OCCURS 1,
c(80) TYPE c,
END OF opts,
BEGIN OF tyear OCCURS 1,
c(20) TYPE c,
END OF tyear.
opts-c = 'P2TYPE = PI'.
APPEND opts.
data-text = 'X 10'.
data-feld1 = '10'.
APPEND data.
data-text = 'Y 20'.
data-feld1 = '20'.
APPEND data.
CALL FUNCTION 'GRAPH_MATRIX_2D'
TABLES
data = data
opts = opts
tcol = tyear
EXCEPTIONS
col_invalid = 1
opt_invalid = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF. -
I apologize if this is a duplicate of some other post, but I'm not finding this exact scenario.
Assume that I have a table that looks like this:
select * from PROD_TABLE
PROD DESCRIPTION
1234 CANDLES
1234 CANDLE
1235 BRAKE PADS
1235 BRAKE PAD
(Yes, I know, I know, but it's for a POC, so dirty data will be cleaned up later.)
What I'd like to do is create a select statement that returns two rows from this table, one row for Prod 1234, one row for Prod 1235, and I DON'T CARE which description is returned for the corresponding Prod. For the POC, it's just not important which one is returned.
How can I craft the select statement?try this
SQL> with t as (select 1234 prod, 'CANDLES' dec from dual union all
2 select 1234 ,'CANDLE' dec from dual union all
3 select 1235 ,'BRAKE PADS' dec from dual union all
4 select 1235 ,'BRAKE PAD' dec from dual)
5 SELECT prod, DEC
6 FROM ( SELECT a.*
7 , ROW_NUMBER ( ) OVER ( PARTITION BY prod ORDER BY prod ) rn
8 FROM t a )
9 WHERE rn = 1
10 /
PROD DEC
1234 CANDLES
1235 BRAKE PADS
SQL> -
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 -
How to return mismatched rows from two tables?
I have created two tables in the same database as below which gives the row
count of tables across all databases before and after an DB restore
operation.
create table before_restore(db_name varchar(100),table_name
varchar(1000),row_count int) insert into before_restore exec sp_msforeachdb 'USE
[?]; select ''?'' as database_name,o.name,max(i.rowcnt ) From [?].sys.objects o
inner join [?].sys.sysindexes i on o.object_id=i.id where o.type=''U'' group by
o.name'
create table after_restore(db_name varchar(100),table_name
varchar(1000),row_count int) insert into after_restore exec sp_msforeachdb 'USE
[?]; select ''?'' as database_name,o.name,max(i.rowcnt ) From [?].sys.objects o
inner join [?].sys.sysindexes i on o.object_id=i.id where o.type=''U'' group by
o.name'
I want to compare these two tables and it should only return me rows that
have changed after the restore operation is complete.
Eg:
Table xyz has rowcount of 100 before restore and the restore was not proper
and after restore count is 50. So it should return me the result set as
below;
Db_name Table_Name row_count_before_restore row_count_after_restore
abc xyz 100
50
Thanks!!!Something like below perhaps? Btw, I recommend using catalog view and dynamic management views instead of the old system tables (now called compatibility views)...
SELECT
COALESCE(a.db_name, b.db_name) AS db_name
,COALESCE(a.table_name, b.table_name) AS table_name
,a.row_count AS row_count_before_restore
,b.row_count AS row_count_after_restore
FROM before_restore AS b FULL OUTER JOIN after_restore AS a ON b.db_name = a.db_name AND b.table_name = a.table_name
WHERE b.row_count <> a.row_count OR b.db_name IS NULL OR a.db_name IS NULL
Tibor Karaszi, SQL Server MVP |
web | blog -
Over partition: how to use to return the max of two columns
For each unique id, I want to select the value of col2 in the record with the most recent date.
When the rows with the same IDs have the same dates, I want the max value from col2.
I want one row for each ID, but I'm getting two rows for ID 3333333.
with data as
select 1111111 as id, 'a' as col2, to_date('01-JAN-09','dd-mon-yyyy') as the_date from dual union all
select 2222222 as id, 'b' as col2, to_date('02-JAN-09','dd-mon-yyyy') as the_date from dual union all
select 2222222 as id, 'c' as col2, to_date('03-JAN-09','dd-mon-yyyy') as the_date from dual union all
select 2222222 as id, 'd' as col2, to_date('04-JAN-09','dd-mon-yyyy') as the_date from dual union all
select 3333333 as id, 'e' as col2, to_date('05-JAN-09','dd-mon-yyyy') as the_date from dual union all
select 3333333 as id, 'f' as col2, to_date('05-JAN-09','dd-mon-yyyy') as the_date from dual
select id, col2, the_date
from
select id, the_date, col2, max(the_date) over (partition by id) as max_the_date, max(col2) over (partition by col2) as max_col2
from data
where the_date = max_the_date and col2 = max_col2 order by id
Expecting this:
ID COL2 THE_DATE
1111111 a 1/1/0009
2222222 d 1/4/0009
3333333 f 1/5/0009
but I'm getting 2 rows for ID 3333333
Any suggestions?TRy this code without subquery
SELECT ID, MAX (the_date)KEEP (DENSE_RANK LAST ORDER BY the_date),
MAX (col2)KEEP (DENSE_RANK LAST ORDER BY the_date)
FROM DATA
GROUP BY ID
ORDER BY ID
SQL> WITH DATA AS
2 (SELECT 1111111 AS ID, 'a' AS col2,
3 TO_DATE ('01-01-2009', 'dd-mm-yyyy') AS the_date
4 FROM DUAL
5 UNION ALL
6 SELECT 2222222 AS ID, 'b' AS col2,
7 TO_DATE ('02-01-2009', 'dd-mm-yyyy') AS the_date
8 FROM DUAL
9 UNION ALL
10 SELECT 2222222 AS ID, 'c' AS col2,
11 TO_DATE ('03-01-2009', 'dd-mm-yyyy') AS the_date
12 FROM DUAL
13 UNION ALL
14 SELECT 2222222 AS ID, 'd' AS col2,
15 TO_DATE ('04-01-2009', 'dd-mm-yyyy') AS the_date
16 FROM DUAL
17 UNION ALL
18 SELECT 3333333 AS ID, 'e' AS col2,
19 TO_DATE ('05-01-2009', 'dd-mm-yyyy') AS the_date
20 FROM DUAL
21 UNION ALL
22 SELECT 3333333 AS ID, 'f' AS col2,
23 TO_DATE ('05-01-2009', 'dd-mm-yyyy') AS the_date
24 FROM DUAL)
25 SELECT ID, MAX (the_date)KEEP (DENSE_RANK LAST ORDER BY the_date ),
26 MAX (col2)KEEP (DENSE_RANK LAST ORDER BY the_date )
27 FROM DATA
28 group by id
29 ORDER BY ID;
ID MAX(THE_DA M
1111111 2009-01-01 a
2222222 2009-01-04 d
3333333 2009-01-05 f
SQL> Edited by: Salim Chelabi on 2009-03-05 11:49
Edited by: Salim Chelabi on 2009-03-05 11:50 -
Result in same row instead of two rows
I have to select same field on two different condition ie.
select
(case when data_type_id = 1 then hrscycles else 0 end) totalhours
,(case when data_type_id = 10 then hrscycles else 0 end) totalcycles
from mytable
Problem is query is returning 2 rows whereas i want result in single row.Is there any other solution?select (case when data_type_id = 1 then hrscycles else 0 end) totalhours,
(case when data_type_id = 10 then hrscycles else 0 end) totalcycles
from mytableyour query in the above will return two columns and will return multiple rows depending on the data your table have.
maybe you want single column?
select (case when data_type_id = 1 then hrscycles
else 0
end) attribute1
from mytable
union all
select (case when data_type_id = 10 then hrscycles
else 0
end) attribute1
from mytableor if you want a multiple rows into a single column:
SQL> select * from pivot_tab;
COL1 COL2
1 a
1 b
1 c
2 h
2 h
SQL> select p.col1,
2 substr(max(substr(sys_connect_by_path (p.col2,','),2)),1,60)
3 as col2
4 from (select col1,
5 col2,
6 row_number() over (partition by col1 order by col1, col2) rn
7 from pivot_tab) p
8 start with p.rn = 1
9 connect by p.rn = prior p.rn + 1
10 and prior p.col1 = p.col1
11 group by col1;
COL1 COL2
1 a,b,c
2 h,h
SQL> -
How to return two XML result sets using the function
Hi Experts,
Thanks.So that I want to return two XML result sets if the query returns more than 50,000 records.
One XML result set with 50,000 and another XML result set with remaining records.
How to incorporate this in my function.
Have the function return a collection of CLOB then.
DBMS_XMLGEN can handle pagination so it's easy to adapt your existing code.
Here's an example fetching data in batches of max. 3 rows each, using a pipelined function :
SQL> create or replace type clob_array is table of clob;
2 /
Type created
SQL>
SQL> create or replace function genXmlRowset (p_deptno in number) return clob_array pipelined
2 is
3 ctx dbms_xmlgen.ctxHandle;
4 doc clob;
5 begin
6
7 ctx := dbms_xmlgen.newContext('SELECT empno, ename FROM scott.emp WHERE deptno = :1');
8 dbms_xmlgen.setBindValue(ctx, '1', p_deptno);
9 dbms_xmlgen.setMaxRows(ctx, 3);
10
11 loop
12
13 doc := dbms_xmlgen.getXML(ctx);
14 exit when dbms_xmlgen.getNumRowsProcessed(ctx) = 0;
15 pipe row (doc);
16
17 end loop;
18
19 dbms_xmlgen.closeContext(ctx);
20
21 return;
22
23 end;
24 /
Function created
SQL> set long 5000
SQL> select * from table(genXmlRowset(30));
COLUMN_VALUE
<?xml version="1.0"?>
<ROWSET>
<ROW>
<EMPNO>7499</EMPNO>
<ENAME>ALLEN</ENAME>
</ROW>
<ROW>
<EMPNO>7521</EMPNO>
<ENAME>WARD</ENAME>
</ROW>
<ROW>
<EMPNO>7654</EMPNO>
<ENAME>MARTIN</ENAME>
</ROW>
</ROWSET>
<?xml version="1.0"?>
<ROWSET>
<ROW>
<EMPNO>7698</EMPNO>
<ENAME>BLAKE</ENAME>
</ROW>
<ROW>
<EMPNO>7844</EMPNO>
<ENAME>TURNER</ENAME>
</ROW>
<ROW>
<EMPNO>7900</EMPNO>
<ENAME>JAMES</ENAME>
</ROW>
</ROWSET>
SQL>
(and don't forget to use bind variables in your query) -
JTable header : text = two-rows, onClick action = sorting
Hi guys.
I want to create a JTable where the user can have the data sorted by clicking upon a column's header. The code below shows the table I describe (you can click upon a column and sorting is performed).
import javax.swing.JFrame;
import java.awt.HeadlessException;
import java.awt.*;
import javax.swing.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.util.Vector;
import javax.swing.table.DefaultTableModel;
//--------- TableSorter ----------
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.util.List;
import javax.swing.*;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.*;
//---------- Table Height - Column Width
import javax.swing.table.TableColumn;
import java.awt.FontMetrics;
import javax.swing.JTable;
import java.awt.Dimension;
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2006</p>
* <p>Company: </p>
* @author not attributable
* @version 1.0
public class Test extends JFrame {
JPanel jPanel1 = new JPanel();
JPanel jPanel2 = new JPanel();
JButton jButton1 = new JButton();
FlowLayout flowLayout1 = new FlowLayout();
BorderLayout borderLayout1 = new BorderLayout();
BorderLayout borderLayout2 = new BorderLayout();
//------------- MY VARIABLES -------------
String[] columnNames_objectArr = new String[] {
"Col1",
"Column 2",
"Column 3",
"C4",
"Col5",
"Col 6",
Vector columnNames_vector = new Vector();
private Vector data_vector = new Vector();
private Object[][] data_objectArr;
public TableHeight_ColumnWidth tcw;
private int totalTableWidth = 0, totalTableHeight = 0;
private JComboBox jcmbxData = new JComboBox(
new String[] {"Not Configured", "Switch", "Modem"});
private int maxVisibleRows = 51;
TableSorter model;
private JTable table;
JScrollPane jScrollPane1;
public Test(String[] args) throws HeadlessException {
try {
jbInit();
setupGUI();
launchGUI();
catch(Exception e) {
e.printStackTrace();
private void jbtnClose_actionPerformed(ActionEvent e) {
dispose();
private void launchGUI() {
pack();
setVisible(true);
setResizable(false);
private void setupGUI() {
columnNames_vector.addElement("Col1");
columnNames_vector.addElement("Column 2");
columnNames_vector.addElement("Column 3");
columnNames_vector.addElement("C4");
columnNames_vector.addElement("Col5");
columnNames_vector.addElement("Col 6");
Vector row_data1 = new Vector();
Vector row_data2 = new Vector();
Vector row_data3 = new Vector();
Vector row_data4 = new Vector();
Vector row_data5 = new Vector();
Vector row_data6 = new Vector();
row_data1.add("Mary");
row_data1.add("Campioneato");
row_data1.add("Snowboarding");
row_data1.add(new Integer(578987899));
row_data1.add(new Boolean(false));
row_data1.add("Not Configured");
row_data2.add("Alison");
row_data2.add("Huml");
row_data2.add("Rowing");
row_data2.add(new Integer(3));
row_data2.add(new Boolean(true));
row_data2.add("Switch");
row_data3.add("Ka");
row_data3.add("Walrath");
row_data3.add("Knitting");
row_data3.add(new Integer(2));
row_data3.add(new Boolean(false));
row_data3.add("Modem");
row_data4.add("Sharon");
row_data4.add("Zakhouras");
row_data4.add("Speed reading");
row_data4.add(new Integer(20));
row_data4.add(new Boolean(true));
row_data4.add("Switch");
row_data5.add("Philip");
row_data5.add("Milner");
row_data5.add("Pool");
row_data5.add(new Integer(10));
row_data5.add(new Boolean(false));
row_data5.add("Not Configured");
data_vector.add(row_data1);
data_vector.add(row_data2);
data_vector.add(row_data3);
data_vector.add(row_data4);
data_vector.add(row_data5);
model = new TableSorter(new SortTableModel(data_vector, columnNames_vector));
table = new JTable(model);
tcw = new TableHeight_ColumnWidth(model, table);
jScrollPane1 = new JScrollPane(table);
model.setTableHeader(table.getTableHeader());
jPanel1.add(jScrollPane1, BorderLayout.CENTER);
//Add a JComboBox as a cellEditor...
DefaultCellEditor dce = new DefaultCellEditor(jcmbxData);
table.getColumnModel().getColumn(5).setCellEditor(dce);
//..... add the IPJPanel as cellEditor.....
tcw.fixTableLook(maxVisibleRows);
private void jbInit() throws Exception {
this.getContentPane().setLayout(borderLayout2);
jPanel1.setLayout(borderLayout1);
jPanel2.setLayout(flowLayout1);
jButton1.setText("Close");
jPanel1.setBorder(BorderFactory.createRaisedBevelBorder());
this.getContentPane().add(jPanel1, BorderLayout.CENTER);
this.getContentPane().add(jPanel2, BorderLayout.SOUTH);
jPanel2.add(jButton1, null);
jButton1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
jbtnClose_actionPerformed(e);
public static void main( String[] args ) {
new Test(args);
public boolean getScrollableTracksViewportHeight() {
Component parent = getParent();
if (parent instanceof JViewport) {
return parent.getHeight() > getPreferredSize().height;
return false;
//------------------ MY TABLE MODEL ------------------
public class SortTableModel extends DefaultTableModel {
private boolean DEBUG = false;
public SortTableModel(Object[][] data, String[] columnNames) {
super(data, columnNames);
public SortTableModel(Vector data, Vector columnNames) {
super(data, columnNames);
//------------------ TABLE SORTER -----------------------
public class TableSorter extends AbstractTableModel {
protected TableModel tableModel;
public static final int DESCENDING = -1;
public static final int NOT_SORTED = 0;
public static final int ASCENDING = 1;
private Directive EMPTY_DIRECTIVE = new Directive(-1, NOT_SORTED);
public final Comparator COMPARABLE_COMAPRATOR = new Comparator() {
public int compare(Object o1, Object o2) {
return ((Comparable) o1).compareTo(o2);
public final Comparator LEXICAL_COMPARATOR = new Comparator() {
public int compare(Object o1, Object o2) {
return o1.toString().compareTo(o2.toString());
private Row[] viewToModel;
private int[] modelToView;
private JTableHeader tableHeader;
private MouseListener mouseListener;
private TableModelListener tableModelListener;
private Map columnComparators = new HashMap();
private List sortingColumns = new ArrayList();
public TableSorter() {
this.mouseListener = new MouseHandler();
this.tableModelListener = new TableModelHandler();
public TableSorter(TableModel tableModel) {
this();
setTableModel(tableModel);
public TableSorter(TableModel tableModel, JTableHeader tableHeader) {
this();
setTableHeader(tableHeader);
setTableModel(tableModel);
private void clearSortingState() {
viewToModel = null;
modelToView = null;
public TableModel getTableModel() {
return tableModel;
public void setTableModel(TableModel tableModel) {
if (this.tableModel != null) {
this.tableModel.removeTableModelListener(tableModelListener);
this.tableModel = tableModel;
if (this.tableModel != null) {
this.tableModel.addTableModelListener(tableModelListener);
clearSortingState();
fireTableStructureChanged();
public JTableHeader getTableHeader() {
return tableHeader;
public void setTableHeader(JTableHeader tableHeader) {
if (this.tableHeader != null) {
this.tableHeader.removeMouseListener(mouseListener);
TableCellRenderer defaultRenderer = this.tableHeader.getDefaultRenderer();
if (defaultRenderer instanceof SortableHeaderRenderer) {
this.tableHeader.setDefaultRenderer(((SortableHeaderRenderer) defaultRenderer).tableCellRenderer);
this.tableHeader = tableHeader;
if (this.tableHeader != null) {
this.tableHeader.addMouseListener(mouseListener);
this.tableHeader.setDefaultRenderer(
new SortableHeaderRenderer(this.tableHeader.getDefaultRenderer()));
public boolean isSorting() {
return sortingColumns.size() != 0;
private Directive getDirective(int column) {
for (int i = 0; i < sortingColumns.size(); i++) {
Directive directive = (Directive)sortingColumns.get(i);
if (directive.column == column) {
return directive;
return EMPTY_DIRECTIVE;
public int getSortingStatus(int column) {
return getDirective(column).direction;
private void sortingStatusChanged() {
clearSortingState();
fireTableDataChanged();
if (tableHeader != null) {
tableHeader.repaint();
public void setSortingStatus(int column, int status) {
Directive directive = getDirective(column);
if (directive != EMPTY_DIRECTIVE) {
sortingColumns.remove(directive);
if (status != NOT_SORTED) {
sortingColumns.add(new Directive(column, status));
sortingStatusChanged();
protected Icon getHeaderRendererIcon(int column, int size) {
Directive directive = getDirective(column);
if (directive == EMPTY_DIRECTIVE) {
return null;
return new Arrow(directive.direction == DESCENDING, size, sortingColumns.indexOf(directive));
private void cancelSorting() {
sortingColumns.clear();
sortingStatusChanged();
public void setColumnComparator(Class type, Comparator comparator) {
if (comparator == null) {
columnComparators.remove(type);
} else {
columnComparators.put(type, comparator);
protected Comparator getComparator(int column) {
Class columnType = tableModel.getColumnClass(column);
Comparator comparator = (Comparator) columnComparators.get(columnType);
if (comparator != null) {
return comparator;
if (Comparable.class.isAssignableFrom(columnType)) {
return COMPARABLE_COMAPRATOR;
return LEXICAL_COMPARATOR;
private Row[] getViewToModel() {
if (viewToModel == null) {
int tableModelRowCount = tableModel.getRowCount();
viewToModel = new Row[tableModelRowCount];
for (int row = 0; row < tableModelRowCount; row++) {
viewToModel[row] = new Row(row);
if (isSorting()) {
Arrays.sort(viewToModel);
return viewToModel;
public int modelIndex(int viewIndex) {
return getViewToModel()[viewIndex].modelIndex;
private int[] getModelToView() {
if (modelToView == null) {
int n = getViewToModel().length;
modelToView = new int[n];
for (int i = 0; i < n; i++) {
modelToView[modelIndex(i)] = i;
return modelToView;
// TableModel interface methods
public int getRowCount() {
return (tableModel == null) ? 0 : tableModel.getRowCount();
public int getColumnCount() {
return (tableModel == null) ? 0 : tableModel.getColumnCount();
public String getColumnName(int column) {
return tableModel.getColumnName(column);
public Class getColumnClass(int column) {
return tableModel.getColumnClass(column);
public boolean isCellEditable(int row, int column) {
return tableModel.isCellEditable(modelIndex(row), column);
public Object getValueAt(int row, int column) {
return tableModel.getValueAt(modelIndex(row), column);
public void setValueAt(Object aValue, int row, int column) {
tableModel.setValueAt(aValue, modelIndex(row), column);
// Helper classes
private class Row implements Comparable {
private int modelIndex;
public Row(int index) {
this.modelIndex = index;
public int compareTo(Object o) {
int row1 = modelIndex;
int row2 = ((Row) o).modelIndex;
for (Iterator it = sortingColumns.iterator(); it.hasNext();) {
Directive directive = (Directive) it.next();
int column = directive.column;
Object o1 = tableModel.getValueAt(row1, column);
Object o2 = tableModel.getValueAt(row2, column);
int comparison = 0;
// Define null less than everything, except null.
if (o1 == null && o2 == null) {
comparison = 0;
} else if (o1 == null) {
comparison = -1;
} else if (o2 == null) {
comparison = 1;
} else {
comparison = getComparator(column).compare(o1, o2);
if (comparison != 0) {
return directive.direction == DESCENDING ? -comparison : comparison;
return 0;
private class TableModelHandler implements TableModelListener {
public void tableChanged(TableModelEvent e) {
// If we're not sorting by anything, just pass the event along.
if (!isSorting()) {
clearSortingState();
fireTableChanged(e);
return;
// If the table structure has changed, cancel the sorting; the
// sorting columns may have been either moved or deleted from
// the model.
if (e.getFirstRow() == TableModelEvent.HEADER_ROW) {
cancelSorting();
fireTableChanged(e);
return;
// We can map a cell event through to the view without widening
// when the following conditions apply:
// a) all the changes are on one row (e.getFirstRow() == e.getLastRow()) and,
// b) all the changes are in one column (column != TableModelEvent.ALL_COLUMNS) and,
// c) we are not sorting on that column (getSortingStatus(column) == NOT_SORTED) and,
// d) a reverse lookup will not trigger a sort (modelToView != null)
// Note: INSERT and DELETE events fail this test as they have column == ALL_COLUMNS.
// The last check, for (modelToView != null) is to see if modelToView
// is already allocated. If we don't do this check; sorting can become
// a performance bottleneck for applications where cells
// change rapidly in different parts of the table. If cells
// change alternately in the sorting column and then outside of
// it this class can end up re-sorting on alternate cell updates -
// which can be a performance problem for large tables. The last
// clause avoids this problem.
int column = e.getColumn();
if (e.getFirstRow() == e.getLastRow()
&& column != TableModelEvent.ALL_COLUMNS
&& getSortingStatus(column) == NOT_SORTED
&& modelToView != null) {
int viewIndex = getModelToView()[e.getFirstRow()];
fireTableChanged(new TableModelEvent(TableSorter.this,
viewIndex, viewIndex,
column, e.getType()));
return;
// Something has happened to the data that may have invalidated the row order.
clearSortingState();
fireTableDataChanged();
return;
private class MouseHandler extends MouseAdapter {
public void mouseClicked(MouseEvent e) {
JTableHeader h = (JTableHeader) e.getSource();
TableColumnModel columnModel = h.getColumnModel();
int viewColumn = columnModel.getColumnIndexAtX(e.getX());
int column = columnModel.getColumn(viewColumn).getModelIndex();
if (column != -1) {
int status = getSortingStatus(column);
if (!e.isControlDown()) {
cancelSorting();
// Cycle the sorting states through {NOT_SORTED, ASCENDING, DESCENDING} or
// {NOT_SORTED, DESCENDING, ASCENDING} depending on whether shift is pressed.
status = status + (e.isShiftDown() ? -1 : 1);
status = (status + 4) % 3 - 1; // signed mod, returning {-1, 0, 1}
setSortingStatus(column, status);
private class Arrow implements Icon {
private boolean descending;
private int size;
private int priority;
public Arrow(boolean descending, int size, int priority) {
this.descending = descending;
this.size = size;
this.priority = priority;
public void paintIcon(Component c, Graphics g, int x, int y) {
Color color = c == null ? Color.GRAY : c.getBackground();
// In a compound sort, make each succesive triangle 20%
// smaller than the previous one.
int dx = (int)(size/2*Math.pow(0.8, priority));
int dy = descending ? dx : -dx;
// Align icon (roughly) with font baseline.
y = y + 5*size/6 + (descending ? -dy : 0);
int shift = descending ? 1 : -1;
g.translate(x, y);
// Right diagonal.
g.setColor(color.darker());
g.drawLine(dx / 2, dy, 0, 0);
g.drawLine(dx / 2, dy + shift, 0, shift);
// Left diagonal.
g.setColor(color.brighter());
g.drawLine(dx / 2, dy, dx, 0);
g.drawLine(dx / 2, dy + shift, dx, shift);
// Horizontal line.
if (descending) {
g.setColor(color.darker().darker());
} else {
g.setColor(color.brighter().brighter());
g.drawLine(dx, 0, 0, 0);
g.setColor(color);
g.translate(-x, -y);
public int getIconWidth() {
return size;
public int getIconHeight() {
return size;
private class SortableHeaderRenderer implements TableCellRenderer {
private TableCellRenderer tableCellRenderer;
public SortableHeaderRenderer(TableCellRenderer tableCellRenderer) {
this.tableCellRenderer = tableCellRenderer;
public Component getTableCellRendererComponent(JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column) {
Component c = tableCellRenderer.getTableCellRendererComponent(table,
value, isSelected, hasFocus, row, column);
if (c instanceof JLabel) {
JLabel l = (JLabel) c;
l.setHorizontalTextPosition(JLabel.LEFT);
int modelColumn = table.convertColumnIndexToModel(column);
l.setIcon(getHeaderRendererIcon(modelColumn, l.getFont().getSize()));
return c;
private class Directive {
private int column;
private int direction;
public Directive(int column, int direction) {
this.column = column;
this.direction = direction;
//-------------- FIX TABLE'S HEIGHT & COLUMN WIDTH ---------
public class TableHeight_ColumnWidth {
private TableSorter sorter;
private FontMetrics fm;
private JTable table;
private int numOfRows = 0, totalTableHeight = 0, totalTableWidth = 0;
* Constructor --- it needs the model as well the JTable as parameters
* @param sorter - the model
* @param table - the JTable created based on the model
public TableHeight_ColumnWidth(TableSorter sorter, JTable table) {
this.sorter = sorter;
this.table = table;
this.fm = table.getFontMetrics(table.getFont());
this.numOfRows = table.getRowCount();
* Calculates the width of each column according to the String it contains
* @param col = the desired column
* @param fm = the FontMetrics of this column
* @return - the width of the single column
public int determineColumnWidth(TableColumn col, FontMetrics fm) {
int headerWidth = fm.stringWidth((String)col.getHeaderValue());
int columnNumber = col.getModelIndex();
int max = headerWidth;
int columnWidth = 0;
String cell = "";
Integer cell_int = new Integer(0);
Short cell_short = new Short((short)0);
for (int i = 0; i != sorter.getRowCount(); i++) {
Object obj = (Object) sorter.getValueAt(i, columnNumber);
if (obj instanceof String) {
cell = (String)sorter.getValueAt(i, columnNumber);
else if (obj instanceof Integer) {
cell_int = (Integer)sorter.getValueAt(i, columnNumber);
cell = String.valueOf(cell_int.intValue());
else if (obj instanceof Short) {
cell_short = (Short) sorter.getValueAt(i, columnNumber);
cell = String.valueOf(cell_short.shortValue());
columnWidth = fm.stringWidth(cell) + 5;
if (columnWidth > max) {
max = columnWidth;
return max + 5;
* Calculates the total width of the table according to the width of each
* column.
* @return - totalTableWidth
private int fixColumnWidth () {
int totalTableWidth = 0;
TableColumn c = null;
int cw = 0;
for (int i = 0; i < table.getColumnCount(); i++) {
c = table.getColumn(table.getColumnName(i));
cw = this.determineColumnWidth(c, fm);
c.setPreferredWidth(cw);
totalTableWidth = totalTableWidth + cw;
c.setMinWidth(cw);
return totalTableWidth;
* Calculates the height of the table according to the height of each row
* multiplied by 51 (by default) or by the totalRowsCount.
* @return - totalTableHeight
private int fixTableHeight(int maxVisibleRows) {
int rowHeight = table.getRowHeight();
//Show maxVisibleRows rows maximum
if (numOfRows > maxVisibleRows) {
totalTableHeight = rowHeight * maxVisibleRows;
else {
totalTableHeight = rowHeight * numOfRows;
return totalTableHeight;
* Sets up the table according to the totalTableWidth and totalTableHeight
public void fixTableLook(int maxVisibleRows) {
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
totalTableWidth = this.fixColumnWidth();
totalTableHeight = this.fixTableHeight(maxVisibleRows);
table.setPreferredScrollableViewportSize(new Dimension(totalTableWidth, totalTableHeight));
}Also, I want some column headers to display their text in two-rows. But by using the HTML technique look at the result in comparison with the previous table I had!
import javax.swing.JFrame;
import java.awt.HeadlessException;
import java.awt.*;
import javax.swing.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.util.Vector;
import javax.swing.table.DefaultTableModel;
//--------- TableSorter ----------
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.util.List;
import javax.swing.*;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.*;
//---------- Table Height - Column Width
import javax.swing.table.TableColumn;
import java.awt.FontMetrics;
import javax.swing.JTable;
import java.awt.Dimension;
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2006</p>
* <p>Company: </p>
* @author not attributable
* @version 1.0
public class Test extends JFrame {
JPanel jPanel1 = new JPanel();
JPanel jPanel2 = new JPanel();
JButton jButton1 = new JButton();
FlowLayout flowLayout1 = new FlowLayout();
BorderLayout borderLayout1 = new BorderLayout();
BorderLayout borderLayout2 = new BorderLayout();
//------------- MY VARIABLES -------------
String[] columnNames_objectArr = new String[] {
"Col1",
"Column 2",
"Column 3",
"C4",
"Col5",
"Col 6",
Vector columnNames_vector = new Vector();
private Vector data_vector = new Vector();
private Object[][] data_objectArr;
public TableHeight_ColumnWidth tcw;
private int totalTableWidth = 0, totalTableHeight = 0;
private JComboBox jcmbxData = new JComboBox(
new String[] {"Not Configured", "Switch", "Modem"});
private int maxVisibleRows = 51;
TableSorter model;
private JTable table;
JScrollPane jScrollPane1;
public Test(String[] args) throws HeadlessException {
try {
jbInit();
setupGUI();
launchGUI();
catch(Exception e) {
e.printStackTrace();
private void jbtnClose_actionPerformed(ActionEvent e) {
dispose();
private void launchGUI() {
pack();
setVisible(true);
setResizable(false);
private void setupGUI() {
columnNames_vector.addElement("<html>Col1</html>");
columnNames_vector.addElement("<html>Column 2</html>");
columnNames_vector.addElement("<html>Column 3<br>Second Row</html>");
columnNames_vector.addElement("<html>C4</html>");
columnNames_vector.addElement("<html>Col5</html>");
columnNames_vector.addElement("<html>Col 6</html>");
Vector row_data1 = new Vector();
Vector row_data2 = new Vector();
Vector row_data3 = new Vector();
Vector row_data4 = new Vector();
Vector row_data5 = new Vector();
Vector row_data6 = new Vector();
row_data1.add("Mary");
row_data1.add("Campioneato");
row_data1.add("Snowboarding");
row_data1.add(new Integer(578987899));
row_data1.add(new Boolean(false));
row_data1.add("Not Configured");
row_data2.add("Alison");
row_data2.add("Huml");
row_data2.add("Rowing");
row_data2.add(new Integer(3));
row_data2.add(new Boolean(true));
row_data2.add("Switch");
row_data3.add("Ka");
row_data3.add("Walrath");
row_data3.add("Knitting");
row_data3.add(new Integer(2));
row_data3.add(new Boolean(false));
row_data3.add("Modem");
row_data4.add("Sharon");
row_data4.add("Zakhouras");
row_data4.add("Speed reading");
row_data4.add(new Integer(20));
row_data4.add(new Boolean(true));
row_data4.add("Switch");
row_data5.add("Philip");
row_data5.add("Milner");
row_data5.add("Pool");
row_data5.add(new Integer(10));
row_data5.add(new Boolean(false));
row_data5.add("Not Configured");
data_vector.add(row_data1);
data_vector.add(row_data2);
data_vector.add(row_data3);
data_vector.add(row_data4);
data_vector.add(row_data5);
model = new TableSorter(new SortTableModel(data_vector, columnNames_vector));
table = new JTable(model);
tcw = new TableHeight_ColumnWidth(model, table);
jScrollPane1 = new JScrollPane(table);
model.setTableHeader(table.getTableHeader());
jPanel1.add(jScrollPane1, BorderLayout.CENTER);
//Add a JComboBox as a cellEditor...
DefaultCellEditor dce = new DefaultCellEditor(jcmbxData);
table.getColumnModel().getColumn(5).setCellEditor(dce);
//..... add the IPJPanel as cellEditor.....
tcw.fixTableLook(maxVisibleRows);
private void jbInit() throws Exception {
this.getContentPane().setLayout(borderLayout2);
jPanel1.setLayout(borderLayout1);
jPanel2.setLayout(flowLayout1);
jButton1.setText("Close");
jPanel1.setBorder(BorderFactory.createRaisedBevelBorder());
this.getContentPane().add(jPanel1, BorderLayout.CENTER);
this.getContentPane().add(jPanel2, BorderLayout.SOUTH);
jPanel2.add(jButton1, null);
jButton1.addActionListener(new ActionListener() {
First of all I found out that when I set the column's header like this:
columnNames_vector.addElement("<html>Column 3<br>Second Row</html>"); //In the setupGUI() methodthe TableHeight_ColumnWidth.determineColumnWidth(TableColumn col, FontMetrics fm) method calculates the column's width by counting <html>, </html>, <br> characters as well. So I added a check to reject these characters and not count them for the column's width.
As for the header's height:
I found that when the first column's header is set to display two-lines, then the height of the rest columns headers is set to display two-lines as well. In other words, the height of the first column's header affects the height of the whole JTableHeader.
I found that the BasicTableHeaderUI.getHeaderHeight() method is called, within which there are these comments:
// If the header value is empty (== "") in the
// first column (and this column is set up
// to use the default renderer) we will
// return zero from this routine and the header
// will disappear altogether. Avoiding the calculation
// of the preferred size is such a performance win for
// most applications that we will continue to
// use this cheaper calculation, handling these
// issues as `edge cases'. Should I override a class and if so which one? I am so confused! If anyone has any idea about how to set the header's height according to the cell's height that is the maximum among all, please let me know. -
How to get two rows from this data?
SQL Gurus,
I need to summarize the following data into two rows (two rows based on the example data below but it can be any number of rows if there are more breaks in continuos numbers)
DETAIL_ID FM_SERIAL_NUMBER TO_SERIAL_NUMBER
63009 11 11
63009 12 12
63009 13 13
63009 14 14
63009 15 15
63009 16 16
63009 17 17
63009 18 18
63009 19 19
63009 20 20
63009 228 228
I need to get two rows, one showing 11-20 (that's because there's a conituity between 11 to 20)
and the other row showing 228 - 228.
Any help is appreciated
Regards,
Srinithe example i gave had some issues.
Here is an updated code.
Provided your detail_id,f_serial_no,t_serial_no are numbers.
Thanks to the example provided by Karthick_Arp
link:genterating one order
WITH t AS
(SELECT 63009 a,
level b ,
level c
FROM dual CONNECT BY level < 10
UNION ALL
SELECT 63009 , 228,228 FROM dual
UNION ALL
SELECT 63009 , 229,229 FROM dual
UNION ALL
SELECT 63009 , 238,238 FROM dual
UNION ALL
SELECT 63009,239,239 FROM dual
UNION ALL
SELECT 630010,223,223 FROM dual
UNION ALL
SELECT 630010,224,224 FROM dual
union all
SELECT 63009,232,232 FROM dual
, t1 as (
select a, b, c, decode(b-nvl(lag(b) over (partition by a order by b),1),1,0,b) d from t)
,t2 as (
select a, b, c,d
from (select row_number() over(order by b) rno, a,b,c,d
from t1) t
model
return updated rows
dimension by (rno)
measures (a, b, c,d)
rules update
d[any] = case when d[cv()] = 0 then nvl(d[cv()-1],0) else d[cv()] end
select a,min(b),max(b) from t2
group by a,doutput
63009 1 9
630010 223 224
63009 232 232
63009 228 229
63009 238 239
Alvinder
Edited by: alvinder on Feb 20, 2009 9:28 AM -
Two rows as one display the data in one row
Hello All,
I would like to have data of two rows put in one as:
Lets say the data is like this:
SELECT * FROM TEST;
COL1 COL2 COL3 C
1.5 3 1 M
2 1 C
2.5 2 C
3.5 2 M
4.5 3 M How do i get the output as :
COL1 COL2 COL3 COL4 COL5
1.5 3 1 M 2
2.5 2 C 3.5
4.5 3 M If there are two rows with same value in Col3, then col5(a new dummy column in select stmt) the second row's col2 should be disaplyed in Row 1.
Can we do it in a Select Statement ?
Regds,
AmkotzA try :
SQL> select * from Amkotz;
COL1 COL2 COL3 C
1,5 3 1 M
2 1 C
2,5 2 C
3,5 2 M
4,5 3 M
SQL> select a.col1,
2 a.col2,
3 a.col3,
4 a.col4,
5 max(decode(a.rowid,b.rowid,null,b.col2)) keep (dense_rank last order by a.col1,a.col2) as col5
6 from (select Amkotz.*, row_number() over (partition by col3 order by col1,col2) rn from Amkotz) a, Amkotz b
7 where a.rn=1
8 and a.col3=b.col3
9 group by a.col1,
10 a.col2,
11 a.col3,
12 a.col4;
COL1 COL2 COL3 C COL5
1,5 3 1 M 2
2,5 2 C 3,5
4,5 3 M Nicolas. -
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 -
ExecuteWithParams is not returning the rows from cache
Hi,
We have two VO's based on same entity ,whenever new row is inserted in one VO and we do executeWithParams on another VO ,It is not returning the rows which are uncommitted.
I replaced the executeWithParams with a custom method in AM in which I am executing the query after applying the view criteria and setting query mode.Its returning rows which are uncommitted.
Jdev Version which I am using is 11.1.1.7.0
ExecuteWithParams used to work with uncommitted data in 11.1.1.6.0 .
Do we need to raise a bug on framework or Am I missing something?
Edited by: sharavnkumar_malla on Oct 18, 2012 1:02 AMStill the same answer, even after you updated the question. We (the public) don't have 11.1.1.7, know nothing about 11.1.1.7, and cannot help you with 11.1.1.7. Questions about internal builds belong on internal forums.
-
Issue with IN parameter of Oracle Procedure returning two RefCursors...
Hi all,
I'm having a nightmare with an Oracle procedure that takes one input parameter and returns two RefCursors as outputs. I recently got help in this forum getting a procedure to work that took no inputs but returned two refcursors and that's still working fine. So, for my current issue I have a procedure defined as follows:
PROCEDURE getQueueInfo(domainKey char, importQueues OUT ODPNet.refcur, exportQueues OUT ODPNet.refcur) IS
BEGIN
OPEN importQueues FOR SELECT
source_key, source_applid,
import_status(source_key) as status,
time_added, time_processed
FROM wm_import_source_header
WHERE source_id = domainKey
ORDER BY source_key DESC;
OPEN exportQueues FOR SELECT
h.source_key, d.source_applid,
export_status(h.source_key) as status,
d.source_wire_code, d.destination_wire_code, h.time_added,
h.time_transmitted
FROM wm_export_source_header h, wm_export_source_data d
WHERE h.source_key = d.source_key
and d.source_id = domainKey
ORDER BY h.source_key DESC;
END getQueueInfo;This is defined within a package called ODPNet as with my previous procedure and all works fine (I can execute within Oracle SQL Developer and it returns the expected results). Within my .NET application my code is as follows:
try
using (OracleConnection conn = new OracleConnection(connString))
using (OracleCommand comm = new OracleCommand())
comm.CommandText = "ODPNet.getQueueInfo";
comm.CommandType = CommandType.StoredProcedure;
comm.Connection = conn;
OracleParameter domainKey = new OracleParameter();
OracleParameter importQueues = new OracleParameter();
OracleParameter exportQueues = new OracleParameter();
domainKey.OracleDbType = OracleDbType.Char;
importQueues.OracleDbType = OracleDbType.RefCursor;
exportQueues.OracleDbType = OracleDbType.RefCursor;
domainKey.Value = "UKBD72";
domainKey.Direction = ParameterDirection.Input;
importQueues.Direction = ParameterDirection.Output;
exportQueues.Direction = ParameterDirection.Output;
comm.Parameters.Add(domainKey);
comm.Parameters.Add(importQueues);
comm.Parameters.Add(exportQueues);
conn.Open();
comm.ExecuteNonQuery();
OracleDataReader dr1 = ((OracleRefCursor)importQueues.Value).GetDataReader();
OracleDataReader dr2 = ((OracleRefCursor)exportQueues.Value).GetDataReader();
if (dr1.HasRows)
while (dr1.Read())
result6 += dr1["source_applid"].ToString() + "<br>";
else
result6 += "No Rows";
if (dr2.HasRows)
while (dr2.Read())
result7 += dr2["source_applid"].ToString() + "<br>";
else
result7 += "No Rows";
catch (Exception ex)
result6 = ex.ToString();
}The value I want to submit as the IN parameter of the procedure is "UKBD72". but I'm really not sure how to apply this and then return my two refcursors into separate datareaders (except for the input parameter stuff the code above is exactly what I did with the other procedure that returned two ref cursors and still works fine). When I run this code I get no errors, I just get told that each DataReader has no rows returned, which shouldn't be right.
Any help with this would be hugely appreciated.
Cheers,
SebSorry folks, after staring at this over and over, eventually going to sleep and coming back to it with some fresh eyes I realised I was just being a complete idiot - I was feeding the procedure different data in the .NET app than I was when testing in Oracle SQL Developer. Low and behold once I gave it the right data it worked!
Silly me...
Maybe you are looking for
-
Video clips won't play back after capture
I am a long-time user of Premiere Elements, currently using version 9.0. I am capturing video clips from the same videocamera that I've used in previous versions of PE. My video clips won't play back after I capture them. The clip is in my "media" ar
-
I updated to ios 6 and now nothing is working on my phone. It does not have a phone number and the computer doesn't recognize the device when plugged in. The only way it accepts a charge is by electric outlet plugin.
-
Proximity sensor/screen issue during call
My screen goes black during call as normal But the screen can still register touches This made me end call(via my face)several times! Anyone else with similar issues?
-
have a mini and it is not recognizing my iPods and iPads. Is there a setting i screwed up?
-
How do I UNdelete a Reminder list?
How do I UNdelete a Reminder List????