use of collection (object type)
Hi, I need the logic to insert records in the collection variableCould you please give me the tip to complete the section comments
CREATE OR REPLACE TYPE Type_Rt IS OBJECT
(Rt_Type VARCHAR2(2000),
cdtRt VARCHAR2(2000),
lqdtRt VARCHAR2(2000),
Olk VARCHAR2(2000),
cdtwh VARCHAR2(2000) )
CREATE OR REPLACE TYPE Rt_Type_Var IS TABLE OF Type_Rt;
CREATE OR REPLACE PROCEDURE PROC_Rt (Cp_Id VARCHAR2,
St_Id VARCHAR2,
cdt_Rt VARCHAR2,
liq_Rt VARCHAR2,
Olk VARCHAR2,
cdt_Wh VARCHAR2 ,
O_rat_arry OUT Rt_Type_Var -- is this the correct approach
)
IS
DECLARE
v_typ_rt_List Rt_Type_Var; -- is this correct declaration
BEGIN
IF (Cp_Id ='N/A' AND St_Id ='N' AND cdt_Rt ='AA'
AND liq_Rt ='A' AND Olk ='Sle' ) THEN
/*insert into the object type with
Rt_Type = STSRT
cdtRt = AI
lqdtRt =BB
Olk = BLE
cdtwh = DV */
END IF;
IF (Cp_Id ='A' AND St_Id ='Y' AND cdt_Rt ='AB'
AND liq_Rt ='B' AND Olk ='Sle' ) THEN
/* insert into the object type
Rt_Type = STLG
cdtRt = BR
lqdtRt =CR
Olk = WE
cdtwh = PD*/
END IF;
IF (Cp_Id ='B' AND St_Id ='Y' AND cdt_Rt ='BB'
AND liq_Rt ='B' AND Olk ='Sle' ) THEN
/* insert into the object type
Rt_Type = STSRT
cdtRt = CR
lqdtRt =LF
Olk = ER
cdtwh = QA */
END IF;
END;
After performing the procedure how can I call the procedure with grouping variableThank you
Published by: Smile on 13 April 2012 16:22
There are more mistakes than letters in your code. In any case, here's example how to add the element to the collection:
SQL> DECLARE
2 v_typ_rt_List Rt_Type_Var := Rt_Type_Var();
3 BEGIN
4 v_typ_rt_List.extend;
5 v_typ_rt_List(1) := Type_Rt('N/A','N' ,'AA','A','Sle');
6 END;
7 /
PL/SQL procedure successfully completed.
SQL>
SY.
Tags: Database
Similar Questions
-
Function returning the tree used with the object type
Hi guys!
I'm fighting for some time now of a function that should return the tree structure of the employees. Let me clarify...
I have a table say Manager and employees (two columns for an example)
MANAGER_ID
EMPLOYEE_ID
Example:
MAN_ID - 1; EMPLOYE_ID - 2;
MAN_ID - 2; EMPLOYE_ID - 3;
MAN_ID - 2; EMPLOYE_ID - 4;
MAN_ID - 4; EMPLOYE_ID - 5
The purpose of my function is back for a specified MAN_ID everyone in the tree...
Example:
RETURN_TREE (1) return {2,3,4,5};
RETURN_TREE (2) returns {3,4,5};
RETURN_TREE (4) returns {5};
How to get there?
With respect,
PsmakRAnd use BULK COLLECT or the COLLECT function to build the collection:
create type emp_table as table of number(6); /
DECLARE v_emp_list emp_table; BEGIN select cast(collect(employee_id) as emp_table) into v_emp_list from employees connect by prior employee_id = manager_id start with manager_id = :p_man_id -- or /* select employee_id bulk collect into v_emp_list from employees connect by prior employee_id = manager_id start with manager_id = :p_man_id */ END; /
-
How to return data using the object type?
Hello all - I have an obligation to return the values object type.
In the same way as
list - Plan1, Subplan1, Fund1, 2 Fund Fund 3
list - Plan2, Subplan2, Fund2
list - plane3, Subplan3, not funds
To achieve this I wrote below proc but its giving as response below which is does not correspond with my requirement. Someone has an idea how to write code to get the list of funds against each plan in each line?
Output:
PDB01. () T_T_CONTRACT
PDB01. T_O_CONTRACT ('p1', 's1', PDB01. T_O_FUND ('p1', 's1', 'f1')),
PDB01. T_O_CONTRACT ('p1', 's1', PDB01. T_O_FUND ('p1', 's1', 'f2')),
PDB01. T_O_CONTRACT ('p1', 's1', PDB01. T_O_FUND ('p1', 's1', 'f3')),
PDB01. T_O_CONTRACT ('p2', 's2', PDB01. T_O_FUND ('p2', 's2', 'f2')),
PDB01. T_O_CONTRACT ('p3', 's3', PDB01. T_O_FUND (NULL, NULL, NULL))
)
DROP TYPE T_T_fund;
create or replace
TYPE T_O_fund
AS OBJECT)
argument plan_id Varchar2 (128).
subplan_id Varchar2 (128).
fund_id Varchar2 (128)
)
No final;
/
create or replace
type T_T_FUND
as the table of T_O_FUND;
/
type of projection T_T_CONTRACT;
create or replace
TYPE T_O_contract
AS OBJECT)
argument plan_id Varchar2 (128).
SUBPLAN_ID varchar2 (128).
ov_fund T_o_fund
)
no final;
/
create or replace
type T_t_contract as the T_O_contract table;
/
-------------------------
/ * Remove T_T_FUND;
DROP TYPE T_O_fund;
type of projection T_T_CONTRACT;
DROP TYPE T_O_contract; * /
----------------
create or replace
procedure test_cursor (o_c1 OUT sys_refcursor) is
V_T_T_FUND T_T_FUND;
v_T_t_contract T_t_contract;
Start
WITH (CONTRACTS AS
SELECT "p1" PLAN_ID, "s1" SUBPLAN_ID FROM DUAL UNION ALL
SELECT "p2" PLAN_ID, 's2' SUBPLAN_ID FROM DUAL UNION ALL
SELECT "p3" PLAN_ID, 's3' SUBPLAN_ID FROM DUAL
),
Fund)
Select "p1" PLAN_ID, SUBPLAN_ID 's1', 'f1' FUND_ID of all the DOUBLE union
Select "p1" PLAN_ID, SUBPLAN_ID 's1', 'f2' FUND_ID of all the DOUBLE union
Select plan_id "p1", "s1" subplan_id argument, "f3" fund_id Union double all the
Select the argument plan_id 'p2', 's2' subplan_id, 'f2' double fund_id
)
Select T_O_contract (c.PLAN_ID, c.SUBPLAN_ID, T_o_FUND (f.PLAN_ID, f.SUBPLAN_ID, f.FUND_ID))
TO COLLECT FEES IN BULK
in v_T_t_contract
c CONTRACTS, FUND F
where C.PLAN_ID = F.PLAN_ID
and c.SUBPLAN_ID = f.SUBPLAN_ID (+);
Open the O_C1 for
SELECT 't' TYP, v_T_t_contract contract_LST
FROM DUAL;
end;
/
impression o_test
You can declare the attribute OV_FUND as T_T_FUND data type:
create or replace type t_o_contract as object ( plan_id varchar2(128) , subplan_id varchar2(128) , ov_fund t_t_fund ); /
You will be able to do this:
with contracts as ( select 'p1' plan_id, 's1' subplan_id from dual union all select 'p2' plan_id, 's2' subplan_id from dual union all select 'p3' plan_id, 's3' subplan_id from dual ), funds as ( select 'p1' plan_id , 's1' subplan_id, 'f1' fund_id from dual union all select 'p1' plan_id , 's1' subplan_id, 'f2' fund_id from dual union all select 'p1' plan_id , 's1' subplan_id, 'f3' fund_id from dual union all select 'p2' plan_id , 's2' subplan_id, 'f2' fund_id from dual ) select t_o_contract( c.plan_id , c.subplan_id , cast( multiset( select t_o_fund(f.plan_id, f.subplan_id, f.fund_id) from funds f where f.plan_id = c.plan_id and f.subplan_id = c.subplan_id ) as t_t_fund ) ) from contracts c ;
-
How to use a collection type of variable binding to execute dynamic statement
Hello
We have a case where we copy selective data from A to B schema of schema in an oracle database. The copy is obtained using
run immediately 'insert'. target_schema |'. TableA select * from '. from_schema |'. where a.id table (select test_id of ' | from_schema |'.) Table c); " ;
It works very well it takes an average of 10 seconds to copy around 14 paintings. We have an obligation to bring this time to 2 seconds. An observation was the clause
"Select test_id of ' | '. from_schema |'. Table c"in the statement sql preceding repeats for many inserts. So, we thought bulk get this set of codes of practice and use a vatiable bind to collection for the immediate run clause type. Any suggestions on how to achieve this?
Thank you
Chauvin>
in fact, you cannot use native liaison as table_names in dynamic sql variable.
>
True - but OP uses a query string and can factor that string to do what was wanted
>
So we thought bulk get this set of codes of practice and use a collection type bind vatiable
>
It worksCREATE OR REPLACE Package PK_BULK as Type code_tab_type is table of varchar2(25) index by varchar2(25); Type code_list_type is table of varchar2(25); FUNCTION SF_LOAD_CODE_TAB (TAB_NAME IN VARCHAR2, COL_NAME IN VARCHAR2) RETURN CODE_TAB_TYPE; End PK_BULK; / CREATE OR REPLACE Package BODY PK_BULK as FUNCTION SF_LOAD_CODE_TAB (TAB_NAME IN VARCHAR2, COL_NAME IN VARCHAR2) RETURN CODE_TAB_TYPE is query VARCHAR2(100); code_tab CODE_TAB_TYPE; code_list code_list_type; Begin query := 'SELECT ' || COL_NAME || ' FROM ' || TAB_NAME; EXECUTE IMMEDIATE query BULK COLLECT INTO code_list; FOR i IN code_list.FIRST .. code_list.LAST LOOP code_tab(code_list(i)) := code_list(i); END LOOP; RETURN code_tab; End; End PK_BULK; / -- test it declare i VARCHAR2(25); code_tab PK_BULK.CODE_TAB_TYPE; BEGIN CODE_TAB := pk_bulk.sf_load_code_tab ('emp', 'ename'); i := code_tab.first; while i is not null loop DBMS_OUTPUT.PUT_LINE (code_tab(i)); i := code_tab.next(i); end loop; END;
-
How to convert the column of ROW using DBMS_REDIFINITION object type column
Hi all
Suppose I have the following table to convert:
I created the table based on the customers of the OE schema table, while the street column has cust_address_typ with the following attribute object typecreate table customer as select customer_id cid, cust_first_name name, cust_address street from customers; alter table customer modify cid primary key;
I want to convert the object attribute adresse_rue in a column of RDM. Consider the following temporary table:SQL> describe cust_address_typ Name Null? Type ----------------------------------------------------- -------- ------------------------------------ STREET_ADDRESS VARCHAR2(40) POSTAL_CODE VARCHAR2(10) CITY VARCHAR2(30) STATE_PROVINCE VARCHAR2(10) COUNTRY_ID CHAR(2)
First of all, I checked if the table can be redefined:CREATE TABLE INT_CUSTOMER( CID NUMBER, NAME VARCHAR2(30), street varchar2(100) );
But when I started the redefinition, I got an error:--Verify if the table can be redefined BEGIN DBMS_REDEFINITION.CAN_REDEF_TABLE('OE','CUSTOMER',DBMS_REDEFINITION.CONS_USE_PK); END; 4 / PL/SQL procedure successfully completed.
What seemed to be the problem?BEGIN DBMS_REDEFINITION.START_REDEF_TABLE( uname => 'OE', orig_table => 'CUSTOMER', int_table => 'INT_CUSTOMER', col_mapping => 'CID CID, NAME NAME, STREET CUST_ADDRESS_TYP(STREET_ADDRESS)' ); END; 9 / BEGIN * ERROR at line 1: ORA-00923: FROM keyword not found where expected ORA-06512: at "SYS.DBMS_REDEFINITION", line 52 ORA-06512: at "SYS.DBMS_REDEFINITION", line 1646 ORA-06512: at line 2
Best regards
Val
Published by: Valerie good-natured October 9, 2011 21:43Have you tried this one:
BEGIN DBMS_REDEFINITION.START_REDEF_TABLE( uname => 'OE', orig_table => 'CUSTOMER', int_table => 'INT_CUSTOMER', col_mapping => 'CID CID, NAME NAME,"CUSTOMER".STREET.STREET_ADDRESS STREET' ); END;
Looking at your trace file, I claim that when you use the call above to START_REDEF_TABLE, the inner workings of this procedure will create this SQL statement:
select CID CID, NAME NAME,"CUSTOMER".STREET.STREET_ADDRESS STREET from "OE"."CUSTOMER" "CUSTOMER"
(You can prove or disprove my claim by tracing it ;-)))
And this statement has had an alias - even if the alias is the same as the name of the table...
-
Data Modeler: how to create and use the collection type
Hello
essentially of departure I don't understand how (for example) create and use the data based on the type of data varray type.
Please notify.
Thank you
AndrewHi André,.
You can create new types of collection (varray/table) in two ways:
(1) in the browser - find 'Types of data' > 'Types of Collection' node menu dropdown - there just 'create new collection type' it
(2) in the types of data model diagram - you can create collection "some type structured" or collection of references to the it - use 'new Collection... '. "tool and click first on sight structured type and after the structured type that will contain the collection - new attribute is added to the latter and if there is none this type of collection already didn't set the new collection type are created and you can change it later.Philippe
-
How to fill the value in the nested table by using the object type
Hi gurusI created an object type and able to fill the values in it, now I want to create a nested table type of this object and fill it but looks like I'm doing something wrong, see my code below.
Code example
CREATE or REPLACE TYPE countries_o
AS
OBJECT
(
COUNTRY_ID TANK (2 BYTES),
COUNTRY_NAME VARCHAR2 (40 BYTE),
REGION_ID NUMBER);
/create or replace type countries_t is table of the countries_o;
/CREATE OR REPLACE
ABC of the PROCEDURE
IS
v_print countries_t; -: = arr_countries_t('01','Aus',1);
BEGIN
v_print: = countries_t('01','A',11);
DBMS_OUTPUT. Put_line (v_print. COUNTRY_ID | v_print. COUNTRY_NAME | v_print. REGION_ID);
END;
/
Error
- Error (6.3): PL/SQL: statement ignored
- Error (6,12): PLS-00306: wrong number or types of arguments in the call to 'COUNTRIES_T '.
- Error (7.3): PL/SQL: statement ignored
- Error (7.32): PLS-00302: component 'COUNTRY_ID' must be declared
Thanks in advance
Concerning
Muzz
Hi user,
Here is another method that you can try-
CREATE OR REPLACE
ABC of the PROCEDURE
IS
v_print countries_t: = countries_t (countries_o('01','A',11));
BEGIN
DBMS_OUTPUT. Put_line (v_print (1).) COUNTRY_ID | v_print (1). COUNTRY_NAME | v_print (1). REGION_ID); -you're accessinf the first element of the nested table, which in turn points to the object.
END;
In the sections of the declaration you have assigned values to the nested table.
Kind regards
Maxou - Error (6.3): PL/SQL: statement ignored
-
return used with recursive with type object tree
There was just a post called employee return tree with the object type, and there were several responses.BANNER Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production PL/SQL Release 11.2.0.1.0 - Production CORE 11.2.0.1.0 Production TNS for 32-bit Windows: Version 11.2.0.1.0 - Production NLSRTL Version 11.2.0.1.0 - Production
I tried to wrap my brain around the recursive with and I was wondering how to implement it for this problem
Basically, the post was something like that.
and he wanted toCREATE TABLE employees AS SELECT 1 mgr_id, 2 emp_id FROM DUAL UNION SELECT 2, 3 FROM DUAL UNION SELECT 3, 4 FROM DUAL UNION SELECT 4, 5 FROM DUAL;
as mentioned, it has several solutions were however I was and wrote a recursive functionMGR_ID GET_EMPS(MGR_ID) 1 2,3,4,5 2 3,4,5 3 4,5 4 5
to get the answer. that seems to work
now, I would like to convert a recursive with my function, but I can't quite understand.CREATE OR REPLACE FUNCTION get_emps (p_mgr employees.mgr_id%TYPE) RETURN VARCHAR2 IS v_mgr employees.mgr_id%TYPE; v_emp employees.emp_id%type; v_emps VARCHAR2 (200); BEGIN v_mgr := p_mgr; LOOP SELECT emp_id INTO v_emp FROM employees WHERE mgr_id = v_mgr; v_emps := v_emps||','||v_emp; v_mgr := v_emp; END LOOP; exception when no_data_found then return substr(v_emps,2); END;
Here's what I have so far but I'm still not close.
Sorry for the comment here we have a weird filter on our internet that does not allow me to view the word a union |WITH emp1 (mgr_id, emp_id, emp_ids) AS ( SELECT mgr_id , to_char( emp_id), to_char(emp_id) from employees WHERE mgr_id = 1 UNION /* my internet filter will not alllow me to post this statement */ALL SELECT emp2.mgr_id, to_char(emp2.emp_id), to_char(emp1.emp_id)||','||to_char(emp2.emp_id) FROM employees emp2 JOIN emp1 ON (emp2.mgr_id = emp1.emp_id) ) select * from emp1
Hello
You're so close! You just need a character more:
WITH emp1 (mgr_id, emp_id, emp_ids) AS ( SELECT mgr_id , TO_CHAR (emp_id) , TO_CHAR (emp_id) FROM employees WHERE mgr_id = 1 UNION ALL SELECT emp2.mgr_id , TO_CHAR (emp2.emp_id) , TO_CHAR (emp1.emp_ids) || ',' || TO_CHAR (emp2.emp_id) -- ^ -- s added above FROM employees emp2 JOIN emp1 ON (emp2.mgr_id = emp1.emp_id) ) SELECT * FROM emp1 ;
Output:
MGR_ID EMP_ID EMP_IDS ---------- ---------- -------------------- 1 2 2 2 3 2,3 3 4 2,3,4 4 5 2,3,4,5
-
Filter for a specific value object type
I would like to know if the documents loaded on an object type can be interrogated for a specific value. For ex, I wanted to fetch all the records of the emp and load it into an object. I wanted to ask the object out of the loop to query for a specific deptno. I understand a query simpe SQL would be much faster in the scenario below, but the report itself used in our system uses several tables and some of them have millions of records from different sources as accounts suppliers, accounts receivable, accounting, etc. and they are treated differently for each source before that the result will be published the report. I took the table emp for example and wanted to know if the type of object can be queried for a specific column outside the loop.
DECLARE
CURSOR cur_emp IS SELECT * FROM EMP;
TYPE emp_obj IS TABLE OF cur_emp % ROWTYPE INDEX BY PLS_INTEGER;
l_emp_tab emp_obj;
BEGIN
OPEN cur_emp.
LOOP
Get the cur_emp COLLECT LOOSE l_emp_tab LIMIT 1000;
EXIT WHEN l_emp_tab.count = 0;
BECAUSE me IN 1.l_emp_tab.count
Loop
dbms_output.put_line (' Ename:' | l_emp_tab (i) .ename |', Deptno:' | .deptno l_emp_tab (i));
END LOOP;
END LOOP;
-Can I ask specific employee to a deptno outside the loop FOR without using a temporary table
-something like "SELECT * FROM TABLE (type_name) WHERE DEPTNO = x_Deptno.
END;
/
In a collection of table selection is not effective, there are better ways to do it.
Why not create a view?
create view...
Select * from source1 Union all the
Select * from source2 Union all the
Select * from source3
-or-
Using ref cursor return... clause, so you can make conditional cursors
If somecondition then
Open the NEWS for
Select * source1;
on the other
Open the NEWS for
Select * from source2.
end if;
-or-
Dynamics based SQL ref cursor
DECLARE
TYPE EmpCurTyp IS REF CURSOR;
v_emp_cursor EmpCurTyp;
employees emp_record % ROWTYPE;
v_stmt_str VARCHAR2 (200);
v_e_job employees.job%TYPE;
BEGIN
-Dynamic SQL statement with placeholder:
v_stmt_str: = ' SELECT * FROM employees WHERE job_id =: I;
-Open the cursor & specify bind argument in the USING clause:
V_emp_cursor OPEN FOR v_stmt_str with the HELP of 'MANAGER ';
-Extraction of the lines of result set one at a time:
LOOP
SEEK v_emp_cursor INTO emp_record;
EXIT WHEN v_emp_cursor % NOTFOUND;
END LOOP;
-Close the cursor:
CLOSE V_emp_cursor;
END;
/
-or-
Load in an intermediate table (as a temporary table)
-
Nested table of object type have only one record all the time
Hi all
I have a question regarding the storage of multiple records in a nested Table that is of type OBJECT.
The program below that I wrote for the test and during the test, I was able to store only the last record in the nested Table.
Please let me know what I did wrong here.
Step 1:
CREATE or REPLACE TYPE book_obj AS OBJECT (name varchar2 (25), author varchar2 (25), abstract varchar2 (4000));
/
Step 2:
CREATE or REPLACE TYPE book_table IS TABLE OF THE book_obj;
/
Step 3: CREATE TABLE book (name, varchar2 (25), varchar2 (25) author, varchar2 (4000)) abstract;
INSERT VALUES Accountants ('Harry Potter,' 'MK', 'It's magic');
INSERT the book VALUES ("Ramayana', 'VK', 'It is mythiology'");
COMMIT;
Step 4:
declare
bookset book_table;
ln_cnt pls_integer;
Start
bookset: = book_table (book_obj ('madhu', 'kongara', 'sudhan'));
dbms_output.put_line (' the number is ' | bookset.) (Count); -> I see COUNT = 1
bookset: = bookset_t(); -> Assignment to NULL.
dbms_output.put_line (' the number is ' | bookset.) (Count); -> I see County 0
for rec in (select * from book) loop-> now a loop twice.
dbms_output.put_line (' name > ' |) Rec.Name);
bookset: = bookset_t (book_t (rec.name, rec.author, rec.abstract));
end loop;
dbms_output.put_line (' the number is ' | bookset.) (Count); -> I can see COUNT = 1 (why?)
END;
I looped twice to fill two records in the TABLE IMBRIQUEE OF TYPE OBJECT. But when I see the Count I get only 1 and the data is also having the last record.
Can you get it someone please let me know how to fill out the table nested with all records. Tell me where I am wrong.
Very much appreciate your help here.
Thank you and best regards,
NKMMaldini says:
dbms_output.put_line (' the number is ' | bookset.) (Count); -->, I can see COUNT = 1 (why?)Because instead of add to bookset collectionto set (ergo replacement) it a collection containing recovered book. Use:
declare bookset book_table; ln_cnt pls_integer; begin bookset := book_table(book_obj('madhu','kongara','sudhan')); dbms_output.put_line('The count is '||bookset.count); --> I can see COUNT =1 bookset := book_table(); --> Assigning back to NULL. dbms_output.put_line('The count is '||bookset.count); --> I can see count as 0 for rec in (select * from book) loop --> Now Looping two times. dbms_output.put_line(' name > '||rec.name); bookset.extend; bookset(bookset.count) := book_obj(rec.name, rec.author, rec.abstract); end loop; dbms_output.put_line('The count is '||bookset.count); --> I can see COUNT =1 (why) end; / The count is 1 The count is 0 name > Harry Potter name > Ramayana The count is 2 PL/SQL procedure successfully completed. SQL>
Or better use bulk collect:
declare bookset book_table; ln_cnt pls_integer; begin bookset := book_table(book_obj('madhu','kongara','sudhan')); dbms_output.put_line('The count is '||bookset.count); --> I can see COUNT =1 bookset := book_table(); --> Assigning back to NULL. dbms_output.put_line('The count is '||bookset.count); --> I can see count as 0 select book_obj(name,author,abstract) bulk collect into bookset from book; for i in 1..bookset.count loop --> Now Looping two times. dbms_output.put_line(' name > '||bookset(i).name); end loop; dbms_output.put_line('The count is '||bookset.count); --> I can see COUNT =1 (why) end; / The count is 1 The count is 0 name > Harry Potter name > Ramayana The count is 2 PL/SQL procedure successfully completed. SQL>
SY.
-
Casting of object type to aid to more specific
Hello
I'm bit stuck in the legacies of the class in my current project. I implement a zero-coupling messaging architecture that uses variant tables to store objects to be cast to sample.
The good news: it works in general, little we take a peek at some photos
I tried the script of coulee before using an example that works as expected.
Shows probe resulting:
The Message of abstract [14] is cast to the more specific Message for the controller test [15], [9]
Now, this implementation with the variants table, change things unfrotunately:
The only thing that apparently changes is, as the class to be cast to a return value of a Subvi (actually reading the table variant) [12].
As shown in the probe that the casting does not work this time... There is also no error on the terminal error.
I have to admit, I'm quite confused... especially because in another class this exact methodiolgy works...
Any thoughts?
See you soon
Oli
Cast throws more specific to the type of object shown on the thread in the IDE, regardless of the type of the actual object passing along this thread (i.e. type of YARN and not DATA type).
I bet that your wire to the Center terminal of the 'to more specific' is a son of the same type as the object you are trying to change but actually a more specific object. The 'Cast to more specific"is a compiling decision, not a decision of execution. As such it takes the type of thread, not the object type for the casting.
Look at the names on the left of your probes, they are all the same in the example below (all wires are nominally of the same type). It's the onfo LV casting (assuming the names corresponding to the nominal type of the thread) not use content REAL of the wire.
Shane.
PS to make things clearer, give each hierarchy in your legacy a different aspect of wire.
-
Hi all
I want to know if using bulk collect into limit will help to avoid the TEMP tablespace error run out.
We use Oracle 11 g R1.
I am assigned to a task of creating journal facilitated for all tables in a query of the APEX.
I create procedures to execute some sql statements to create a DEC (Create table select), and then fires on these tables.
We have about three tables with more than 26 million records.
It seems very well running until we reached a table with more than 15 million record, we got an error says that Miss tablespace TEMP.
I googled on this topic and retrieve the tips:
Use NO LOG
Parallel use
BULK COLLECT INTO limited
However, the questions for those above usually short-term memory rather than running out of TEMPORARY tablespace.
I'm just a junior developer and does not have dealed with table more than 10 million documents at a time like this before.
The database support is outsourced. If we try to keep it as minimal contact with the DBA as possible. My Manager asked me to find a solution without asking the administrator to extend the TEMP tablespace.
I wrote a few BULK COLLECT INTO to insert about 300,000 like once on the development environment. It seems.
But the code works only against a 000 4000 table of records. I am trying to add more data into the Test table, but yet again, we lack the tablespace on DEV (this time, it's a step a TEMP data)
I'll give it a go against the table of 26 million records on the Production of this weekend. I just want to know if it is worth trying.
Thanks for reading this.
Ann
I really need check that you did not have the sizes of huge line (like several K by rank), they are not too bad at all, which is good!
A good rule of thumb to maximize the amount of limit clause, is to see how much memory you can afford to consume in the PGA (to avoid the number of calls to the extraction and forall section and therefore the context switches) and adjust the limit to be as close to that amount as possible.
Use the routines below to check at what threshold value would be better suited for your system because it depends on your memory allocation and CPU consumption. Flexibility, based on your limits of PGA, as lines of length vary, but this method will get a good order of magnitude.
CREATE OR REPLACE PROCEDURE show_pga_memory (context_in IN VARCHAR2 DEFAULT NULL)
IS
l_memory NUMBER;
BEGIN
SELECT st. VALUE
IN l_memory
SYS.v_$ session se, SYS.v_$ sesstat st, SYS.v_$ statname nm
WHERE se.audsid = USERENV ('SESSIONID')
AND st.statistic # nm.statistic = #.
AND themselves. SID = st. SID
AND nm.NAME = 'pga session in memory. "
Dbms_output.put_line (CASE
WHEN context_in IS NULL
THEN NULL
ELSE context_in | ' - '
END
|| 'Used in the session PGA memory ='
|| To_char (l_memory)
);
END show_pga_memory;
DECLARE
PROCEDURE fetch_all_rows (limit_in IN PLS_INTEGER)
IS
CURSOR source_cur
IS
SELECT *.
FROM YOUR_TABLE;
TYPE source_aat IS TABLE OF source_cur % ROWTYPE
INDEX BY PLS_INTEGER;
l_source source_aat;
l_start PLS_INTEGER;
l_end PLS_INTEGER;
BEGIN
DBMS_SESSION.free_unused_user_memory;
show_pga_memory (limit_in |) "- BEFORE"); "."
l_start: = DBMS_UTILITY.get_cpu_time;
OPEN source_cur.
LOOP
EXTRACTION source_cur
LOOSE COLLECTION l_source LIMITED limit_in;
WHEN l_source EXIT. COUNT = 0;
END LOOP;
CLOSE Source_cur;
l_end: = DBMS_UTILITY.get_cpu_time;
Dbms_output.put_line (' elapsed time CPU for limit of ')
|| limit_in
|| ' = '
|| To_char (l_end - l_start)
);
show_pga_memory (limit_in |) "- AFTER");
END fetch_all_rows;
BEGIN
fetch_all_rows (20000);
fetch_all_rows (40000);
fetch_all_rows (60000);
fetch_all_rows (80000);
fetch_all_rows (100000);
fetch_all_rows (150000);
fetch_all_rows (250000);
-etc.
END;
-
change a pl/sql block using "bulk collect.
Hello
I have a pl/sql block, short it slows...
DECLARE
CURSOR CURUPDATE1 IS
SELECT MF_TJ. UID_LO
OF MF_TJ
WHERE MF_TJ. DTYP (SELECT CD
OF MF_DOC_TYPE
WHERE MF_DOC_TYPE. DTYP_CAT = 'xx')
AND MF_TJ. LINE_TYP IS SET TO NULL;
BEGIN
FOR T IN CURUPDATE1
LOOP
UPDATE MF_TJ
THE MF_TJ VALUE. LINE_TYP = "NR."
WHERE MF_TJ. UID_LO = T.UID_LO;
UPDATE MF_AJ
THE MF_AJ VALUE. LINE_TYP = "NR."
WHERE MF_AJ. TJ_UID_LO = T.UID_LO;
END LOOP;
END;
/
now I change to use bulk collect, but I split it into two pl/sql blocks (each for an update)
DECLARE
CURSOR CURUPDATE1 IS
SELECT MF_TJ. UID_LO
OF MF_TJ
WHERE MF_TJ. DTYP (SELECT CD
OF MF_DOC_TYPE
WHERE MF_DOC_TYPE. DTYP_CAT = 'xx')
AND MF_TJ. LINE_TYP IS SET TO NULL;
TYPE of recs_type IS the TABLE OF CURUPDATE1% ROWTYPE directory INDEX;
REB recs_type;
BEGIN
CURUPDATE1 OPEN;
Go SEARCH the CURUPDATE1 COLLECT in BULK IN REB 8000 limit;
CLOSE CURUPDATE1;
FORALL i IN 1.recs. COUNTY
UPDATE MF_TJ
THE MF_TJ VALUE. LINE_TYP = "NR."
WHERE MF_TJ. UID_LO = (i) recs. UID_LO;-END;
/
DECLARE
CURSOR CURUPDATE1 IS
SELECT MF_TJ. UID_LO
OF MF_TJ
WHERE MF_TJ. DTYP (SELECT CD
OF MF_DOC_TYPE
WHERE MF_DOC_TYPE. DTYP_CAT = 'xx')
AND MF_TJ. LINE_TYP IS SET TO NULL;
TYPE of recs_type IS the TABLE OF CURUPDATE1% ROWTYPE directory INDEX;
REB recs_type;
BEGIN
CURUPDATE1 OPEN;
Go SEARCH the CURUPDATE1 COLLECT in BULK IN REB 8000 limit;
CLOSE CURUPDATE1;
FORALL i IN 1.recs. COUNTY
UPDATE MF_AJ
THE MF_AJ VALUE. LINE_TYP = "NR."
WHERE MF_AJ. TJ_UID_LO = (i) recs. UID_LO;-
END;
/Is there a way I can just use pl/sql block using bulk collect?
Thank you very much
Hi 5181139
As Paulzip and Jarkko Turpeinen have pointed out, you could do it using only SQL...
This is a course using COLLECT in BULK:
DECLARE blimit CONSTANT PLS_INTEGER := 500; CURSOR curupdate1 IS SELECT MF_TJ.UID_LO FROM MF_TJ WHERE MF_TJ.DTYP IN (SELECT CD FROM MF_DOC_TYPE WHERE MF_DOC_TYPE.DTYP_CAT = 'xx') AND MF_TJ.LINE_TYP IS NULL; TYPE c_arr IS TABLE OF curupdate1%ROWTYPE; c_rows c_arr; BEGIN OPEN curupdate1; LOOP FETCH curupdate1 BULK COLLECT INTO c_rows LIMIT blimit; FORALL i IN c_rows.FIRST..c_rows.LAST UPDATE MF_TJ SET MF_TJ.LINE_TYP = 'NR' WHERE MF_TJ.UID_LO = c_rows(i).uid_lo; FORALL i IN c_rows.FIRST..c_rows.LAST UPDATE MF_AJ SET MF_AJ.LINE_TYP = 'NR' WHERE MF_AJ.TJ_UID_LO = c_rows(i).uid_lo; EXIT WHEN c_rows.COUNT < blimit; END LOOP; CLOSE curupdate1; END;
See you soon,.
Gas
-
Define a map or ORDER method for the object type
Hi gurus
I created an object and then its type and then I use this object and type based on line, see below:
Create the object
CREATE OR REPLACE
TYPE test_object
IS
OBJECT
(
next_appearance_dt DATE, - next_appearance_dt
youth_adult VARCHAR2 (5) - youth_adult
) ;
/Create the object Type
CREATE or REPLACE TYPE t_docket_object IS TABLE OF THE test_object;
/
Create function Pipeline
FUNCTION to CREATE or REPLACE f_report (p_dt date, p_c_cd VARCHAR2)
return t_test_object pipeline
IS
BEGIN
FOR J IN)
Select distinct test_object)
next_appearance_dt,--862,
'YOUTH '.
) AS test_object
Jen.next_appearance base
WHERE 1 = 1
AND (base.next_appearance_dt = p_dt)
AND (base.circuit_point_cd = p_c_cd)
- and cse.information_id = 322
-ORDER 15 - alias_name
)loop
PIPE ROW (J.test_object);
END loop;
END;/
Run function
SELECT * FROM TABLE (F_REPORT (TO_DATE('25-sep-2015','dd-mon-yyyy'),'1 '))
Error
ORA-22950: cannot ORDER objects without map or ORDER method
ORA-06512: at "F_REPORT", line 5
22950 00000 - "cannot ORDER objects without map or ORDER method.
* Cause: an object type must have a defined for map or ORDER method
all comparisons other than equality and inequality comparisons.
* Action: Define a map or ORDER method for the object type
I know the reason of this error and the reason is that I use the clause separate in my pipeline service, but do not know how to get rid of this error...
Confuse you the type of table with the object type. He forge
Select test_object (next_appearance_dt) test_object
Not:
Select t_test_object (next_appearance_dt) test_object
Then:
SQL > CREATE OR REPLACE
FUNCTION f_report (DATE p_dt 2,
3 P_C_CD VARCHAR2
4 )
5 t_test_object of RETURN
6 IN PIPELINE
7 EAST
BEGIN 8
9 FOR (IN) v_rec
10 WITH () DID
11. SELECT TO_DATE('01-jan-2015','dd-mon-yyyy') NEXT_APPEARANCE_DT
the double 12
13 )
14 select test_object (next_appearance_dt) test_object
15 from t
16 ) LOOP
PIPE 17 ROW (v_rec.test_object);
18 END OF LOOP;
END 19;
20.The function is created.
SY.
-
Bulk collect / forall type what collection?
Hi I am trying to speed up the query below using bulk collect / forall:
SELECT h.cust_order_no AS custord, l.shipment_set AS Tess
Info.tlp_out_messaging_hdr h, info.tlp_out_messaging_lin l
WHERE h.message_id = l.message_id
AND h.contract = '12384'
AND l.shipment_set IS NOT NULL
AND h.cust_order_no IS NOT NULL
H.cust_order_no GROUP, l.shipment_setI would like to get the 2 selected fields above in a new table as quickly as possible, but I'm pretty new to Oracle and I find it hard to sort out the best way to do it. The query below is not working (no doubt there are many issues), but I hope that's sufficiently developed, shows the sort of thing, I am trying to achieve:
DECLARE
TYPE xcustord IS TABLE OF THE info.tlp_out_messaging_hdr.cust_order_no%TYPE;
TYPE xsset IS TABLE OF THE info.tlp_out_messaging_lin.shipment_set%TYPE;
TYPE xarray IS the TABLE OF tp_a1_tab % rowtype INDEX DIRECTORY.
v_xarray xarray;
v_xcustord xcustord;
v_xsset xsset;
CUR CURSOR IS
SELECT h.cust_order_no AS custord, l.shipment_set AS Tess
Info.tlp_out_messaging_hdr h, info.tlp_out_messaging_lin l
WHERE h.message_id = l.message_id
AND h.contract = '1111'
AND l.shipment_set IS NOT NULL
AND h.cust_order_no IS NOT NULL;
BEGIN
Heart OPEN;
LOOP
News FETCH
LOOSE COLLECTION v_xarray LIMIT 10000;
WHEN v_xcustord EXIT. COUNT() = 0;
FORALL I IN 1... v_xarray. COUNTY
INSERT INTO TP_A1_TAB (cust_order_no, shipment_set)
VALUES (v_xarray (i) .cust_order_no, v_xarray (i) .shipment_set);
commit;
END LOOP;
CLOSE cur;
END;I'm running on Oracle 9i release 2.
Short-term solution may be to a world point of view. Pay once per hour for the slow and complex query execution. Materialize the results in a table (with clues in support of queries on the materialized view).
Good solution - analysis logic and SQL, determine what he does, how he does it and then figure out how this can be improved.
Ripping separate cursors in SQL and PL/SQL code injection to stick together, are a great way to make performance even worse.
Maybe you are looking for
-
Audit summary, please help :)
If my faithful iMac 2010 I use rarely except for a few photos and the music starts to get really slow. Everything freezes and the ball runs all the time. Here is the balance of being elements of report and Yes in red. Advice or thoughts on if it's fi
-
Satellite P500-12F - Bluescreens and how to disable the beeps?
Get the "blue screen" too often, the message suggests that this might be the cause: * Files helping to describe the problem: *.C:\Windows\Minidump\031311-31278-01.dmpC:\Users\mike\AppData\Local\Temp\WER-87578-0.SysData.XML Does that mean something to
-
fixed point like solution value deal selector?
Hey all so I am very new to LabVIEW and I'm doing a simple program. Right now I have a digital control that control my analog voltage on my board sbRIO 9636 (from the assessment package). According to the tension, I want to display a message on the L
-
HP Pavilion p7-1012: factory reset
I try to do a factory reset on my HP pavilion p7-1012 I bought by Aaron, when I go to the system recovery I get the message "your computer does not have a recovery partition. So I tried to burn the recovery disk and it says "not found recovery Partit
-
ActiveX Control of Notepad ++
Dear community OR,. I have a small question. I would like to play a bit with Notepad ++ ActiveX, and I wonder if it is possible to use it as within the VI ActiveX control. I have installed and registered Notepad ++ ActiveX plugin, but I can't find an