Slow conversions of Number(x) columns with getLong()
JDK 1.3
WLS 5.1.0 / SP10
Solaris 8
Oracle Type 4 drivers - classes12.zip
I have thirty one threads like this one - only one is running (one cpu machine).
This is a getLong() on a Number(10) column. Will changing the column to Long
help?
Any ideas why this is slow/bottleneck?
I just discovered some OutOfMemoryErrors and will be fixing that.
"ExecuteThread-291" daemon prio=5 tid=0x6a3bb0 nid=0x132 waiting on monitor [0xd
b080000..0xdb0819e0]
at oracle.sql.NUMBER._isPositive(NUMBER.java:2882)
at oracle.sql.NUMBER._fromLnxFmt(NUMBER.java:2953)
at oracle.sql.LnxLibThin.lnxsni(LnxLibThin.java:871)
at oracle.sql.NUMBER.toLong(NUMBER.java:323)
at oracle.sql.NUMBER.longValue(NUMBER.java:1812)
at oracle.jdbc.dbaccess.DBConversion.NumberBytesToLong(DBConversion.java:181
7)
at oracle.jdbc.driver.OracleStatement.getLongValue(OracleStatement.java:3200
at oracle.jdbc.driver.OracleResultSetImpl.getLong(OracleResultSetImpl.java:3
35)
at oracle.jdbc.driver.OracleResultSet.getLong(OracleResultSet.java:1432)
Mike
http://newsgroups.bea.com/cgi-bin/dnewsweb?cmd=article&group=weblogic.developer.interest.jdbc&item=6829&utag=
ever have one of those days where you end up talking to yourself?
mike
"Mike Reiche" <[email protected]> wrote:
>
a developer tells me the code below works with type 4 drivers, but type
2 driver
complains about hte Oracle.Type.Cursor. What
type should that be? Will java.sql.Other work?
CallableStatement cstmt = con.prepareCall(callString);
cstmt.registerOutParameter(1, OracleTypes.INTEGER);
cstmt.setLong(2, 24);
cstmt.registerOutParameter(3, OracleTypes.CURSOR);
cstmt.execute();
rs=(ResultSet)cstmt.getObject(3);
Similar Messages
-
Sql query slowness due to rank and columns with null values:
Sql query slowness due to rank and columns with null values:
I have the following table in database with around 10 millions records:
Declaration:
create table PropertyOwners (
[Key] int not null primary key,
PropertyKey int not null,
BoughtDate DateTime,
OwnerKey int null,
GroupKey int null
go
[Key] is primary key and combination of PropertyKey, BoughtDate, OwnerKey and GroupKey is unique.
With the following index:
CREATE NONCLUSTERED INDEX [IX_PropertyOwners] ON [dbo].[PropertyOwners]
[PropertyKey] ASC,
[BoughtDate] DESC,
[OwnerKey] DESC,
[GroupKey] DESC
go
Description of the case:
For single BoughtDate one property can belong to multiple owners or single group, for single record there can either be OwnerKey or GroupKey but not both so one of them will be null for each record. I am trying to retrieve the data from the table using
following query for the OwnerKey. If there are same property rows for owners and group at the same time than the rows having OwnerKey with be preferred, that is why I am using "OwnerKey desc" in Rank function.
declare @ownerKey int = 40000
select PropertyKey, BoughtDate, OwnerKey, GroupKey
from (
select PropertyKey, BoughtDate, OwnerKey, GroupKey,
RANK() over (partition by PropertyKey order by BoughtDate desc, OwnerKey desc, GroupKey desc) as [Rank]
from PropertyOwners
) as result
where result.[Rank]=1 and result.[OwnerKey]=@ownerKey
It is taking 2-3 seconds to get the records which is too slow, similar time it is taking as I try to get the records using the GroupKey. But when I tried to get the records for the PropertyKey with the same query, it is executing in 10 milliseconds.
May be the slowness is due to as OwnerKey/GroupKey in the table can be null and sql server in unable to index it. I have also tried to use the Indexed view to pre ranked them but I can't use it in my query as Rank function is not supported in indexed
view.
Please note this table is updated once a day and using Sql Server 2008 R2. Any help will be greatly appreciated.create table #result (PropertyKey int not null, BoughtDate datetime, OwnerKey int null, GroupKey int null, [Rank] int not null)Create index idx ON #result(OwnerKey ,rnk)
insert into #result(PropertyKey, BoughtDate, OwnerKey, GroupKey, [Rank])
select PropertyKey, BoughtDate, OwnerKey, GroupKey,
RANK() over (partition by PropertyKey order by BoughtDate desc, OwnerKey desc, GroupKey desc) as [Rank]
from PropertyOwners
go
declare @ownerKey int = 1
select PropertyKey, BoughtDate, OwnerKey, GroupKey
from #result as result
where result.[Rank]=1
and result.[OwnerKey]=@ownerKey
go
Best Regards,Uri Dimant SQL Server MVP,
http://sqlblog.com/blogs/uri_dimant/
MS SQL optimization: MS SQL Development and Optimization
MS SQL Consulting:
Large scale of database and data cleansing
Remote DBA Services:
Improves MS SQL Database Performance
SQL Server Integration Services:
Business Intelligence -
I am linking my question from Stack Overflow here. The link: http://stackoverflow.com/questions/27943913/sql-azure-query-with-row-number-executes-slow-if-columns-with-nvarchar-of-bi
Appreciate your help!
GorgiHi,
Thanks for posting here.
I suggest you to check this link and optimize your query on sql azure.
http://www.sqlusa.com/articles/query-optimization/
http://sqlblog.com/blogs/paul_white/archive/2011/02/23/Advanced-TSQL-Tuning-Why-Internals-Knowledge-Matters.aspx
Also check this blog which had similar issue.
https://social.msdn.microsoft.com/Forums/en-US/c1da08b4-265d-4ec8-a252-8d7090234e3e/simple-select-query-takes-long-time-to-execute-with-nvarchar-columns?forum=transactsql
Girish Prajwal -
I have a one-column table in pages. Each cell has text and a number separated by a colon. Can I automatically make it two column with everything to the right of the colon in the second column?
Here's another way that is pretty quick to do.
Formula in Column B is:
=LEFT(A, FIND(":", A))
Formula in Column C is:
=RIGHT(A, LEN(A)-FIND(":", A))
You can eliminate the colon from the result in column B by writing:
=LEFT(A, FIND(":", A)-1)
Once you do the conversion, you should freeze the result by Selecting columns B and C and then Command-C, Edit > Paste Values.
Regards,
Jerry -
How to create a table with varied number of columns?
I am trying to create a balance table. The colunms should include years between the start year and end year the user will input at run time. The rows will be the customers with outstanding balance in those years.
If the user input years 2000 and 2002, the table should have columns 2000, 2001, 2002. But if the user input 2000 and 2001, the table will only have columns 2000 and 2001.
Can I do it? How? Thanka a lot.Why did you create a new thread for this?
How to create a table with varied number of columns? -
Hi everyone, again landed up with a problem.
After trying a lot to do it myself, finally decided to post here..
I have created a form in form builder 6i, in which on clicking a button the data gets exported to excel sheet.
It is working fine with a single table. The problem now is that i am unable to do the same with 2 tables.
Because both the tables have same number of columns & column names.
Below are 2 tables with column names:
Table-1 (MONTHLY_PART_1)
Table-2 (MONTHLY_PART_2)
SL_NO
SL_NO
COMP
COMP
DUE_DATE
DUE_DATE
U-1
U-1
U-2
U-2
U-4
U-4
U-20
U-20
U-25
U-25
Since both the tables have same column names, I'm getting the following error :
Error 402 at line 103, column 4
alias required in SELECT list of cursor to avoid duplicate column names.
So How can i export the data to excel which has 2 tables with same number of columns & column names?
Should i paste the code? Should i post this query in 'SQL and PL/SQL' Forum?
Help me with this please.
Thank You.You'll have to *alias* your columns, not prefix it with the table names:
$[CHE_TEST@asterix1_impl] r
1 declare
2 cursor cData is
3 with data as (
4 select 1 id, 'test1' val1, 'a' val2 from dual
5 union all
6 select 1 id, '1test' val1, 'b' val2 from dual
7 union all
8 select 2 id, 'test2' val1, 'a' val2 from dual
9 union all
10 select 2 id, '2test' val1, 'b' val2 from dual
11 )
12 select a.id, b.id, a.val1, b.val1, a.val2, b.val2
13 from data a, data b
14 where a.id = b.id
15 and a.val2 = 'a'
16 and b.val2 = 'b';
17 begin
18 for rData in cData loop
19 null;
20 end loop;
21* end;
for rData in cData loop
ERROR at line 18:
ORA-06550: line 18, column 3:
PLS-00402: alias required in SELECT list of cursor to avoid duplicate column names
ORA-06550: line 18, column 3:
PL/SQL: Statement ignored
$[CHE_TEST@asterix1_impl] r
1 declare
2 cursor cData is
3 with data as (
4 select 1 id, 'test1' val1, 'a' val2 from dual
5 union all
6 select 1 id, '1test' val1, 'b' val2 from dual
7 union all
8 select 2 id, 'test2' val1, 'a' val2 from dual
9 union all
10 select 2 id, '2test' val1, 'b' val2 from dual
11 )
12 select a.id a_id, b.id b_id, a.val1 a_val1, b.val1 b_val1, a.val2 a_val2, b.val2 b_val2
13 from data a, data b
14 where a.id = b.id
15 and a.val2 = 'a'
16 and b.val2 = 'b';
17 begin
18 for rData in cData loop
19 null;
20 end loop;
21* end;
PL/SQL procedure successfully completed.
cheers -
Report with indefinite number of columns
Hello,
I'm using VB.NET and Crystal Reports 2008 for my Windows application.
I've a new report to implement. It's a budgetting report in a table form, which shows the amount of money allocated to a certain projects over a range of years. In each row I show the different projects, in each column I show the budget of each project per year. Users can select the number of years to print (as a parameter), that means, the number of columns is dynamic.
My question is, how am I going to design this report? Will cross-tab help? My report will be in landscape format. The page width is enough for 8 columns, i.e. 8 years can be printed per table. If users choose to print more than 8 years, the "extra" columns should be printed on a new table underneath the one with the first 8 years, or on a new page if there's not enough space underneath.
Your help and suggestions would be much appreciated. Thank you very much.
Agnesuse conditional supressions on the fields in the colums so based upon parameter selection it will display what is shown
insert a section below the other and then use the conditional supression based upon the selection of 8+
cross tabs have limitations and are hard to read. -
Report with undefined number of columns
Hello,
I'm using VB.NET and Crystal Reports 2008 for my Windows application.
I've a new report to implement. It's a budgetting report in a table form, which shows the amount of money allocated to a certain projects over a range of years. In each row I show the different projects, in each column I show the budget of each project per year. Users can select the number of years to print (as a parameter), that means, the number of columns is dynamic.
My question is, how am I going to design this report? Will cross-tab help? My report will be in landscape format. The page width is enough for 8 columns, i.e. 8 years can be printed per table. If users choose to print more than 8 years, the "extra" columns should be printed on a new table underneath the one with the first 8 years, or on a new page if there's not enough space underneath.
Your help and suggestions would be much appreciated. Thank you very much.
AgnesPlease note, this forum is dedicated to topics related to custom application development or deployment with Crystal Reports in .Net. This includes full versions of Crystal Reports as well as those versions of Crystal Reports bundled with Microsoft Visual Studio .Net.
As your query concerns design of an actual report, you should be posting your query to the Crystal Reports Design forum:
SAP Crystal Reports
Ludek
Moved to Report Design Forum
Edited by: Don Williams on Nov 24, 2008 7:23 AM -
Creating a table with a variable number of columns
Hi,
I am working on a form and I want to allow the user to add tables to the form. If I give them a base table (for instance, a table with two rows and columns) is there any way to allow the user to add columns to the table. I can add new instances of rows, but I need the number of columns to be variable as well.
I am working in Livecycle Designer ES2Hi,
check this article.
http://forms.stefcameron.com/2006/10/28/scripting-table-columns/
Hope this helps. -
File Content Conversion for Unequal Number of Columns
Hi,
Iam following this thread FCC for Unequal Number of Columns.
/people/jeyakumar.muthu2/blog/2005/11/29/file-content-conversion-for-unequal-number-of-columns
when iam doing ,iam getting an error
Conversion initialization failed: java.lang.Exception: java.lang.Exception: java.lang.Exception: Error(s) in XML conversion parameters found: Parameter 'TOTALSET.fieldFixedLengths' or 'TOTALSET.fieldSeparator' is missing Consistency check: no. of arguments in 'TOTALSET.fieldFixedLength' does not match 'TOTALSET.fieldNames' (0 <> 1)
My conversion parameters are
Recordset Structure : TOTALSET,*
TOTALSET.fieldNames : ITEMSET
ignoreRecordsetName : true
TOTALSET.fieldSeparator : 'nl'
My file structure is as below
01,021000021,G4886704,080919,0742,001,,,2
02,G4886704,021000021,1,080918,0742,,2
03,000000135073477,,010,105303839,,,015,489113155,,,045,489039455,,,072,73700
Please help in resoving the error.
Thanks in Advance
SrinivasHi Srivinas,
your file structure is as below
01,021000021,G4886704,080919,0742,001,,,2
02,G4886704,021000021,1,080918,0742,,2
03,000000135073477,,010,105303839,,,015,489113155,,,045,489039455,,,072,73700
So it's easy, you have to use KEYFIELD option, coz you have something like that :
Line 1 : keyfield = 01 following by a limited number of columns (e.g 30 fields for Structure1)
Line 2 : keyfield = 02 following by a limited number of columns (e.g 14 fields for Structure2)
Line 3 : keyfield = 03 following by a limited number of columns (e.g 23 fields for Structure3)
Thanks to the Keyfield, you define a field which is present in each line that you can used to distinguished the different structures of lines. In your case, it seems that the keyfield is the first column (01, 02, 03).
Try to use that:
Recorset = TOTALSET (and don't use option "ignoreRecordsetName : true")
Recordset structure =Structure1,1,Structure2,(star),Structure3,(start) (the difficulty will be to find the good use of "*" and "1", but after some tests you will find the good one).
Note: replace (start) by the character " * "
Key field value = keyfield
Key field type = String (case sensitive)
Structure1.fieldNames = keyfield,field2, field3 etc.. of Structure1
Structure2.fieldNames = keyfield,field2, field3 etc.. of Structure2
Structure3.fieldNames = keyfield,field2, field3 etc.. of Structure3
and then you will have a XML like that:
TOTALSET
Structure1 and all its fieldN
Structure2 and all its fieldN
Structure2 and all its fieldN
Structure3 and all its fieldN
Structure3 and all its fieldN
TOTALSET
Structure1 and all its fieldN because I used Structure1,1
Structure3 and all its fieldN
Regards.
Mickael
Edited by: Mickael Huchet on Apr 20, 2009 5:18 PM
Edited by: Mickael Huchet on Apr 20, 2009 5:19 PM -
Display table with variable number of columns
Hello Forum,
I'm trying to build an export view of User Management Engine data. I would like to output a table with one row for every user with yes / no fields indicating membership in each of the available groups. Because the number of available groups might change in the future, I can't hardcode the column names for the groups.
That is, I call a webservice to compute a table, and I get back a table with a variable number of columns.
When I try to insert the webservice into my VC model, it complains:
"Port 'Response' was omitted because it includes nested tables, which are not presently supported by Visual Composer"
You might be interested to know that the business method of my webservice (for testing purposes) looks as follows:
public String[][] getVariableSizeArray() {
String[][] ret = new String[10][];
for (int i = 1; i <= 10; i++) {
ret<i> = new String[10];
for (int j = 1; j <= 10; j++) {
ret<i>[j] = Integer.toString(i * j);
return ret;
Any help is appreciated, and points will be awarded for helpful answers,
Sincerely,
Florian
Message was edited by:
Florian SomethingHi Florian,
dynamic data structures are not supported. You can do this with a workaround. If you know the maximum count of your columns then you can add them to the table and hide/unhide them dynamicly via a formula in the hidden condition. Of course in your WS you als need a fix structure of your columns.
This is not the best solution, I know so far, but it works. This is just one limit of VC.
Best Regards,
Marcel -
Procedure with variable number of columns
Hi, I have a procedure that looks like this:
PROCEDURE PROC(p_cursor OUT sys_refcursor)
And in the procedure, I build up QUERY dynamically and the number of columns varies at runtime.
At the end I do
OPEN p_cursor for QUERY
Then to call this, I'm doing
call PROC(?)
My question is, how would I go about running the query from this procedure, then adding rows or modifying the existing results, then returning the modified data?
What I want to do is add a new row based on some condition, so I still need to return a variable number of columns, but I need to modify the results before I return them.
Is there any way of doing this? I need to do some calculations on the columns (the variable columns), create a new row, insert into result set, and return this new result set.A sys_refcursor is ideally suited to pass back to a front end gui like .NET or Java which can then use that cursor to retrieve the data.
In PL/SQL there is no point in using a sys_refcursor unless you know, at design/compile time what the returned columns are going to be.
If the resultant columns are dynamic, then you have no choice but to use the DBMS_SQL package, where you can parse and execute any SQL statement you like and then use the DBMS_SQL package to describe what the resultant columns are and how many there are. From that you can reference the columns by position rather than by name.
e.g.
CREATE OR REPLACE PROCEDURE run_query(p_sql IN VARCHAR2) IS
v_v_val VARCHAR2(4000);
v_n_val NUMBER;
v_d_val DATE;
v_ret NUMBER;
c NUMBER;
d NUMBER;
col_cnt INTEGER;
f BOOLEAN;
rec_tab DBMS_SQL.DESC_TAB;
col_num NUMBER;
v_rowcount NUMBER := 0;
BEGIN
-- create a cursor
c := DBMS_SQL.OPEN_CURSOR;
-- parse the SQL statement into the cursor
DBMS_SQL.PARSE(c, p_sql, DBMS_SQL.NATIVE);
-- execute the cursor
d := DBMS_SQL.EXECUTE(c);
-- Describe the columns returned by the SQL statement
DBMS_SQL.DESCRIBE_COLUMNS(c, col_cnt, rec_tab);
-- Bind local return variables to the various columns based on their types
FOR j in 1..col_cnt
LOOP
CASE rec_tab(j).col_type
WHEN 1 THEN DBMS_SQL.DEFINE_COLUMN(c,j,v_v_val,2000); -- Varchar2
WHEN 2 THEN DBMS_SQL.DEFINE_COLUMN(c,j,v_n_val); -- Number
WHEN 12 THEN DBMS_SQL.DEFINE_COLUMN(c,j,v_d_val); -- Date
ELSE
DBMS_SQL.DEFINE_COLUMN(c,j,v_v_val,2000); -- Any other type return as varchar2
END CASE;
END LOOP;
-- Display what columns are being returned...
DBMS_OUTPUT.PUT_LINE('-- Columns --');
FOR j in 1..col_cnt
LOOP
DBMS_OUTPUT.PUT_LINE(rec_tab(j).col_name||' - '||case rec_tab(j).col_type when 1 then 'VARCHAR2'
when 2 then 'NUMBER'
when 12 then 'DATE'
else 'Other' end);
END LOOP;
DBMS_OUTPUT.PUT_LINE('-------------');
-- This part outputs the DATA
LOOP
-- Fetch a row of data through the cursor
v_ret := DBMS_SQL.FETCH_ROWS(c);
-- Exit when no more rows
EXIT WHEN v_ret = 0;
v_rowcount := v_rowcount + 1;
DBMS_OUTPUT.PUT_LINE('Row: '||v_rowcount);
DBMS_OUTPUT.PUT_LINE('--------------');
-- Fetch the value of each column from the row
FOR j in 1..col_cnt
LOOP
-- Fetch each column into the correct data type based on the description of the column
CASE rec_tab(j).col_type
WHEN 1 THEN DBMS_SQL.COLUMN_VALUE(c,j,v_v_val);
DBMS_OUTPUT.PUT_LINE(rec_tab(j).col_name||' : '||v_v_val);
WHEN 2 THEN DBMS_SQL.COLUMN_VALUE(c,j,v_n_val);
DBMS_OUTPUT.PUT_LINE(rec_tab(j).col_name||' : '||v_n_val);
WHEN 12 THEN DBMS_SQL.COLUMN_VALUE(c,j,v_d_val);
DBMS_OUTPUT.PUT_LINE(rec_tab(j).col_name||' : '||to_char(v_d_val,'DD/MM/YYYY HH24:MI:SS'));
ELSE
DBMS_SQL.COLUMN_VALUE(c,j,v_v_val);
DBMS_OUTPUT.PUT_LINE(rec_tab(j).col_name||' : '||v_v_val);
END CASE;
END LOOP;
DBMS_OUTPUT.PUT_LINE('--------------');
END LOOP;
-- Close the cursor now we have finished with it
DBMS_SQL.CLOSE_CURSOR(c);
END;
SQL> exec run_query('select empno, ename, deptno, sal from emp where deptno = 10');
-- Columns --
EMPNO - NUMBER
ENAME - VARCHAR2
DEPTNO - NUMBER
SAL - NUMBER
Row: 1
EMPNO : 7782
ENAME : CLARK
DEPTNO : 10
SAL : 2450
Row: 2
EMPNO : 7839
ENAME : KING
DEPTNO : 10
SAL : 5000
Row: 3
EMPNO : 7934
ENAME : MILLER
DEPTNO : 10
SAL : 1300
PL/SQL procedure successfully completed.
SQL> exec run_query('select * from emp where deptno = 10');
-- Columns --
EMPNO - NUMBER
ENAME - VARCHAR2
JOB - VARCHAR2
MGR - NUMBER
HIREDATE - DATE
SAL - NUMBER
COMM - NUMBER
DEPTNO - NUMBER
Row: 1
EMPNO : 7782
ENAME : CLARK
JOB : MANAGER
MGR : 7839
HIREDATE : 09/06/1981 00:00:00
SAL : 2450
COMM :
DEPTNO : 10
Row: 2
EMPNO : 7839
ENAME : KING
JOB : PRESIDENT
MGR :
HIREDATE : 17/11/1981 00:00:00
SAL : 5000
COMM :
DEPTNO : 10
Row: 3
EMPNO : 7934
ENAME : MILLER
JOB : CLERK
MGR : 7782
HIREDATE : 23/01/1982 00:00:00
SAL : 1300
COMM :
DEPTNO : 10
PL/SQL procedure successfully completed.
SQL> exec run_query('select * from dept where deptno = 10');
-- Columns --
DEPTNO - NUMBER
DNAME - VARCHAR2
LOC - VARCHAR2
Row: 1
DEPTNO : 10
DNAME : ACCOUNTING
LOC : NEW YORK
PL/SQL procedure successfully completed.
SQL>In 11g, you can create a sys_refcursor and then the DBMS_SQL package allows you to convert that refcursor into a DBMS_SQL cursor so that you can get the description of the results and do the same. This isn't available prior to 11g though.
However_ before any of that, you should really ask yourself if there is a real need to dynamically be creating queries. There is rarely any real need to do that and if you're finding it's common in your application then this is often a sign of poor design or poorly defined business requirements (leaving the technical side to try and be "flexible" and hence leading to unmaintainable code etc.). -
How to pipeline a function with a dynamic number of columns?
Hi everyone,
I'm trying to figure out how to write a piplined function that generates a dynamic SQL statement from its inputs, executes the query, and returns the results of the query in the pipeline. The number and names of the columns in the dynamic query is unknown number until the function is invoked.
I suspect that DBMS_SQL is involved, but can't quite figure out how to construct a row using it that I can use PIPE ROW on. I also can't figure out what data type the function should return (ANYDATASET?)
pseudo-PLSQL follows:
create function myfunction ( param1 varchar2)
return anydataset pipelined
as
query_string := <... do stuff with param1 ...>
< -- >
open a cursor for query_string
determine the number of columns
read a row
PIPE ROW it
<--->
Can what I'm trying to do be done?
Thanks,
KeithThe following works on 10R2
create or replace type NColPipe as object
l_parm varchar2(10), -- The parameter given to the table function
rows_requested number, -- The parameter given to the table function
ret_type anytype, -- The return type of the table function
rows_returned number, -- The number of rows currently returned by the table function
static function ODCITableDescribe( rtype out anytype, p_parm in varchar2, p_rows_req in number := 2 )
return number,
static function ODCITablePrepare( sctx out NColPipe, ti in sys.ODCITabFuncInfo, p_parm in varchar2, p_rows_req in number := 2 )
return number,
static function ODCITableStart( sctx in out NColPipe, p_parm in varchar2, p_rows_req in number := 2 )
return number,
member function ODCITableFetch( self in out NColPipe, nrows in number, outset out anydataset )
return number,
member function ODCITableClose( self in NColPipe )
return number,
static function show( p_parm in varchar2, p_rows_req in number := 2 )
return anydataset pipelined using NColPipe
create or replace type body NColPipe as
static function ODCITableDescribe( rtype out anytype, p_parm in varchar2, p_rows_req in number := 2 )
return number
is
atyp anytype;
begin
anytype.begincreate( dbms_types.typecode_object, atyp );
if p_parm = 'one'
then
atyp.addattr( 'one'
, dbms_types.typecode_varchar2
, null
, null
, 10
, null
, null
elsif p_parm = 'two'
then
atyp.addattr( 'one'
, dbms_types.typecode_varchar2
, null
, null
, 10
, null
, null
atyp.addattr( 'two'
, dbms_types.typecode_varchar2
, null
, null
, 10
, null
, null
else
atyp.addattr( p_parm || '1'
, dbms_types.typecode_varchar2
, null
, null
, 10
, null
, null
atyp.addattr( p_parm || '2'
, dbms_types.typecode_varchar2
, null
, null
, 10
, null
, null
atyp.addattr( p_parm || '3'
, dbms_types.typecode_number
, 10
, 0
, null
, null
, null
end if;
atyp.endcreate;
anytype.begincreate( dbms_types.typecode_table, rtype );
rtype.SetInfo( null, null, null, null, null, atyp, dbms_types.typecode_object, 0 );
rtype.endcreate();
return odciconst.success;
exception
when others then
return odciconst.error;
end;
static function ODCITablePrepare( sctx out NColPipe, ti in sys.ODCITabFuncInfo, p_parm in varchar2, p_rows_req in number := 2 )
return number
is
elem_typ sys.anytype;
prec pls_integer;
scale pls_integer;
len pls_integer;
csid pls_integer;
csfrm pls_integer;
tc pls_integer;
aname varchar2(30);
begin
tc := ti.RetType.GetAttrElemInfo( 1, prec, scale, len, csid, csfrm, elem_typ, aname );
sctx := NColPipe( p_parm, p_rows_req, elem_typ, 0 );
return odciconst.success;
end;
static function ODCITableStart( sctx in out NColPipe, p_parm in varchar2, p_rows_req in number := 2 )
return number
is
begin
return odciconst.success;
end;
member function ODCITableFetch( self in out NColPipe, nrows in number, outset out anydataset )
return number
is
begin
anydataset.begincreate( dbms_types.typecode_object, self.ret_type, outset );
for i in self.rows_returned + 1 .. self.rows_requested
loop
outset.addinstance;
outset.piecewise();
if self.l_parm = 'one'
then
outset.setvarchar2( to_char( i ) );
elsif self.l_parm = 'two'
then
outset.setvarchar2( to_char( i ) );
outset.setvarchar2( 'row: ' || to_char( i ) );
else
outset.setvarchar2( 'row: ' || to_char( i ) );
outset.setvarchar2( 'row: ' || to_char( i ) );
outset.setnumber( i );
end if;
self.rows_returned := self.rows_returned + 1;
end loop;
outset.endcreate;
return odciconst.success;
end;
member function ODCITableClose( self in NColPipe )
return number
is
begin
return odciconst.success;
end;
end;
/And to use it
SQL> select * from table( NColPipe.show( 'test', 3 ) );
test1 test2 test3
row: 1 row: 1 1
row: 2 row: 2 2
row: 3 row: 3 3
SQL> select * from table( NColPipe.show( 'two', 5 ) );
one two
1 row: 1
2 row: 2
3 row: 3
4 row: 4
5 row: 5
SQL> select * from table( NColPipe.show( 'one' ) );
one
1
2
SQL> Anton -
How to generate report with dynamic variable number of columns?
How to generate report with dynamic variable number of columns?
I need to generate a report with varying column names (state names) as follows:
SELECT AK, AL, AR,... FROM States ;
I get these column names from the result of another query.
In order to clarify my question, Please consider following table:
CREATE TABLE TIME_PERIODS (
PERIOD VARCHAR2 (50) PRIMARY KEY
CREATE TABLE STATE_INCOME (
NAME VARCHAR2 (2),
PERIOD VARCHAR2 (50) REFERENCES TIME_PERIODS (PERIOD) ,
INCOME NUMBER (12, 2)
I like to generate a report as follows:
AK CA DE FL ...
PERIOD1 1222.23 2423.20 232.33 345.21
PERIOD2
PERIOD3
Total 433242.23 56744.34 8872.21 2324.23 ...
The TIME_PERIODS.Period and State.Name could change dynamically.
So I can't specify the state name in Select query like
SELECT AK, AL, AR,... FROM
What is the best way to generate this report?SQL> -- test tables and test data:
SQL> CREATE TABLE states
2 (state VARCHAR2 (2))
3 /
Table created.
SQL> INSERT INTO states
2 VALUES ('AK')
3 /
1 row created.
SQL> INSERT INTO states
2 VALUES ('AL')
3 /
1 row created.
SQL> INSERT INTO states
2 VALUES ('AR')
3 /
1 row created.
SQL> INSERT INTO states
2 VALUES ('CA')
3 /
1 row created.
SQL> INSERT INTO states
2 VALUES ('DE')
3 /
1 row created.
SQL> INSERT INTO states
2 VALUES ('FL')
3 /
1 row created.
SQL> CREATE TABLE TIME_PERIODS
2 (PERIOD VARCHAR2 (50) PRIMARY KEY)
3 /
Table created.
SQL> INSERT INTO time_periods
2 VALUES ('PERIOD1')
3 /
1 row created.
SQL> INSERT INTO time_periods
2 VALUES ('PERIOD2')
3 /
1 row created.
SQL> INSERT INTO time_periods
2 VALUES ('PERIOD3')
3 /
1 row created.
SQL> INSERT INTO time_periods
2 VALUES ('PERIOD4')
3 /
1 row created.
SQL> CREATE TABLE STATE_INCOME
2 (NAME VARCHAR2 (2),
3 PERIOD VARCHAR2 (50) REFERENCES TIME_PERIODS (PERIOD),
4 INCOME NUMBER (12, 2))
5 /
Table created.
SQL> INSERT INTO state_income
2 VALUES ('AK', 'PERIOD1', 1222.23)
3 /
1 row created.
SQL> INSERT INTO state_income
2 VALUES ('CA', 'PERIOD1', 2423.20)
3 /
1 row created.
SQL> INSERT INTO state_income
2 VALUES ('DE', 'PERIOD1', 232.33)
3 /
1 row created.
SQL> INSERT INTO state_income
2 VALUES ('FL', 'PERIOD1', 345.21)
3 /
1 row created.
SQL> -- the basic query:
SQL> SELECT SUBSTR (time_periods.period, 1, 10) period,
2 SUM (DECODE (name, 'AK', income)) "AK",
3 SUM (DECODE (name, 'CA', income)) "CA",
4 SUM (DECODE (name, 'DE', income)) "DE",
5 SUM (DECODE (name, 'FL', income)) "FL"
6 FROM state_income, time_periods
7 WHERE time_periods.period = state_income.period (+)
8 AND time_periods.period IN ('PERIOD1','PERIOD2','PERIOD3')
9 GROUP BY ROLLUP (time_periods.period)
10 /
PERIOD AK CA DE FL
PERIOD1 1222.23 2423.2 232.33 345.21
PERIOD2
PERIOD3
1222.23 2423.2 232.33 345.21
SQL> -- package that dynamically executes the query
SQL> -- given variable numbers and values
SQL> -- of states and periods:
SQL> CREATE OR REPLACE PACKAGE package_name
2 AS
3 TYPE cursor_type IS REF CURSOR;
4 PROCEDURE procedure_name
5 (p_periods IN VARCHAR2,
6 p_states IN VARCHAR2,
7 cursor_name IN OUT cursor_type);
8 END package_name;
9 /
Package created.
SQL> CREATE OR REPLACE PACKAGE BODY package_name
2 AS
3 PROCEDURE procedure_name
4 (p_periods IN VARCHAR2,
5 p_states IN VARCHAR2,
6 cursor_name IN OUT cursor_type)
7 IS
8 v_periods VARCHAR2 (1000);
9 v_sql VARCHAR2 (4000);
10 v_states VARCHAR2 (1000) := p_states;
11 BEGIN
12 v_periods := REPLACE (p_periods, ',', ''',''');
13 v_sql := 'SELECT SUBSTR(time_periods.period,1,10) period';
14 WHILE LENGTH (v_states) > 1
15 LOOP
16 v_sql := v_sql
17 || ',SUM(DECODE(name,'''
18 || SUBSTR (v_states,1,2) || ''',income)) "' || SUBSTR (v_states,1,2)
19 || '"';
20 v_states := LTRIM (SUBSTR (v_states, 3), ',');
21 END LOOP;
22 v_sql := v_sql
23 || 'FROM state_income, time_periods
24 WHERE time_periods.period = state_income.period (+)
25 AND time_periods.period IN (''' || v_periods || ''')
26 GROUP BY ROLLUP (time_periods.period)';
27 OPEN cursor_name FOR v_sql;
28 END procedure_name;
29 END package_name;
30 /
Package body created.
SQL> -- sample executions from SQL:
SQL> VARIABLE g_ref REFCURSOR
SQL> EXEC package_name.procedure_name ('PERIOD1,PERIOD2,PERIOD3','AK,CA,DE,FL', :g_ref)
PL/SQL procedure successfully completed.
SQL> PRINT g_ref
PERIOD AK CA DE FL
PERIOD1 1222.23 2423.2 232.33 345.21
PERIOD2
PERIOD3
1222.23 2423.2 232.33 345.21
SQL> EXEC package_name.procedure_name ('PERIOD1,PERIOD2','AK,AL,AR', :g_ref)
PL/SQL procedure successfully completed.
SQL> PRINT g_ref
PERIOD AK AL AR
PERIOD1 1222.23
PERIOD2
1222.23
SQL> -- sample execution from PL/SQL block
SQL> -- using parameters derived from processing
SQL> -- cursors containing results of other queries:
SQL> DECLARE
2 CURSOR c_period
3 IS
4 SELECT period
5 FROM time_periods;
6 v_periods VARCHAR2 (1000);
7 v_delimiter VARCHAR2 (1) := NULL;
8 CURSOR c_states
9 IS
10 SELECT state
11 FROM states;
12 v_states VARCHAR2 (1000);
13 BEGIN
14 FOR r_period IN c_period
15 LOOP
16 v_periods := v_periods || v_delimiter || r_period.period;
17 v_delimiter := ',';
18 END LOOP;
19 v_delimiter := NULL;
20 FOR r_states IN c_states
21 LOOP
22 v_states := v_states || v_delimiter || r_states.state;
23 v_delimiter := ',';
24 END LOOP;
25 package_name.procedure_name (v_periods, v_states, :g_ref);
26 END;
27 /
PL/SQL procedure successfully completed.
SQL> PRINT g_ref
PERIOD AK AL AR CA DE FL
PERIOD1 1222.23 2423.2 232.33 345.21
PERIOD2
PERIOD3
PERIOD4
1222.23 2423.2 232.33 345.21 -
Add column with row number to table
Hi,
to a table view I'd like to add a new column that contains the row number for each row.
I have many data sources (twelve) and with the union operator I create one output dataset. The output data is sorted by the arrangement of the input ports of the union operator.
Is there a way to add a column with its corresponding entry number?
Regards, FTI have a similar question to the original post. It seems your answer will fill the new field in all rows with the same value. But, what if we want an actual row number?
I am simply looking to add a row number to a table. I only have one data source. The business scenario is that the output of the data service is sorted in descending order on value. I want to be able to select the first 10 (i.e. the top 10 items based on that value).
Even if I can solve my business scenario without using a row number field after the sort, it seems like a technique that would come in handy.
Any ideas? I'm pretty new to using Visual Composer so I may be missing something obvious.
Maybe you are looking for
-
Error when accessing a custom RFC from the ISA framework
Hi, I am trying to add new functionality to Ecommerce 5.0 by providing my own custom actions and calling a custom RFC. I followed the procedure given in "Development and Extension Guide u2013 SAP E-Commerce 5.0" i.e., "Extension Demo 6: Copy-Template
-
Unable to setup Printer shared from Windows XP
Hi, I am running snow leopard 10.6.2 and am trying to setup a printer attached to a Windows XP. The sharing is all setup and I am able to print to it from another windows machine. But my Mac will not even see it. Any tips or ideas?
-
Pdf files wil not open under Windows Live Mail
PDF Files will not open in WIndows Live Mail. I deinstalled Adobe Reader and reinstalled a more recent version but to no avail. It will open very well using WIndows explorer or when opening the reader. Any clues someone?
-
I face problem when i run database in my computer
dear all, I face one problem when i want run oracle 9i in my computer, when i open enterprise and i want open my database their one massage it come it return ( your database curnntly is down try to connect with sysdba and change the status to open ),
-
Hi, everyone, a question about sapscript?
Hi, everyone, My sapscript have one page and next page is the same as the first page, the page have two window, a var window and a main window, in the main window there is a command at the top that is "/: BOX FRAME 10 TW". and when I preview the form