Decide between Temoporary tables, Nested tables and Arrays
Hello everyone.
I need to convert T-SQL function to PL-SQL.
I have this line in T-SQL:
DECLARE @FTAP TABLE ([Value] [int] PRIMARY KEY NONCLUSTERED NOT NULL, UNIQUE ([Value]ASC )); As I see that, there are several equivalents in PL-SQL:
1. Global temporary table.
2. Nested table.
3. Array.
The table is declared in the function for reusing in the same function.
When the function finished the table should delete.
Also, the table should have index (or primary key...).
What is the best choice?
be careful in directly translating SQL server code to Oracle. they are fundamentally different in terminology and in the way they work.
you can use associated arrays with record types:
SQL> declare
2 type rec_demo is record (id number, txt varchar2(100));
3 type tab_demo is table of rec_demo index by binary_integer;
4 v_tab_demo tab_demo;
5 begin
6
7 v_tab_demo(1).id := 23;
8 v_tab_demo(1).txt := 'demo';
9 v_tab_demo(2).id := 54;
10 v_tab_demo(2).txt := 'demo2';
11
12 for i in 1..v_tab_demo.count loop
13 dbms_output.put_line(v_tab_demo(i).txt);
14 end loop;
15
16
17 end;
18 /
demo
demo2you can also use collections in other ways. Most people would advise against using global temporary tables unless there's no other way and even then they'd recommend materialised views etc.
can you elaborate a bit more about how you're using it? if we know what purpose it's being used for we may be able to assist a bit more efficiently.
Similar Messages
-
How to return a OCI Table * (nested table) from OCI application to sqlplus
Hi,
How to return a OCI Table * (nested table) from OCI application to sqlplus prompt : OCITAble * shows up as empty on the SQLPLUS prompt.
The ODCIAggregateTerminate member function's OUT parameter is OCITable * returnValue. After completion of this member function it displays data on the sqlplus prompt.
My problem is that eventhough my OCITable(returnvalue) has elements appended or added to it. But when I return the OCITAble after completion
of this member function the OCITable shows up as empty collection on the SQLPLUS prompt. But in the OCI code if I iterate through the collection
I can print out the elements and see their values or data.
Can any one let me know how I can make the elements or data in the collection available at SQLPLUS prompt after the completion of this member function.
If my return value or OUT parameter of this member function is OCINumber * returnValue : then I can see the corresponding value assigned in the OCI Code
and the same value is returned and visible on the SQLPLUS prompt. But when I use the OUT parameter as OCITAble * : then it shows up as empty collection.
I don't really know why is it happening so.
member function ODCIAggregateTerminate(
self IN OUT MinDistanceImpl, returnValue OUT table_out1,
flags IN number)
return number
as language C
library custagg name "ODCIAggregateTerminate"
with context
parameters (
context,
self,
self INDICATOR STRUCT,
returnValue ,
returnValue INDICATOR,
flags,
flags INDICATOR ,
RETURN ),
typedef OCITable table_out1;
struct ntab_type
OCINumber empno;
OCINumber salary;
OCIString * tst;
OCIString * te;
typedef struct ntab_type ntab_type;
struct ntab_type_ind
OCIInd _atomic;
OCIInd empno;
OCIInd salary;
OCIInd tst;
OCIInd te;
typedef struct ntab_type_ind ntab_type_ind;
extern "C" OCINumber * ODCIAggregateTerminate(
OCIExtProcContext *context,
MinDistanceImpl * self,
MinDistanceImpl_ind * self_ind,
table_out1 * returnValue,
short * returnValue_ind,
OCINumber * flags,
short flags_ind)
ocitypename for collection..
ocitypename for element
ociobjectnew for collection
ociobjectNew's for elements
ocicollappend of elements to collection
then iterate thru collection
and at them collection as those elements and we return that collection
But is empty : on SQLPLUS prompt :
Select Mindis(TT) from table1;
TT(empno, salary, tstart, te)
Table_Out1()> Can anyone pls let me know if there is some way to return an entire table from a function which
is called from a stored procedure?
For what purpose?
Do you realise that this means pulling Megabytes (or even many Gugabytes) of data from disk, into the buffer cache, and then copying that data into PL/SQL memory (using a function) in order to give a stored proc that data?
This is just plain crazy.. resource wise, performance wise, scalability wise.. this is exactly how NOT to use Oracle.
Why don't you instead tell us what problem you want to solve. Forget for the moment what you think the solution should be. (and asking us how to get a potentially flawed solution, to work)
Let's get an accurate problem definition so that we can provide you with suggestions and recommendation on what Oracle features can be used to address that problem. -
How to call LabView function with nested structs and arrays from C#
Hi,
I've got the following functions defined in a LabView-dll:
uint32_t __stdcall VOSC04_General(uint32_t Command, TD18Hdl *Messages);
uint32_t __stdcall CheckDiameter(uint32_t Command, TD6 *Parameter);
typedef struct {
double SP_Diameter;
double SP_Tolerantie;
double PV_Diameter;
} TD6;
typedef struct {
int32_t dimSize;
int32_t Numeric[1];
} TD18;
typedef TD18 **TD18Hdl;
I've got some C#-code (generated by PInvoke-wizard) to call these functions:
[DllImport("vosc04.dll")]
public static extern uint32_t VOSC04_General (uint32_t Command, ref TD18Hdl Messages);
[DllImport("vosc04.dll")]
public static extern uint32_t CheckDiameter(uint32_t Command, ref TD6 Parameter);
[StructLayout(LayoutKind.Sequential,Pack=4)]
public struct TD18
public int32_t dimSize;
[ MarshalAs( UnmanagedType.ByValArray, SizeConst=1)]
public int32_t [] Numeric;
[StructLayout(LayoutKind.Sequential,Pack=4)]
public struct TD6
public Double SP_Diameter;
public Double SP_Tolerantie;
public Double PV_Diameter;
The problem now is that when I try to read the Messages-output-parameter, I get wrong values (pointers?). I think that the problem lies in the fact that LabView generated a TD18 AND an TD18Hdl struct.
How can I correct this problem?
Can anyone give me some advise to correct this problem? I'm not an expert in C, only in C#.I think the problematic line is this:
public struct TD18
public int32_t dimSize;
[ MarshalAs( UnmanagedType.ByValArray, SizeConst=1)]
public int32_t [] Numeric;
It looks like C# is forcing the array to be of size 1. The thing is, LabVIEW stores arrays as handles which are double pointers to a structure which contains a size element followed by the elements of the array. For your example, int32 arrays are stored in memory as:
handle -> location -> |size|element 1|element 2| .... |element size-1|
Because C does not do runtime array bounds checking, you can get away by declaring the structure as:
typedef struct {
int32_t dimSize;
int32_t Numeric[1];
} TD18;
The correct declaration would've been:
typedef struct {
int32_t dimSize;
int32_t Numeric[size];
} TD18;
But size is not a constant, so C/C++ won't let you do that. So, even though the array is declared to be of size 1, it can (and usually does) have more than 1 element. This does not cause a problem because LabVIEW allocates memory based on the actual size of the array.
If I were you, I'd try to change the prototype of the LabVIEW DLL function to accept a pointer to array data, rather than an array handle, pre-allocate memory for the array in C# and pass a pointer to the allocated memory into LabVIEW so that LabVIEW can "fill it up".
Let me know if you need more information.
Pramod -
How to delete the NULL entries in nest table
Hi,
After I used a loop and open/fetch cursor populated the object table
I found there are random NULL entries in my object table (nest table)
The data look like this
NULL NULL NULL
NULL NULL NULL
123 03-MAY-04 ACTIVE
NULL NULL NULL
NULL NULL NULL
234 21-MAY-04 ACTIVE
NULL NULL NULL
345 11-MAY-04 ACTIVE
NULL NULL NULL
How can I get rid of those NULL entries in my nest table? So it can become
123 03-MAY-04 ACTIVE
234 21-MAY-04 ACTIVE
345 11-MAY-04 ACTIVE
Additional info:
create type myType as object
(id NUMBER (10,0),
eff_date date,
status VARCHAR2(17)
create type myNestTab as table of myType;
I have tried Delete procedure in following two ways.
Version 1:
FOR i IN l_my_nest_tab.FIRST..l_my_nest_tab.LAST
LOOP
IF l_my_nest_tab(i).id IS NULL THEN
l_curr_event_tb.DELETE(i);
END IF;
END LOOP;
Version 2:
FOR i IN l_my_nest_tab.FIRST..l_my_nest_tab.LAST
LOOP
IF l_my_nest_tab(i) IS NULL THEN
l_curr_event_tb.DELETE(i);
END IF;
END LOOP;
Both of them give me the error no data found. And only left me the first NOT NULL entry in the table.
123 03-MAY-04 ACTIVE
Thanks in avdance.Hi Vishnu,
u can write a report program for this and in that use the event :
AT NEW <field-name> ( use primary key)
your statements
ENDAT
for eg.
loop at itab ( herfe itab must be of type of table for which u want to track new entries)
at new matnr
write:/ new record
endat
endloop.
schedule this report in background to run in every 5 or 10 mins as per your requirement and hence changes can be tracked.
regards
Vinod -
Is it possible to create nested tables in MySql database?
I am currently working on a project with my team and I'm in charge of designing the database. It's going to be a service delivery app that's going to have the name of several clients and their respective list services and cost of each service. The problem I'm having right now is finding a way to create separate tables, menus if you will, of their list of services offered since they all have different prices.
Here's my question, can I create individual tables within a larger table (nested tables) using MySQL or would you recommend a different method?
Please bear in min this is my first SQL project and I've had no prior experience with it.
This topic first appeared in the Spiceworks CommunityIt seems that the ability to link to a KB article within the WYSIWYG is broken.
Spiceworks 7.4.00070
IE 11 and Mozilla 38.0.5
Can anyone else confirm?-Open the User Portal, edit any page and click the "Knowledge Base Article Link" button. -Chose a KB article and then publish your change.
-Hover over the newly created KB link and/or click on the link.*screenshots are what I get. -
Trying to decide between i7 and quad core - was told that i7 will overheat?
Hi,
Did some searching in old threads on this here and online - seemed inconclusive so thought I'd ask again since the Core i7s have been out a while now.
I've been trying to decide between buying a quad core and one of the recent MPB 15" i7s (specifically the 2.66 with the hi res non glare screen). I use FCP, DVDSP, Photoshop etc - usually for several hours a day.
Although the quad core seems the logical choice, I'm on a budget would like some wiggle room to get some other gear - if I get the MPB, I'd be able to sell my 13" 2.53 Core 2 Duo and get that gear. On the other hand, I'm trying to think long term in terms of the viability of the machine I buy.
Just got off the phone with MacMall who told me that because the quad core uses physical cores and the MPB Core i7 uses virtual cores there is a substantial overheating issue with the MPB if you're doing sustained work - say working in Photoshop all day, as I often do. He said that the MBP Core i7s weren't designed to do that so the overheating could cause logic board and other issues over time.
Has anyone experienced this?? Or if you have other thoughts on my dilemma, would love to hear them.
Thanks!
cbI will be a bit more blunt than the other person. Whomever you talked to at MacMall was full of it.
Either you transcribed the details of the conversation wrong, or they have no clue what they're talking about.
Even if you're doing a lot of work in Photoshop all day, the odds of you doing anything that requires a lot of sustained heavy action by the CPU is going to be low. There might be 5 minutes worth of something here or there, but most of the time it's probably going to be pretty limited CPU wise.
There's a reason Apple doesn't put the Core i5 or i7 into the 13" MBPs, and that's because there's just not enough room in the case for the second fan the 15 and 17" models have.
But long story short, Apple isn't like HP or Acer, who will stuff desktop CPUs into laptops because there's some idiot out there who will buy it. And it would be pretty stupid to put a high end CPU like the Core i7 into a laptop, and then expect people NOT to use it.
MBPs aren't really designed for hours worth of sustained work like you'd get from gaming, but I don't think you'd run into any problems with Photoshop. -
I have a S.M.A.R.T error on my current Hitachi drive that came with me Early 2011 Macbook pro. Want to upgrade to SSD.
Trying to decide between Samsung 840 EVO 250gb and Crucial M500 240gb, at this gb range, the Samsung is faster and uses less wattage....ONE PROBLEM...I have read many user experiences that note it is much less mac-friendly...
The software samsung offers is not IOS compatible and some report lower than expected speeds after installation...Also apparently the RAPID MODE of the drive, the fastest drive mode is nonexistant when installed on a Macbook pro?
Should I opt for the slower and more power cosuming Crucial M500 240gb SSD because it is more Mac-friendly? Does anyone have a Samsung 840 EVO 250 gb SSD installed in their macbook pro? What has been your experience?
Thanks ahead of time!
Resoure: http://www.tomshardware.com/reviews/crucial-m500-1tb-ssd,3551.htmlI decided against the Evo as there are too many Mac users that have had issues with slow speed on them. Even without these, the main speed that Samsung states for the Evo comes form turbo Write which is a PC only feature as is software dependent.
I'm sorry but Crucials M500 is simply too slow compared to modern drives to be recomended. Read speed is ok, but the write is far too slow for the price.
I've used and installed both a Samsung 840 basic and a Samsung 840 Pro in 2 separate Mac books! and currently have the 840 Pro in my own MacBook Pro and it comes very highly recomended. It's all but the fastest Sata III drive you can buy - A few OCZ drives just edge it but the difference is negligible. Samsung by far have the best reliability though when it comes to SSD's. I've been getting 520Mb/s easily on mine consistently, and without getting a MacBook with a PCIe drive you won't get a faster more reliable drive.
I really would recommend nothing else. -
In Smartforms can i use table type which has table inside table
Hi ,
I would like to know whether in Form Interface can we declare table type which has a table and one of its field is again a table( Nested tables)..
Can we declare like that ?? Need your suggestions please...
Rgds.,
subashYes, we can.
Check Smartform LB_BIL_INVOICE
Importing parameter IS_BIL_INVOICE TYPE LBBIL_INVOICE
Regards,
Naimesh Patel -
How to insert array of records in Storage table and Nested table same time??
Hi,
I am using ProC++ ( Oracle 8i) . I want to insert a host array
in a table. That table has a nested table in it. So for every
record in my host array, there are muliple records to be
inserted in Nested table. How is this possible using pro*C??
Pls help.
Thanks
NiveditaHave a look at the Oracle 9i PL/SQL manual, which has an example.
-
Associative Array to Nested Table: Anything faster?
(First Post! Some ASP.NET references, but I think this really is a PL/SQL question)
I work on a team that runs an Oracle instance for data warehousing and reporting along with an ASP.NET based website for display.
Sometimes, I may want to have many parameters come in and only show records that match those parameters. For example, I may want to show all employees who are Managers or Developers and not show employees who are Accountants or Scientists. Typically, I send a parameter into my PL/SQL stored procedures as an associative array (as declared in my package specification). Once in the procedure, I convert that associative array into another associative array (as a user created SQL type) and then I'm able to use it like a nested table to join on.
My question is: in your experience, is there any way to get around this type conversion or another faster way?
For example:
-- Create the sql type
CREATE OR REPLACE TYPE DIM.sql_string_table AS TABLE OF VARCHAR2(255);
--pretend that this works and it's in a package body
declare
type string_table is table of varchar2(255) index by binary_integer;
l_job_types string_table; -- Keep in mind I'd normally be sending this via ASP.NET
l_job_types_nested sql_string_table := sql_string_table();
begin
-- Add some data
l_job_types(0) := 'Manager';
l_job_types(1) := 'Developer';
-- Do the conversion
for i in l_job_types.first .. l_job_types.last
loop
l_job_types_nested.extend;
l_job_types_nested(l_job_types_nested.count) := l_job_types(i);
end loop;
-- get some data out (we're pretending)
open fake_ref_cursor for
Select e.*
from employees e,
the(select cast(l_job_types_nested as sql_string_table) from dual) jobs_types_wanted
where e.type = value(jobs_types_wanted);
end;
The result would be all employees whose have a type that was input into the l_job_types associatve array.
See: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:110612348061
for additional reference> I convert that associative array into another associative array (as a user created SQL type)
Just so we're clear, Oracle use the term 'associative array' to refer to the exclusively PL/SQL sparse collection type ("table of x index by pls_integer" etc) as distinct from the common nested table collection type.
Also I could be wrong but I think
SELECT ..
FROM the(select cast(l_job_types_nested as sql_string_table) from dual) jobs_types_wantedis generally the same as
SELECT ..
FROM TABLE(l_job_types_nested) jobs_types_wantedthough "SELECT *" and implicitly collection casting don't always mix. The "THE()" syntax is deprecated. -
Trying to use the following within Apex:
CREATE TYPE location_typ AS OBJECT (
location_id NUMBER(4),
street_address VARCHAR2(40),
postal_code VARCHAR2(12),
city VARCHAR2(30),
state_province VARCHAR2(25));
CREATE TYPE nt_location_typ AS TABLE OF location_typ;
CREATE TYPE country_typ AS OBJECT (
country_id CHAR(2),
country_name VARCHAR2(40),
locations nt_location_typ);
CREATE TYPE nt_country_typ AS TABLE OF country_typ;
CREATE TABLE region_tab (
region_id NUMBER,
region_name VARCHAR2(25),
countries nt_country_typ)
NESTED TABLE countries STORE AS nt_countries_tab (
(PRIMARY KEY (NESTED_TABLE_ID, country_id))
ORGANIZATION INDEX COMPRESS
NESTED TABLE locations STORE AS nt_locations_tab);
Can get Apex to function in the Tabular Report mode by modifying the query to use the correct syntax:
select "REGION_ID",
"REGION_NAME",
c.COUNTRY_ID,
c.COUNTRY_NAME,
l.LOCATION_ID,
l.STREET_ADDRESS, l.POSTAL_CODE,
l.CITY,
l.STATE_PROVINCE
from "#OWNER#"."REGION_TAB", TABLE(COUNTRIES) C, TABLE(LOCATIONS) L
Built a 'Maintenance' form. Put the Region base column on it. Then built a tabular form (with an updateable query) on the same page to access the first level Nest ( countries). Haven't figured out how to actually edit the values yet, but feel comfortable I will.
But - trying to provide editing to the 2nd level nested table elements creates a problem. First, only 1 updateable query can be on a page. Hmmm - so to get around this I guess I have to build a new page that the calling updateable query will access when selecting one of the tabular form elements. Not elegant by any means. Was hoping to provide a blank form on the right side that would be populated by the Location Nested Table values when a select was made on the first level nest. Oh well.
Just curious how anyone has handled this? I could pass stack between pages for sure, but was hoping page regions would be sufficient to handle this.
Any white papers on this? Anything in the DEMO area to use as a template? The default Demo doesn't provide this based on querying user objects.
Thanks,
Dwight TaylorOracle Database 10g Enterprise Edition Release 10.1.0.2.0 - 64bit Production
With the Partitioning, OLAP and Data Mining options
SQL> CREATE OR REPLACE TYPE table_type AS TABLE OF VARCHAR2 (8);
2 /
Type created.
SQL> CREATE TABLE r(
2 a INTEGER,
3 b table_type)
4 NESTED TABLE b STORE as b_1;
Table created.
SQL> CREATE TABLE s(
2 a INTEGER,
3 b table_type)
4 NESTED TABLE b STORE as b_2;
Table created.
SQL> INSERT INTO r VALUES (1, table_type ('a', 'b'));
1 row created.
SQL> INSERT INTO s VALUES (1, table_type ('b', 'c'));
1 row created.
SQL> COLUMN c FORMAT A10;
SQL> SELECT r.a, r.b MULTISET UNION DISTINCT s.b c
2 FROM r, s
3 WHERE r.a = s.a;
A C
1 TABLE_TYPE('a', 'b', 'c')
SQL> -
Performance impact using nested tables and object
Hi,
Iam using oracle 11g.
While creating a package, iam using lot of nested tables created based on objects which will be passed between multiple functions in the package..
Will it have any performance impact since all the data is stored in the memory.
How can i measure the performance impact when the data grows ?
Regards,
Oracle User
Edited by: user9080289 on Jun 30, 2011 6:07 AM
Edited by: user9080289 on Jun 30, 2011 6:42 AMuser9080289 wrote:
While creating a package, iam using lot of nested tables created based on objects which will be passed between multiple functions in the package.. Not the best of ideas in general, in PL/SQL. This is not client code that can lay sole claim to most of the memory. It is server code and one of many server processes that need to share the available resources. So capitalism is fine on a client, but you need socialism on the server? {noformat} ;-) {noformat}
Will it have any performance impact since all the data is stored in the memory.Interestingly yes. Usually crunching data in memory is better. In this case it may not be so. The memory used is the most expensive memory Oracle can use - the PGA. Private process memory. This means each process copy running that code, will need lots of memory.
If you're not passing the data structures by reference, it means even bigger demands on memory as the data structure needs to be copied into the call stack and duplicated.
The worse case scenario is that such code consumes so much free server memory, and make such huge demands on having that in pysical memory, it trashes memory management as the swap daemons are unable to keep up with the demand of swapping virtual memory pages into and out of memory. Most CPU time is spend by the swap daemons.
I have seen servers crash due to this. I have seen a single PL/SQL process causing this.
How can i measure the performance impact when the data grows ?Well, you need to look at the impact of your code on PGA memory. It is not SQL performance or I/O performance that is a factor - just how much private process memory your code needs in order to execute. -
Search in Nested Tables and Insert the result into new Nested Table!
How can I search in Nested Tables ex: (pr_travel_date_range,pr_bo_arr) using the SQL below and insert the result into a new Nested Table: ex:g_splited_range_arr.
Here are the DDL and DML SQLs;
Don't worry about the NUMBER( 8 )
CREATE OR REPLACE TYPE DATE_RANGE IS OBJECT ( start_date NUMBER( 8 ), end_date NUMBER( 8 ) );
CREATE OR REPLACE TYPE DATE_RANGE_ARR IS TABLE OF DATE_RANGE;
DECLARE
g_splited_range_arr DATE_RANGE_ARR := DATE_RANGE_ARR( );
g_travel_range DATE_RANGE := DATE_RANGE( '20110101', '99991231' );
g_bo_arr DATE_RANGE_ARR := DATE_RANGE_ARR( DATE_RANGE( '20110312', '20110317' ), DATE_RANGE( '20110315', '20110329' ) );
FUNCTION split_date_sql( pr_travel_date_range DATE_RANGE,
pr_bo_arr DATE_RANGE_ARR )
RETURN DATE_RANGE_ARR
IS
l_splited_range_arr DATE_RANGE_ARR;
BEGIN
SELECT start_date, end_date
INTO l_splited_range_arr(start_date, end_date)
FROM (WITH all_dates
AS (SELECT tr_start_date AS a_date, 0 AS black_out_val FROM TABLE( pr_travel_date_range )
UNION ALL
SELECT tr_end_date, 0 FROM TABLE( pr_travel_date_range )
UNION ALL
SELECT bo_start_date - 1, 1 FROM TABLE( pr_bo_arr )
UNION ALL
SELECT bo_end_date + 1, -1 FROM TABLE( pr_bo_arr )),
got_analytics
AS (SELECT a_date AS start_date,
LEAD( a_date ) OVER (ORDER BY a_date, black_out_val) AS end_date,
SUM( black_out_val ) OVER (ORDER BY a_date, black_out_val) AS black_out_cnt
FROM all_dates)
SELECT start_date, end_date
FROM got_analytics
WHERE black_out_cnt = 0 AND start_date < end_date
ORDER BY start_date);
RETURN l_splited_range_arr;
END;
BEGIN
g_splited_range_arr := split_date_sql(g_travel_range,g_bo_arr);
FOR index_g_splited_range_arr IN g_splited_range_arr .FIRST .. g_splited_range_arr .LAST LOOP
DBMS_OUTPUT.PUT_LINE('g_splited_range_arr[' || index_g_splited_range_arr || ']: ' || g_splited_range_arr(index_g_splited_range_arr).start_date || '-' || g_splited_range_arr(index_g_splited_range_arr).end_date );
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
NULL;
WHEN OTHERS
THEN
NULL;
END;Or can I create a VIEW with parameters of Nested Tables in it so I can simply call
SELECT *
BULK COLLECT INTO g_splited_range_arr
FROM view_split_date(g_travel_range,g_bo_arr);@riedelme
For your questions:
1) I don't want to store in the database as a nested table
2) I don't want to retrieve data from the database. Data will come from function split_date() parameter and data will be processed in the function and function will return it in nested table format. For more detail please look at the raw function SQL.
I have a SQL like:
WITH all_dates
AS (SELECT tr_start_date AS a_date, 0 AS black_out_val FROM travel
UNION ALL
SELECT tr_end_date, 0 FROM travel
UNION ALL
SELECT bo_start_date - 1, 1 FROM black_out_dates
UNION ALL
SELECT bo_end_date + 1, -1 FROM black_out_dates),
got_analytics
AS (SELECT a_date AS start_date,
LEAD( a_date ) OVER (ORDER BY a_date, black_out_val)
AS end_date,
SUM( black_out_val ) OVER (ORDER BY a_date, black_out_val)
AS black_out_cnt
FROM all_dates)
SELECT start_date, end_date
FROM got_analytics
WHERE black_out_cnt = 0 AND start_date < end_date
ORDER BY start_date;I want to change the tables black_out_dates and travel to Nested Array so I can use it in a function with Nested Array travel and Nested Array black_out_dates parameters and the function will return Nested Array of date ranges.
Here is what I want in raw SQL:
DECLARE
g_splited_range_arr DATE_RANGE_ARR := DATE_RANGE_ARR( );
g_travel_range DATE_RANGE := DATE_RANGE( '20110101', '99991231' );
g_bo_arr DATE_RANGE_ARR := DATE_RANGE_ARR( DATE_RANGE( '20110312', '20110317' ), DATE_RANGE( '20110315', '20110329' ) );
FUNCTION split_date_sql( pr_travel_date_range DATE_RANGE,
pr_bo_arr DATE_RANGE_ARR )
RETURN DATE_RANGE_ARR
IS
l_splited_range_arr DATE_RANGE_ARR;
BEGIN
SELECT start_date, end_date
INTO l_splited_range_arr(start_date, end_date)
FROM (WITH all_dates
AS (SELECT tr_start_date AS a_date, 0 AS black_out_val FROM TABLE( pr_travel_date_range )
UNION ALL
SELECT tr_end_date, 0 FROM TABLE( pr_travel_date_range )
UNION ALL
SELECT bo_start_date - 1, 1 FROM TABLE( pr_bo_arr )
UNION ALL
SELECT bo_end_date + 1, -1 FROM TABLE( pr_bo_arr )),
got_analytics
AS (SELECT a_date AS start_date,
LEAD( a_date ) OVER (ORDER BY a_date, black_out_val) AS end_date,
SUM( black_out_val ) OVER (ORDER BY a_date, black_out_val) AS black_out_cnt
FROM all_dates)
SELECT start_date, end_date
FROM got_analytics
WHERE black_out_cnt = 0 AND start_date < end_date
ORDER BY start_date);
RETURN l_splited_range_arr;
END;
BEGIN
g_splited_range_arr := split_date_sql(g_travel_range,g_bo_arr);
FOR index_g_splited_range_arr IN g_splited_range_arr .FIRST .. g_splited_range_arr .LAST LOOP
DBMS_OUTPUT.PUT_LINE('g_splited_range_arr[' || index_g_splited_range_arr || ']: ' || g_splited_range_arr(index_g_splited_range_arr).start_date || '-' || g_splited_range_arr(index_g_splited_range_arr).end_date );
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
NULL;
WHEN OTHERS
THEN
NULL;
END;I must change the tables black_out_dates and travel in a way so it will be something like
FROM TABLE( pr_travel_date_range )to get the result into l_splited_range_arr so it will be something like
SELECT start_date, end_date
INTO l_splited_range_arr(start_date, end_date)
FROM ( -
Nested Tables and Constraints??
Hi all
I have created objects like this
create or replace type type_one
as object
(col_a number(3),
col_b number(2),
col_c varchar2(3 char));
create or replace type type_one_tb as table of type_one;
create or replace type type_two
as object
(col_aa number(2),
col_bb varchar2(3 char),
col_nt type_one_tb);
create or replace type type_two_tb as table of type_two;
create or replace type type_three
as object
(col_cc number(4),
col_ntab type_two_tb)
create table nest_table of type_three
nested table col_ntab store as col_ntab_tbl
(nested table col_nt store as col_nt_tbl);
alter table nest_table
add constraint PK_nest_table
primary key(col_cc);
Now if i want to add COMPOSITE UNIQUE or PRIMARY KEY constraint for this columns
col_a the one in type_one type
and col_aa in type_two type
and col_cc in nest_table table
how to do that ?
Thankssearch in Oracle documentation because I sure that nested table can be created. but as you say in end you want to create as many as relation between the child tables , so for this purpose I think use of procedure is best which will really usefull in this situation.
-
Union all-distinct and remove duplicates from nested table?
Hi all,
I need a select that will bulk collect some data in my nested table.
I have two tables from which I need to select all the accounts only once.(remove duplicates).
Tried to search on the forum...but no luck.
I have a table with one column:
create table a1(account_no number);
and a second table with 3 columns.
create table a2 (account_no number, name number, desc varchar2 (100));
I have a nested table like:
table of a2%rowtype;
Can I select from this two table in one select and put in my nested table just one row per account?
if a I have in a 2a row like :
1 'test' 'test2'
2 aaaa aa
and in a1 a row like:
1
I want to put in my nested table just (1, null,null and 2,aaaa, aa)) or (1,test,test2 and 2,aaaa, aa). it does no matter what row from those two I insert.
Second question:
If I use:
BANNER
Oracle9i Release 9.2.0.5.0 - Production
PL/SQL Release 9.2.0.5.0 - Production
CORE 9.2.0.6.0 Production
TNS for 32-bit Windows: Version 9.2.0.5.0 - Production
NLSRTL Version 9.2.0.5.0 - Production
SQL>
what is the best solution to remove duplicates from a neste table like mine?
I thought that I can build another nested table and loop in my first nt and for each row I check in there was the same account in previous lines.
it will be like:
for i in 1....nt_first.count loop
for j in 1..i loop
--check if my line was in previous lines. if it was...do not move it in my second collection
end loop;it is this best option in oracle 9i?I have a table with one column:
create table a1(account_no number);
and a second table with 3 columns.
create table a2 (account_no number, name number, desc varchar2 (100));
all I need are the accounts. the rest ar extra data
that I can ignore in this step. But if it is
available, it is ok to use it.
using one select in this case is is much better that
trying to remove duplicates parsing some nested table
with FOR many times?
Thankshi,
try to use union. Union automatically removes duplicates between two or more tables.
with t1 AS
(select '3300000' account_no FROM DUAL UNION
select '6500000' account_no FROM DUAL union
select '6500000' account_no FROM DUAL union
select '6500000' account_no FROM DUAL union
select '6500000' account_no FROM DUAL
select * from t1ACCOUNT_NO
3300000
6500000
Maybe you are looking for
-
I'm being asked for my password when I shouldn't be in Net Prefs
Hello, I don't understand why System Prefs asks me for my password to relock after I already entered it seconds earlier to unlock. Network prefs is where this happens, and it occurs about half the time. I'm hesitant to blindly enter my password whene
-
Problem in compiling procedure from another schema
Hi all I have got 2 schemas, say A and B. Schema A owns a procedure P which selects data from table T1 ( external table ) and updates table T2. i have granted Schema B 1) read, write privilege on the directory that table T1 refrences. 2) all on table
-
Current itunes Track for non-ichat users?
hello, well when i'm on ichat i put my status as current itunes track. However, my friends who dont have ichat or mac can not see anything. Is there away that they can see it in there aim buddy list. Thanks!
-
Updated to 1.4 and can't install any apps.
I upgraded to 1.4 and everything seems to work correctly, except that I can't install any apps on the phone. All of my previously downloaded apps are missing. If I check in the My Application section of the App Catalog, it says "You have no applicati
-
Drawing many lines that look unique
In AI CS3, I want to draw anywhere from 20 to 200 freehand lines with the pencil tool that are approximately parallel. Adding a brush to the lines gives me the charcoal or soft pencil look I want, but they are all obviously the same image stretched o