Refer Multiset Union value from cursor
Hi everyone,
I am new to the concept of pseudo functiona and was just trying to use the multiset union function. I have written a cursor which gives me a column 'buyer' and a corresponding dataset. Now my dilemna is how to refer the elements in the dataset using the cursor. Could anyone please help?
CREATE TABLE BUYER
BUYER NUMBER(4) NOT NULL,
BUYER_NAME VARCHAR2(120 BYTE) NOT NULL,
BUYER_PHONE VARCHAR2(20 BYTE),
BUYER_FAX VARCHAR2(20 BYTE)
SET DEFINE OFF;
Insert into RMS.BUYER
(BUYER, BUYER_NAME, BUYER_PHONE, BUYER_FAX)
Values
(110, 'Kendr', '5147, 876', NULL);
Insert into RMS.BUYER
(BUYER, BUYER_NAME, BUYER_PHONE, BUYER_FAX)
Values
(101, 'Amelie Dube', '(514),808', NULL);
Insert into RMS.BUYER
(BUYER, BUYER_NAME, BUYER_PHONE, BUYER_FAX)
Values
(102, 'Jennifer Baie', '51962,860', NULL);
Insert into RMS.BUYER
(BUYER, BUYER_NAME, BUYER_PHONE, BUYER_FAX)
Values
(103, 'Loriannstris', '5333962,785', NULL);
Insert into RMS.BUYER
(BUYER, BUYER_NAME, BUYER_PHONE, BUYER_FAX)
Values
(104, 'Sandra St-re', '513962,736', NULL);
COMMIT;
create or replace type tab1 is table of varchar2 (30);
DECLARE
cursor c1 is
select buyer,
CAST (multiset(select buyer_name from buyer where rownum<4) as tab1) as data1
from buyer
MULTISET UNION ALL
select buyer,
CAST(multiset(select buyer_name from buyer where rownum<5) as tab1) as data2
from buyer;
BEGIN
for c_rec in c1
loop
DBMS_OUTPUT.PUT_LINE(c_rec.buyer||'~'||c_rec.column_value(1)); -- i want to print all the values in the 'data set' along with the buyer id.
end loop;
end;
error:
PLS-00302: component 'COLUMN_VALUE' must be declared
Thanks a lot for your help. Now the one i posted was just to simplify the actual problem. But let me try and give you the complete picture.
I have a nested table structure:
Table structure:
->ExtOfXOrderSkuDesc_TBL -> ExtOfOrderExpDesc_TBL
I_message -> ExtOfXOrderDesc_TBL
->ExtOfXOrderPackDesc_TBL -> ExtOfOrderExpDesc_TBLCould not post the whole table detail as its too big
CURSOR c_insert_item IS
SELECT im.item,
item_diff.import_country_id,
item_diff.hts_no,
item_diff.ExtOfOrderExpDesc_TBL --needs to be casted
FROM TABLE(CAST(I_message.ExtOfXOrderDesc_TBL(1).ExtOfXOrderSkuDesc_TBL AS "RIB_ExtOfXOrderSkuDesc_TBL")) item_diff,
item_master im
WHERE item_diff.style_no = im.item_parent
UNION ALL
SELECT im.item,
pack_diff.import_country_id,
pack_diff.hts_no,
pack_diff.ExtOfOrderExpDesc_TBL --needs to be casted
FROM TABLE(CAST(I_message.ExtOfXOrderDesc_TBL(1).ExtOfXOrderPackDesc_TBL AS "RIB_ExtOfXOrderPackDesc_TBL")) pack_diff,
item_master im
WHERE pack_diff.style_no = im.item_parent;Now i need to make an union of all the elements including the ExtOfOrderExpDesc_TBL . So i wanted the cast it as multiset. But pardon my ignorance i feel i am lost somewhere. Based on you reply could you suggest how can i make the union and access each element using the cursor record?
Thanks
Similar Messages
-
Passing variable which has multiple values to cursor as parameter
declare
i varchar2(4000):='0';
j varchar2(100):='0';
cursor c1
is
(select * from gl_je_lines
where period_name='Mar-10'
and reference_10='WRITEOFF');
cursor c2 (l_ref varchar2)
is
(select * from gl_je_lines
where period_name='Mar-10'
and reference_10='WRITEOFF'
and reference_2 not in (l_ref));
begin
for cur_record in c1
loop
j:=cur_record.reference_2;
end loop;
i:= i||','''||j||'''';
dbms_output.put_line(i);--here i has 254 values separated by ','
for cash_rec in c2(i)
loop
dbms_output.put_line('this is loop 2');
dbms_output.put_line(cash_rec.reference_2||','||cash_rec.reference_1);--Here this output is not displayed
--i think the code in this cursor c2 is not executing
--please tell me the solution
end loop;
end;
I already use pl-sql table with array..it is not sufficietn to my requirement.because when i use it we must increment the index of that table ..so every time not in operator works in cursor2.so it shows wrong result
From last three days i am working on this only please let me know as early as possible friends
Edited by: 805567 on Oct 28, 2010 11:30 PM
Edited by: 805567 on Oct 29, 2010 1:05 AMyou said two cases
in first case
place my second cursor in first cursor
if i place like that here i use not in operator
so it prints for every value it will print not in of that value
so it was wrong result
i want not in all values
in second case
i took values from cursor not from table
like as shown below
declare
credit_amount number:=0;
debit_amount number:=0;
v1 number:=0;
v2 number:=0;
v3 varchar2(500);
v4 varchar2(500);
v5 varchar2(240);
v6 varchar2(240);
v7 number;
v8 varchar2(240);
v9 varchar2(240);
v10 number;
v11 number;
v12 varchar2(240);
v13 varchar2(240);
v14 varchar2(240);
v15 number;
v16 number;
--This cursor is for liability records which are in GL not in AP
cursor c1(p_header_id number,p_reference_2 varchar2,p_reference_4 varchar2)
is
(select
jl.je_header_id "JE_HEADER_ID"
,jl.period_name "PERIOD"
,glcc.concatenated_segments "ACCOUNT_CODE"
,DECODE(jl.accounted_dr,null,0,jl.accounted_dr)"ACCOUNTED_DEBIT"
,DECODE(jl.accounted_cr,null,0,jl.accounted_cr) "ACCOUNTED_CREDIT"
,DECODE(jl.accounted_dr,null,0,jl.accounted_dr) - DECODE(jl.accounted_cr,null,0,jl.accounted_cr) "NET"
,glcc.CODE_COMBINATION_ID "CODE_COMBINATION_ID"
,jl.SET_OF_BOOKS_ID "SET_OF_BOOKS_ID"
,jl.PERIOD_NAME "PERIOD_NAME"
,DECODE(Jl.entered_dr,null,0,Jl.entered_dr)"ENTERED_DEBIT"
,DECODE(Jl.entered_cr,null,0,Jl.entered_cr) "ENTERED_CREDIT"
,jl.reference_1 "SUPPLIER"
,jl.reference_2 "INVOICE_ID"
,jl.reference_3 "CHECK_ID"
,jl.reference_4 "CHECK_NUMBER"
,jl.reference_5 "INVOICE_NUM"
,jl.reference_6 "'AP_PAYMT_JUST_INSERTED'"
,jl.reference_7 "set_of_books_id"
,jl.GL_SL_LINK_ID "GL_SL_LINK_ID"
,jl.REFERENCE_8 "INVOICE_DIST_LINE_NUMBER"
,jl.reference_9 "INVOICE_PAYMENT_ID"
,jl.REFERENCE_10 "LIABILITY"
,jl.TAX_CODE_ID "TAX_CODE_ID"
,jl.TAX_GROUP_ID "TAX_GROUP_ID"
FROM
gl_je_lines jl
, apps.gl_code_combinations_KFV glcc
, gl_je_headers jh
WHERE
jl.period_name='Mar-10'
and glcc. code_combination_id in (1016,1296,1298)
and jh.je_header_id = jl.je_header_id
AND glcc.code_combination_id = jl.code_combination_id
and jh.je_source = 'Payables'
AND jl.je_header_id = p_header_id
and jl.reference_2 = p_reference_2
and jl.reference_4 = p_reference_4
MINUS
select
ir.je_header_id
, h.period_name "APPERIOD"
,g.CONCATENATED_SEGMENTS "AP ACCOUNT CODE"
,DECODE(l.accounted_dr,null,0,l.accounted_dr) "AP ACCOUNTED_DR"
,DECODE(l.accounted_cr,null,0,l.accounted_cr) "AP ACCOUNTED_CR"
,DECODE(l.accounted_dr,null,0,l.accounted_dr) - DECODE(l.accounted_cr,null,0,l.accounted_cr) "NET"
,l.CODE_COMBINATION_ID "AP_CCID"
,h.set_of_books_id
,h.PERIOD_NAME "PERIOD_NAME"
,DECODE(l.entered_dr,null,0,l.entered_dr)"ENTERED_DEBIT"
,DECODE(l.entered_cr,null,0,l.entered_cr) "ENTERED_CREDIT"
,l.reference1 "SUPPLIER"
,l.reference2 "INVOICE_Id"
,l.reference3 "reference_3"
,l.reference4 "reference_4"
,l.reference5 "INVOICE_NUM"
,l.reference6 "reference_6"
,l.reference7 "reference_7"
,l.GL_SL_LINK_ID "GL_SL_LINK_ID"
,l.REFERENCE8 "REFERENCE_8"
,l.reference9 "reference_9"
,l.REFERENCE10 "REFERENCE_10"
,l.TAX_CODE_ID "TAX_CODE_ID"
,l.TAX_LINK_ID "TAX_LINK_ID"
from
ap_ae_lines_all l,
ap_ae_headers_all h,
gl_code_combinations_kfv g
,gl_import_references ir
where
ir.gl_sl_link_id=l.gl_sl_link_id
AND g.CODE_COMBINATION_ID = l.CODE_COMBINATION_ID
and h.ae_header_id = l.ae_header_id
AND h.period_name ='Mar-10'
AND g.CODE_COMBINATION_ID in (1016,1296,1298)
AND ir.JE_HEADER_ID = p_header_id
and l.reference2 = p_reference_2
and l.reference4 = p_reference_4);
--This cursor is for writeoff records
cursor c2
is
(select * from gl_je_lines
where period_name='Mar-10'
and reference_10='WRITEOFF'
and reference_2 in ('525706','525600'));
credit number:=0;
debit number:=0;
j varchar2(240);
i varchar2(4000):='0';
cursor c3 (p_invoice_id varchar2)
is
(select
jl.je_header_id "JE_HEADER_ID"
,jl.period_name "PERIOD"
,glcc.concatenated_segments "ACCOUNT_CODE"
,DECODE(jl.accounted_dr,null,0,jl.accounted_dr)"ACCOUNTED_DEBIT"
,DECODE(jl.accounted_cr,null,0,jl.accounted_cr) "ACCOUNTED_CREDIT"
,DECODE(jl.accounted_dr,null,0,jl.accounted_dr) - DECODE(jl.accounted_cr,null,0,jl.accounted_cr) "NET"
,glcc.CODE_COMBINATION_ID "CODE_COMBINATION_ID"
,jl.SET_OF_BOOKS_ID "SET_OF_BOOKS_ID"
,jl.PERIOD_NAME "PERIOD_NAME"
,DECODE(Jl.entered_dr,null,0,Jl.entered_dr)"ENTERED_DEBIT"
,DECODE(Jl.entered_cr,null,0,Jl.entered_cr) "ENTERED_CREDIT"
,jl.reference_1 "SUPPLIER"
,jl.reference_2 "INVOICE_ID"
,jl.reference_3 "CHECK_ID"
,jl.reference_4 "CHECK_NUMBER"
,jl.reference_5 "INVOICE_NUM"
,jl.reference_6 "'AP_PAYMT_JUST_INSERTED'"
,jl.reference_7 "set_of_books_id"
,jl.GL_SL_LINK_ID "GL_SL_LINK_ID"
,jl.REFERENCE_8 "INVOICE_DIST_LINE_NUMBER"
,jl.reference_9 "INVOICE_PAYMENT_ID"
,jl.REFERENCE_10 "LIABILITY"
,jl.TAX_CODE_ID "TAX_CODE_ID"
,jl.TAX_GROUP_ID "TAX_GROUP_ID"
FROM
gl_je_lines jl
, apps.gl_code_combinations_KFV glcc
, gl_je_headers jh
WHERE
jl.period_name='Mar-10'
and glcc. code_combination_id in (1016,1296,1298)
and jh.je_header_id = jl.je_header_id
AND glcc.code_combination_id = jl.code_combination_id
and jh.je_source = 'Payables'
and jl.reference_2 in (p_invoice_id)
MINUS
select
ir.je_header_id
, h.period_name "AP PERIOD"
,g.CONCATENATED_SEGMENTS "AP ACCOUNT CODE"
,DECODE(l.accounted_dr,null,0,l.accounted_dr) "AP ACCOUNTED_DR"
,DECODE(l.accounted_cr,null,0,l.accounted_cr) "AP ACCOUNTED_CR"
,DECODE(l.accounted_dr,null,0,l.accounted_dr) - DECODE(l.accounted_cr,null,0,l.accounted_cr) "NET"
,l.CODE_COMBINATION_ID "AP_CCID"
,h.set_of_books_id
,h.PERIOD_NAME "PERIOD_NAME"
,DECODE(l.entered_dr,null,0,l.entered_dr)"ENTERED_DEBIT"
,DECODE(l.entered_cr,null,0,l.entered_cr) "ENTERED_CREDIT"
,l.reference1 "SUPPLIER"
,l.reference2 "INVOICE_Id"
,l.reference3 "reference_3"
,l.reference4 "reference_4"
,l.reference5 "INVOICE_NUM"
,l.reference6 "reference_6"
,l.reference7 "reference_7"
,l.GL_SL_LINK_ID "GL_SL_LINK_ID"
,l.REFERENCE8 "REFERENCE_8"
,l.reference9 "reference_9"
,l.REFERENCE10 "REFERENCE_10"
,l.TAX_CODE_ID "TAX_CODE_ID"
,l.TAX_LINK_ID "TAX_LINK_ID"
from
ap_ae_lines_all l,
ap_ae_headers_all h,
gl_code_combinations_kfv g
,gl_import_references ir
where
ir.gl_sl_link_id=l.gl_sl_link_id
AND g.CODE_COMBINATION_ID = l.CODE_COMBINATION_ID
and h.ae_header_id = l.ae_header_id
AND h.period_name ='Mar-10'
AND g.CODE_COMBINATION_ID in (1016,1296,1298)
and l.reference2 in (p_invoice_id)); --here if i put l.reference2 in (p_invoice_id)) it must show the details of
-- of all.but it doesnot display sir
--here if i put l.reference2 not in (p_invoice_id)) it shows that id also sir
BEGIN
for writeoff_rec in c2
LOOP
FOR Main_cur in c1(writeoff_rec.je_header_id,writeoff_rec.reference_2,writeoff_rec.reference_4)
LOOP
j:='0';
IF writeoff_rec.accounted_dr is not null AND Main_cur.ACCOUNTED_CREDIT<>0
THEN
v10:=Main_cur.ACCOUNTED_CREDIT;
credit_amount:= credit_amount+Main_cur.ACCOUNTED_CREDIT;
ELSIF writeoff_rec.accounted_cr is not null AND Main_cur.ACCOUNTED_DEBIT<>0
THEN
v11:=Main_cur.ACCOUNTED_DEBIT;
debit_amount:= debit_amount+Main_cur.ACCOUNTED_DEBIT;
END IF;
if c1%found then
j:=Main_cur.INVOICE_ID;
end if;
END LOOP;
-- i:=i||','||j;
i:= i||','''||j||'''';
END LOOP;
dbms_output.put_line(i); --Here i got all invoiceids of varchar2 records without single qutations
--its look like '0','23232','2324234' etc.
for cash_clearing_cur in c3(i)--here is the problem i am sending i with 250 values separated by ',' is it correct
loop
v3:=0;
v4:=0;
v5:=0;
v6:=0;
v7:=0;
v8:=0;
v9:=0;
v10:=0;
v11:=0;
v12:=0;
v13:=0;
v14:=0;
v15:=0;
v16:=0;
credit:=credit+cash_clearing_cur.ACCOUNTED_CREDIT;
debit:=debit+cash_clearing_cur.ACCOUNTED_DEBIT;
v3:=cash_clearing_cur.JE_HEADER_ID;
v4:=cash_clearing_cur.INVOICE_ID;
v5:=cash_clearing_cur.CHECK_NUMBER;
v6:=cash_clearing_cur.LIABILITY;
v7:=cash_clearing_cur.CODE_COMBINATION_ID;
v8:=cash_clearing_cur.PERIOD;
v9:=cash_clearing_cur.ACCOUNT_CODE;
v10:=cash_clearing_cur.ACCOUNTED_CREDIT;
v11:=cash_clearing_cur.ACCOUNTED_DEBIT;
v12:=cash_clearing_cur.SUPPLIER;
v13:=cash_clearing_cur.CHECK_ID;
v14:=cash_clearing_cur.INVOICE_NUM;
v15:=cash_clearing_cur.GL_SL_LINK_ID;
v16:=cash_clearing_cur.SET_OF_BOOKS_ID;
DBMS_OUTPUT.PUT_LINE('HEAd '||v3||','||'inv_id '||v4||','||
'chk_num '||v5||','||'ref10 '||v6||','||'CCID '||V7||','||'PED '||V8
||','||'acctcode '||v9||','||'acct_Ct '||V10
||','||'acct_Dt '||v11||','||'chk_id '||v13||','||'inv_num '||V14
||','||'link '||v15||','||'sob '||v16||','||'suplir '||V12);
end loop;
DBMS_OUTPUT.PUT_LINE( 'Dr Amt ' ||debit || 'Cr amt ' || credit );
EXCEPTION
when too_many_rows then
dbms_output.put_line('Invalid no of rows');
when no_data_found then
dbms_output.put_line('no data found exception');
when others then
dbms_output.put_line('Other than Invalid no of rows');
dbms_output.put_line(SQLERRM);
END;
/ -
Copying value from one cursor to another
Hi,
I have a problem while copying values from one cursor to another cursor.
The code looks like below.
PROCEDURE XYZ
TransactionResultSet OUT NOCOPY types.ref_cursor,
IS
temp_cursor types.ref_cursor;
wip_rec types.ref_cursor;
BEGIN
DECLARE
CURSOR temp_cursor IS
SELECT ...........
END;
BEGIN
FOR wip_rec IN temp_cursor
LOOP
update tinsagr set something
where {the condition}
IF SQL%ROWCOUNT = 0 THEN
dbms_output.put_line('this is test ');
Fetch wip_rec into TransactionResultSet;
END IF;
END LOOP;so basically i want to iterate the "temp_cursor" and depending on the values i get it from here i shall update a table. Actually i want to exclude few records from "temp_cursor" and add it/copy rest of the records to "TransactionResultSet"
That means say initially " temp_cursor" has 100 records and i updated 5 records in a table and same number of records should be excluded and rest should be added to the output cursor TransactionResultSet.
How do i achieve it?
while saving i am getting
(1): PLS-00456: item 'WIP_REC' is not a cursor.
Do any one has any idea what to do in such scenario?There are options like....
SQL> CREATE OR REPLACE TYPE emp_obj AS OBJECT (ename VARCHAR2(50), dept NUMBER);
2 /
Type created.
SQL> CREATE OR REPLACE TYPE emp_tbl IS TABLE OF emp_obj;
2 /
Type created.
SQL> set serverou on
SP2-0158: unknown SET option "serverou"
SQL> set serverout on
SQL> DECLARE
2 rc sys_refcursor;
3 v_ename emp.ename%TYPE;
4 v_dept emp.deptno%TYPE;
5 ---End Of Local Varriable Declaration
6 --Procedire declaration !
7 PROCEDURE TEST_CUR(pi_out_ref_cur IN OUT sys_refcursor) IS
8 emp_rec emp_tbl;
9 BEGIN
10 /* This BULK COLLECT can be done with explicit cursor,Ref Cursor
11 with some simple modification, Here I have used implicit cursor! */
12 SELECT emp_obj(ename, deptno) --Casting as the object
13 BULK COLLECT
14 INTO emp_rec
15 FROM emp
16 WHERE deptno = 10;
17
18 dbms_output.put_line('Records selected are:');
19 FOR i in 1 .. emp_rec.COUNT LOOP
20 dbms_output.put_line(emp_rec(i).ename || '--' || emp_rec(i).dept);
21 END LOOP;
22 --Now we are filtering the record and may be doing some operation with each record.
23 FOR i in 1 .. emp_rec.COUNT LOOP
24 IF emp_rec(i).ename = 'KING' THEN
25 --You can change this IF according to your need.
26 emp_rec.DELETE(i);
27 END IF;
28 END LOOP;
29 OPEN pi_out_ref_cur FOR
30 SELECT * FROM TABLE(emp_rec); --Using the TYPE AS table.
31 END TEST_CUR;
32 /* Main execution or procedure calling section*/
33 BEGIN
34 --Actual calling
35 TEST_CUR(rc);
36 dbms_output.new_line;
37 dbms_output.put_line('Now in Ref Cursor');
38 dbms_output.put_line('****************');
39 LOOP
40 FETCH rc
41 INTO v_ename, v_dept;
42 dbms_output.put_line(v_ename || '--' || v_dept);
43 EXIT WHEN rc%NOTFOUND;
44 END LOOP;
45
46 END;
47 /
Records selected are:
CLARK--10
KING--10
MILLER--10
Now in Ref Cursor
CLARK--10
MILLER--10
MILLER--10
PL/SQL procedure successfully completed.
SQL> -
How to pick max value from a column of a table using cursor and iteration
Hello Everybody
I have a table loan_detail
and a column in it loan_amount
now i want to pick values from this table using cursor and then by using iteration i want to pick max value from it using that cursor
here is my table
LOAN_AMOUNT
100
200
300
400
500
5600
700i was able to do it using simple loop concepts but when i was trying to do this by using cursor i was not able to do it .
Regards
PeeyushSQL> SELECT MAX(sal) Highest_Sal,MIN(sal) Lowest_Sal FROM emp;
HIGHEST_SAL LOWEST_SAL
5000 800
SQL> set serverout on
SQL> DECLARE
2 TYPE tmp_tbl IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
3 sal_tbl tmp_tbl;
4 CURSOR emp_sal IS
5 SELECT sal FROM emp;
6 counter INTEGER := 1;
7 BEGIN
8 FOR i IN emp_sal LOOP
9 sal_tbl(i.sal) := counter;
10 counter := counter + 1;
11 END LOOP;
12 DBMS_OUTPUT.put_line('Lowest SAL:' || sal_tbl.FIRST);
13 DBMS_OUTPUT.put_line('Highest SAL:' || sal_tbl.LAST);
14 END;
15 /
Lowest SAL:800
Highest SAL:5000
PL/SQL procedure successfully completed.
SQL> Even smaller
SQL> DECLARE
2 TYPE tmp_tbl IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
3 sal_tbl tmp_tbl;
4 CURSOR emp_sal IS
5 SELECT sal FROM emp;
6 counter INTEGER := 1;
7 BEGIN
8 FOR i IN emp_sal LOOP
9 sal_tbl(i.sal) := 1;
10 END LOOP;
11 DBMS_OUTPUT.put_line('Lowest SAL:' || sal_tbl.FIRST);
12 DBMS_OUTPUT.put_line('Highest SAL:' || sal_tbl.LAST);
13 END;
14 /
Lowest SAL:800
Highest SAL:5000
PL/SQL procedure successfully completed.
SQL> Edited by: Saubhik on Jan 5, 2011 4:41 PM -
Inserting values from a cursor to a table
Hi,
I need to insert the values from a cursor into a table,this i the part of code which trieds to do it...i get error stating "select stmt missing"...pls help out...
OPEN p_cursor for V_SQLSTATEMENT;
---for i in p_cursor
LOOP
FETCH p_cursor INTO v_cursor_type;
insert into TEMPCHARTVALUES(HOP,AMOUNT,EFFECTIVE_FROM,EFFECTIVE_TO,CURRENCY)
values (v_cursor_type.PMC1_HOP_CODE,
v_cursor_type.PMC1_Amount,
v_cursor_type.PMC1_EFFECTIVE_FROM,
v_cursor_type.PMC1_EFFECTIVE_UPTO,
v_cursor_type.PMC1_CURRENCY);
--dbms_output.put_line(v_cursor_type.KEYCODE1);
EXIT WHEN p_cursor%ROWCOUNT = v_REC_COUNT;
end loop;Hi, here it is..
create or replace
procedure prm_sp_charts_db (P_CURSOR OUT SYS_REFCURSOR,CHARTCode VARCHAR,tablename varchar)
IS
v_COUNT varchar2(200);
v_REC_COUNT NUMBER;
V_SQLSTATEMENT VARCHAR2(2000);
v_cursor_type TEMPCHARTVALUES%ROWTYPE;
begin
v_COUNT:='SELECT COUNT(*) FROM PRM_M_Chart_' || CHARTCode;
execute immediate v_COUNT into v_REC_COUNT;
V_SQLSTATEMENT := 'SELECT ';
V_SQLSTATEMENT := V_SQLSTATEMENT || 'PMC' || CHARTCode || '_F1_CODE Keycode1,';
open P_CURSOR for select column_name from user_tab_columns where table_name=tablename and column_name='PMC' || CHARTCode || '_F2_CODE';
IF P_CURSOR%FOUND then
V_SQLSTATEMENT := V_SQLSTATEMENT || 'PMC' || CHARTCode || '_F2_CODE Keycode2,';
else
V_SQLSTATEMENT := V_SQLSTATEMENT || '0,';
END IF;
open P_CURSOR for select column_name from user_tab_columns where table_name=tablename and column_name='PMC' || CHARTCode || '_F3_CODE';
IF P_CURSOR%FOUND then
V_SQLSTATEMENT := V_SQLSTATEMENT || 'PMC' || CHARTCode || '_F3_CODE Keycode3,';
else
V_SQLSTATEMENT := V_SQLSTATEMENT || '0,';
END IF;
open P_CURSOR for select column_name from user_tab_columns where table_name=tablename and column_name='PMC' || CHARTCode || '_F4_CODE';
IF P_CURSOR%FOUND then
V_SQLSTATEMENT := V_SQLSTATEMENT || 'PMC' || CHARTCode || '_F4_CODE Keycode4,';
else
V_SQLSTATEMENT := V_SQLSTATEMENT || '0,';
END IF;
open P_CURSOR for select column_name from user_tab_columns where table_name=tablename and column_name='PMC' || CHARTCode || '_F5_CODE';
IF P_CURSOR%FOUND then
V_SQLSTATEMENT := V_SQLSTATEMENT || 'PMC' || CHARTCode || '_F5_CODE Keycode5,';
else
V_SQLSTATEMENT := V_SQLSTATEMENT || '0,';
END IF;
--open P_CURSOR for select column_name from user_tab_columns where table_name=tablename and column_name='PMC' || CHARTCode || '_F6_CODE';
IF P_CURSOR%FOUND then
V_SQLSTATEMENT := V_SQLSTATEMENT || 'PMC' || CHARTCode || '_F6_CODE Keycode6,';
else
V_SQLSTATEMENT := V_SQLSTATEMENT || '0,';
END IF;
--open P_CURSOR for select column_name from user_tab_columns where table_name=tablename and column_name='PMC' || CHARTCode || '_F7_CODE';
IF P_CURSOR%FOUND then
V_SQLSTATEMENT := V_SQLSTATEMENT || 'PMC' || CHARTCode || '_F7_CODE Keycode7,';
else
V_SQLSTATEMENT := V_SQLSTATEMENT || '0,';
END IF;
--open P_CURSOR for select column_name from user_tab_columns where table_name=tablename and column_name='PMC' || CHARTCode || '_F8_CODE';
IF P_CURSOR%FOUND then
V_SQLSTATEMENT := V_SQLSTATEMENT || 'PMC' || CHARTCode || '_F8_CODE Keycode8,';
else
V_SQLSTATEMENT := V_SQLSTATEMENT || '0,';
END IF;
--open P_CURSOR for select column_name from user_tab_columns where table_name=tablename and column_name='PMC' || CHARTCode || '_F9_CODE';
IF P_CURSOR%FOUND then
V_SQLSTATEMENT := V_SQLSTATEMENT || 'PMC' || CHARTCode || '_F9_CODE Keycode9,';
else
V_SQLSTATEMENT := V_SQLSTATEMENT || '0,';
END IF;
--open P_CURSOR for select column_name from user_tab_columns where table_name=tablename and column_name='PMC' || CHARTCode || '_F10_CODE';
IF P_CURSOR%FOUND then
V_SQLSTATEMENT := V_SQLSTATEMENT || 'PMC' || CHARTCode || '_F10_CODE Keycode10,';
else
V_SQLSTATEMENT := V_SQLSTATEMENT || '0,';
END IF;
V_SQLSTATEMENT := V_SQLSTATEMENT ||'PMC' || CHARTCode || '_HOP_CODE HOPCode,PMC' || CHARTCode || '_AMOUNT ,PMC'|| CHARTCode || '_EFFECTIVE_FROM Effective_From,PMC' || CHARTCode || '_EFFECTIVE_UPTO Effective_Upto,PMC' || CHARTCode || '_CURRENCY Currency FROM PRM_M_CHART_' || CHARTCode ;
DBMS_OUTPUT.PUT_LINE(V_SQLSTATEMENT);
OPEN p_cursor for V_SQLSTATEMENT;
---for i in p_cursor
LOOP
FETCH p_cursor INTO v_cursor_type;
insert into TEMPCHARTVALUES(HOP,AMOUNT,EFFECTIVE_FROM,EFFECTIVE_TO,CURRENCY)
values (v_cursor_type.PMC1_HOP_CODE,
v_cursor_type.PMC1_Amount,
v_cursor_type.PMC1_EFFECTIVE_FROM,
v_cursor_type.PMC1_EFFECTIVE_UPTO,
v_cursor_type.PMC1_CURRENCY);
--dbms_output.put_line(v_cursor_type.KEYCODE1);
EXIT WHEN p_cursor%ROWCOUNT = v_REC_COUNT;
end loop;
end prm_sp_charts_db; -
How to retrieve the max value from a cursor in procedure
Hi,
In a procedure, I defined a cursor:
cursor c_emp is select empno, ename, salary from emp where ename like 'J%';
but in the body part, I need to retrieve the max(salary) from the cursor.
could you please tell me how I can get the max value from the cursor in the procedure.
Thanks,
PaulHere is one sample but you should just get the max directly. Using bulk processing should be a last resort.
DECLARE
CURSOR c1 IS (SELECT * FROM emp where sal is not null);
TYPE typ_tbl IS TABLE OF c1%rowtype;
v typ_tbl;
max_sal number;
BEGIN
OPEN c1;
max_sal := -9999999999999;
LOOP --Loop added
FETCH c1 BULK COLLECT INTO v LIMIT 3; -- process 3 records at a time
-- process the records
DBMS_OUTPUT.PUT_LINE('Processing ' || v.COUNT || ' records.');
FOR i IN v.first..v.last LOOP
if v(i).sal > max_sal then
max_sal := v(i).sal;
end if;
DBMS_OUTPUT.PUT_LINE(v(i).empno);
END LOOP;
EXIT WHEN c1%NOTFOUND;
END LOOP;
DBMS_OUTPUT.PUT_LINE('Max salary was: ' || max_sal);
END;
Processing 3 records.
7369
7499
7521
Processing 3 records.
7566
7654
7698
Processing 3 records.
7782
7788
7839
Processing 3 records.
7844
7876
7900
Processing 2 records.
7902
7934
Max salary was: 5000 -
Hi all,
I have a Form which has text_field columns as below , created from table RECEIVED_FORM_15G. This table is blank.
1) CUST_CODE with 1 line item. (Number of Items displayed=1)
2) ACCT_FD_NO with 10 line items. (Number of Items displayed=10)
There are more than 1 ACCT_FD_NO for 1 CUST_CODE.
When i enter the CUST_CODE and press tab, all the values of ACCT_FD_NO must get displayed. I am taking ACCT_FD_NO values from another table called KEC_FDACCT_MSTR
and want to display ACCT_FD_NO, one below other (line item). So i put in the following code:
BEGIN
FIRST_RECORD;
FOR CUR_R IN (SELECT ACCT_FD_NO FROM KEC_FDACCT_MSTR WHERE STAUS='E' AND ACCT_CUST_CODE=:CUST_CODE)
LOOP
NEXT_RECORD;
:ACCT_FD_NO :=CUR_R.ACCT_FD_NO;
END LOOP;
END;
But the problem is i'm not able to display the captured value in next consecutive line items.
It is getting displayed in first & second line item only.
The first value gets displayed in first line item, then the cursor moves from first line item to second line item,
the second value gets displayed in the second line item, (this is because of NEXT_RECORD in my code)
later all the values are getting displayed in the second line item only. (I checked it using message call.)
I want it to display one below the other.
The problem is the cursor is not moving to third line item after the second line item.
So the remaining values gets displayed in the second line item only.
So what is wrong in my code??
Where should i place the next_record to make the cursor move from one line item to next line item i.e from second line item to third line item
& third line item to fourth line item & so on.... Please let me know.
Thank You.
Oracle Forms Builder 6i
Oracle 9i.The above code is right..
The only mistake was In the property palette of CUST_CODE, "required" was not set to "Yes" .
So after setting required to 'YES' , it worked perfectly fine. -
Select values from table%ROWTYPE variable into a cursor
I have a stored procedure which has an OUT parameter of table1%ROWTYPE.
In future we might have to add more OUT parameters of table2%ROWTYPE etc. But at any point of time only one will have values.
So instead of having table%ROWTYPE as OUT parameter, can I send these single row ( with variable values) in a cursor, so that declaration part atleast will not change.
Is it possible to select values from table%ROWTYPE variable into a cursor.
cursorOUT IS
SELECT * FROM varREC;
where varREC is table.ROWTYPE variable.
Or which is the better solution in this situation.
Thanks.SQL> var a refcursor
SQL> declare
2 bb emp%ROWTYPE;
3 begin
4 select * into bb from emp where rownum = 1;
5 open :a for select bb.ename ename, bb.empno empno from dual;
6 end;
7 /
PL/SQL procedure successfully completed.
SQL> print a
ENAME EMPNO
SMITH 7369Rgds. -
How can I get the cursor value from a waveform graph
Is there a way to get the value of cursor position on the waveform graph so mathematical calculations be performed on those values. We can see the value in cursor legend, but can we extract those values for future calculations in the block diagram somehow.
Right-click on the waveform graph icon. Select Create>Property Node>Cursor>Cursor Position. That spits out a a xy cluster for the current cursor position.
If you have more than one cursor, you can either set up a loop and set the Active Cursor property node (right click the property node and select "Change to Write") or you can pull everything you ever wanted to know about every cursor with the Cursor List property node. -
How to eliminate duplicates from record types?
Below code errors out with "Wrong number of arguments in call to MULTISET...." error.
Declare
TYPE ln_x_tab IS RECORD(x1 number
,x2 VARCHAR2(4000)
,x3 VARCHAR2(4000)
,x4 VARCHAR2(4000)
,x5 VARCHAR2(4000)
TYPE ln_x_type IS TABLE OF ln_x_tab INDEX BY BINARY_INTEGER;
ln_x1 ln_x_type;
ln_dist_x1 ln_x_type;
gc_stmt varchar2(4000);
Begin
gc_stmt := ' SELECT x1, x2, x3, x4, x5 FROM table WHERE dynamic_conditions;
EXECUTE IMMEDIATE gc_stmt BULK COLLECT INTO ln_x1;
ln_dist_x1:= ln_x1 MULTISET UNION DISTINCT ln_x1;
End;
I need ln_dist_x1 to have distinct records from table. Please help.I agree with the other posters that it appears this would be better solved with SQL. However, to answer your question (without endorsing the approach), you need to use SQL "object" and "table" types in order compare records for uniqueness (using the MULTISET operators in PL/SQL). So, rather than using locally defined record and table types, you must create their equivalents using CREATE TYPE:
create or replace type ln_x_tab is object (
x1 number
,x2 VARCHAR2(4000)
,x3 VARCHAR2(4000)
,x4 VARCHAR2(4000)
,x5 VARCHAR2(4000)
, map member function toMapString
return varchar2
deterministic
create or replace TYPE ln_x_type IS TABLE OF ln_x_tab;
In order to compare object types (the elements of the table type) you'll need a MAP method defined for the object type, which "maps" the object state to a scalar data-type for comparisons. Depending on your data and its meaning, this could be simple or complex, as the result must be compatible with SQL data-type limitations (e.g. 4000 character-max strings)...
create or replace type body ln_x_tab
is
map member function toMapString
return varchar2
is
result varchar2(4000);
begin
-- Only one possible way to compare for uniqueness; it will depend on your data...
select to_char(self.x1) || ';' ||
to_char(ora_hash(self.x2)) || ';' ||
to_char(ora_hash(self.x3)) || ';' ||
to_char(ora_hash(self.x4)) || ';' ||
to_char(ora_hash(self.x5))
into result
from DUAL;
return result;
end;
end;
Then, your anonymous block would look like (I've added code to return the distinct results back in a REF CURSOR bind variable, which can be easily printed out in SQL*Plus or TOAD etc):
var results refcursor
Declare
ln_x1 ln_x_type;
ln_dist_x1 ln_x_type;
gc_stmt varchar2(4000);
Begin
gc_stmt := ' SELECT ln_x_tab(rownum, 'x2', 'x3', 'x4', 'x5') FROM DUAL connect by rownum <= :n';
EXECUTE IMMEDIATE gc_stmt BULK COLLECT INTO ln_x1 using 10;
ln_dist_x1:= ln_x_type() MULTISET UNION DISTINCT ln_x1;
open :results
for
select value(r)
from table(ln_dist_x1) r;
End;
print results
with the results looking like:
1 x2 x3 x4 x5
2 x2 x3 x4 x5
3 x2 x3 x4 x5
4 x2 x3 x4 x5
5 x2 x3 x4 x5
6 x2 x3 x4 x5
7 x2 x3 x4 x5
8 x2 x3 x4 x5
9 x2 x3 x4 x5
10 x2 x3 x4 x5
Again, I don't endorse this solution, I only offer it to demonstrate how you would use SQL O-R types to get it working.
Gerard -
Error getting return value from function
Hello
I'm getting a error calling a function with ODP.NET from C#
Code:
OracleCommand oraCom = new OracleCommand("NORMALIZACION.nif",oraCon);
oraCom.CommandType = CommandType.StoredProcedure;
OracleParameter param1 = new OracleParameter("numnif",OracleDbType.Varchar2);
param1.Value= "73667866A";
param1.Direction = ParameterDirection.Input;
OracleParameter param2 = new OracleParameter("nif",OracleDbType.Varchar2);
param2.Size = 10; //FIXME line
param2.Direction = ParameterDirection.ReturnValue;
oraCom.Parameters.Add(param1);
oraCom.Parameters.Add(param2);
oraCom.ExecuteNonQuery();
nif_norm = oraCom.Parameters["nif"].Value.ToString();
if i write the FIXME line i get a error (ORA-06502) complaining about the size, no matter the value i wrote.
If i don't write the FIXME line, it works but nif_norm is always empty, although the function i call is a single return 'Hello';
Where am I wrong??
Any help, examples with varchar2 as return value???
BTW: the same code with the MS provider for Oracle works fine.Good point -- i shall do so.
What I think I'm missing, in my quest for ODP.NET competence, is a solid set of example code. I've searched around and found various fragements here and there, but when it comes to data access from .NET there must surely be some finitie set of possibilities (if we can discount bad practices like building dynamic SQL statements without bind variables).
For example, possibly in increasing order of complexity ...
* Read a single value from a SQL statement ... "select emp_name from emp where rownum < 2"
* Read a single value by passing in a parameter ... "select emp_name from emp where user_id = :?"
* read multiple values ... "select emp_name from emp where user_id in (:?,:?)"
* execute a stored procedure with no in or out parameters
* retreive a value from a function with no parameters
* pass a parameter to a stored procedure
* read an out parameter from a stored procedure
Then work with in and out ref cursors, blobs, whatever.
Thoughts? -
How to have an Oracle procedure send and receive value from a java program.
The below procedure is place inside a package. This procedure "get_extract_ready_headers " is selecting columns store_number, terminal_number, tran_number, tran_date, cust_id from the source REX_HEAD_EXTRACT table. This information is selected into a ref cursor. The data has cust_id field which is encrypted. How do I modify the procedure get_extract_ready_headers and accomplish 2 things?
1. Make this procedure to read the "cust_id" value from the source table and send the value to a Java program "getheaderinfo" (this java program decrypts the cust_id field).
2. When we get the unencrypted value back from the Java program, make the procedure accept this decrypted value and use it to update CUST_ID value in the target table TRAN_HEAD table. I am using Oracle 11.2.0.2, and TOAD 10.5.1.3.
-- Procedural code
PROCEDURE get_extract_ready_headers (p_records OUT SYS_REFCURSOR)
IS
BEGIN
OPEN p_records FOR
SELECT store_number, terminal_number, tran_number, tran_date, cust_id FROM REX_HEAD_EXTRACT;
END;--Table Structure for source table REX_HEAD_EXTRACT
CREATE TABLE REX_HEAD_EXTRACT
REX_SEQ_NBR NUMBER(20),
REVISION_NUMBER NUMBER,
DAY NUMBER(3),
RESA_TRAN_SEQ_NO NUMBER(20),
BUSINESS_DATE DATE,
TRAN_SEQ_NBR NUMBER(12),
ORG_NUMBER NUMBER,
STORE_NUMBER NUMBER,
TRAN_DATE DATE,
TERMINAL_NUMBER NUMBER,
TRAN_NUMBER NUMBER,
TRAN_TIME DATE,
BATCH_NUMBER VARCHAR2(8 BYTE),
BATCH_TYPE VARCHAR2(4 BYTE),
TRAN_TYPE VARCHAR2(4 BYTE),
SUB_TRAN_TYPE VARCHAR2(4 BYTE),
CLERK_CODE VARCHAR2(15 BYTE),
TRAN_TAXABLE_AMOUNT NUMBER(12,2),
TRAN_TAX_TOTAL NUMBER(12,2),
TRAN_GROSS_TOTAL NUMBER(12,2),
COUP_TOTAL NUMBER(9,2),
MKD_TOTAL NUMBER(9,2),
EMPLOYEE_NUMBER VARCHAR2(15 BYTE),
EMPLOYEE_NAME VARCHAR2(40 BYTE),
TRAN_ALTTAXABLE_AMOUNT NUMBER(12,2),
TRAN_ALTTAX_TOTAL NUMBER(12,2),
SALE_AMOUNT NUMBER(9,2),
RETURN_AMOUNT NUMBER(9,2),
RETURNED_AMOUNT NUMBER(9,2),
NETCASH NUMBER(12,2),
TENDER_CODE VARCHAR2(4 BYTE),
MULT_RCPT VARCHAR2(1 BYTE),
SPLIT_TENDER VARCHAR2(1 BYTE),
RTN_WITH_PURCHASE VARCHAR2(1 BYTE),
RTN_WITH_RCPT VARCHAR2(1 BYTE),
REASON_CODE VARCHAR2(4 BYTE),
PASSWORD VARCHAR2(10 BYTE),
RINGTIME DATE,
CUST_NUMBER VARCHAR2(12 BYTE),
CUST_ID VARCHAR2(50 BYTE),
ZIP_CODE NUMBER,
POSTAL_CODE VARCHAR2(9 BYTE),
PV_TIME_LAPSE NUMBER,
ORIG_STORE_NBR NUMBER,
ORIG_TRAN_DATE DATE,
ORIG_TRAN_TYPE VARCHAR2(4 BYTE),
ORIG_TERM_NBR NUMBER,
ORIG_TRAN_NBR NUMBER,
ORIG_SALE_AMT NUMBER(12,2),
ORIG_TENDER_CODE VARCHAR2(4 BYTE),
ORIG_CLERK_CODE VARCHAR2(15 BYTE),
PREV_TRAN_TYPE VARCHAR2(4 BYTE),
PREV_SUB_TRAN_TYPE VARCHAR2(4 BYTE),
GIFT_REGISTRY_ID VARCHAR2(25 BYTE),
NO_OF_ITEMS NUMBER,
TAX_EXEMPT_ID VARCHAR2(18 BYTE),
TRAN_RINGTIME NUMBER,
AUDITED VARCHAR2(1 BYTE),
BATCH_VERSION NUMBER(9,2),
BATCH_SOURCE VARCHAR2(5 BYTE),
CREATE_DATE DATE,
CREATE_ID VARCHAR2(32 BYTE),
CREATE_PROC VARCHAR2(32 BYTE),
MOD_DATE DATE,
MOD_ID VARCHAR2(32 BYTE),
MOD_PROC VARCHAR2(32 BYTE),
TERMINAL_GROUP NUMBER,
USER_DEF_1 NUMBER,
USER_DEF_2 NUMBER,
USER_DEF_3 NUMBER,
USER_DEF_4 NUMBER(12,2),
USER_DEF_5 NUMBER(12,2),
USER_DEF_6 NUMBER(12,2),
USER_DEF_7 VARCHAR2(50 BYTE),
USER_DEF_8 VARCHAR2(50 BYTE),
USER_DEF_9 VARCHAR2(50 BYTE),
MANAGER_NUMBER VARCHAR2(15 BYTE),
MANAGER_REASON_CODE VARCHAR2(10 BYTE),
MANAGER_SWIPED VARCHAR2(1 BYTE),
PHONE_NO NUMBER(11),
KCPOS_KTH_USER_101 NUMBER,
KCPOS_KTH_USER_102 NUMBER,
KCPOS_KTH_USER_103 NUMBER,
KCPOS_KTH_USER_104 NUMBER,
KCPOS_KTH_USER_105 NUMBER,
KCPOS_KTH_USER_106 NUMBER,
KCPOS_KTH_USER_107 NUMBER,
KCPOS_KTH_USER_108 NUMBER,
KCPOS_KTH_USER_109 NUMBER,
KCPOS_KTH_USER_110 NUMBER,
KCPOS_KTH_USER_201 NUMBER(12,2),
KCPOS_KTH_USER_202 NUMBER(12,2),
KCPOS_KTH_USER_203 NUMBER(12,2),
KCPOS_KTH_USER_204 NUMBER(12,2),
KCPOS_KTH_USER_205 NUMBER(12,2),
KCPOS_KTH_USER_206 NUMBER(12,2),
KCPOS_KTH_USER_207 NUMBER(12,2),
KCPOS_KTH_USER_208 NUMBER(12,2),
KCPOS_KTH_USER_209 NUMBER(12,2),
KCPOS_KTH_USER_210 NUMBER(12,2),
KCPOS_KTH_USER_301 VARCHAR2(50 BYTE),
KCPOS_KTH_USER_302 VARCHAR2(50 BYTE),
KCPOS_KTH_USER_303 VARCHAR2(50 BYTE),
KCPOS_KTH_USER_304 VARCHAR2(50 BYTE),
KCPOS_KTH_USER_305 VARCHAR2(50 BYTE),
KCPOS_KTH_USER_306 VARCHAR2(50 BYTE),
KCPOS_KTH_USER_307 VARCHAR2(50 BYTE),
KCPOS_KTH_USER_308 VARCHAR2(50 BYTE),
KCPOS_KTH_USER_309 VARCHAR2(50 BYTE),
KCPOS_KTH_USER_310 VARCHAR2(50 BYTE),
KCPOS_KTH_USER_401 DATE,
KCPOS_KTH_USER_402 DATE,
KCPOS_KTH_USER_403 DATE,
DISC_TOTAL NUMBER(9,2)
CREATE INDEX REX_HEAD_EXTRACT_NDX ON REX_HEAD_EXTRACT
(REX_SEQ_NBR, REVISION_NUMBER, STORE_NUMBER, TRAN_DATE, TERMINAL_NUMBER, TRAN_NUMBER)-- Create table DDL for target table TRAN_HEAD
CREATE TABLE NAVISTOR.KCPOS_TRAN_HEADER_BASE
TRAN_SEQ_NBR NUMBER(12),
ORG_NUMBER NUMBER,
STORE_NUMBER NUMBER,
TRAN_DATE DATE,
TERMINAL_NUMBER NUMBER,
TRAN_NUMBER NUMBER,
TRAN_TIME DATE,
BATCH_NUMBER VARCHAR2(8 BYTE),
BATCH_TYPE VARCHAR2(4 BYTE),
TRAN_TYPE VARCHAR2(4 BYTE),
SUB_TRAN_TYPE VARCHAR2(4 BYTE),
CLERK_CODE VARCHAR2(15 BYTE) NOT NULL,
TRAN_TAXABLE_AMOUNT NUMBER(12,2),
TRAN_TAX_TOTAL NUMBER(12,2),
TRAN_GROSS_TOTAL NUMBER(12,2),
COUP_TOTAL NUMBER(9,2),
MKD_TOTAL NUMBER(9,2),
EMPLOYEE_NUMBER VARCHAR2(15 BYTE),
EMPLOYEE_NAME VARCHAR2(40 BYTE),
TRAN_ALTTAXABLE_AMOUNT NUMBER(12,2),
TRAN_ALTTAX_TOTAL NUMBER(12,2),
SALE_AMOUNT NUMBER(9,2),
RETURN_AMOUNT NUMBER(9,2),
RETURNED_AMOUNT NUMBER(9,2),
NETCASH NUMBER(12,2),
TENDER_CODE VARCHAR2(4 BYTE),
MULT_RCPT VARCHAR2(1 BYTE),
SPLIT_TENDER VARCHAR2(1 BYTE),
RTN_WITH_PURCHASE VARCHAR2(1 BYTE),
RTN_WITH_RCPT VARCHAR2(1 BYTE),
REASON_CODE VARCHAR2(4 BYTE),
PASSWORD VARCHAR2(10 BYTE),
RINGTIME DATE,
CUST_NUMBER VARCHAR2(12 BYTE),
CUST_ID VARCHAR2(50 BYTE) ENCRYPT USING 'AES256' NO SALT,
ZIP_CODE NUMBER,
POSTAL_CODE VARCHAR2(9 BYTE),
PV_TIME_LAPSE NUMBER,
ORIG_STORE_NBR NUMBER,
ORIG_TRAN_DATE DATE,
ORIG_TRAN_TYPE VARCHAR2(4 BYTE),
ORIG_TERM_NBR NUMBER,
ORIG_TRAN_NBR NUMBER,
ORIG_SALE_AMT NUMBER(12,2),
ORIG_TENDER_CODE VARCHAR2(4 BYTE),
ORIG_CLERK_CODE VARCHAR2(15 BYTE),
PREV_TRAN_TYPE VARCHAR2(4 BYTE),
PREV_SUB_TRAN_TYPE VARCHAR2(4 BYTE),
GIFT_REGISTRY_ID VARCHAR2(25 BYTE),
NO_OF_ITEMS NUMBER,
TAX_EXEMPT_ID VARCHAR2(18 BYTE),
TRAN_RINGTIME NUMBER,
AUDITED VARCHAR2(1 BYTE),
BATCH_VERSION NUMBER(9,2),
BATCH_SOURCE VARCHAR2(5 BYTE),
CREATE_DATE DATE,
CREATE_ID VARCHAR2(32 BYTE),
CREATE_PROC VARCHAR2(32 BYTE),
MOD_DATE DATE,
MOD_ID VARCHAR2(32 BYTE),
MOD_PROC VARCHAR2(32 BYTE),
TERMINAL_GROUP NUMBER,
USER_DEF_1 NUMBER,
USER_DEF_2 NUMBER,
USER_DEF_3 NUMBER,
USER_DEF_4 NUMBER(12,2),
USER_DEF_5 NUMBER(12,2),
USER_DEF_6 NUMBER(12,2),
USER_DEF_7 VARCHAR2(50 BYTE),
USER_DEF_8 VARCHAR2(50 BYTE),
USER_DEF_9 VARCHAR2(50 BYTE),
MANAGER_NUMBER VARCHAR2(15 BYTE),
MANAGER_REASON_CODE VARCHAR2(10 BYTE),
MANAGER_SWIPED VARCHAR2(1 BYTE),
PHONE_NO NUMBER(11),
KCPOS_KTH_USER_101 NUMBER,
KCPOS_KTH_USER_102 NUMBER,
KCPOS_KTH_USER_103 NUMBER,
KCPOS_KTH_USER_104 NUMBER,
KCPOS_KTH_USER_105 NUMBER,
KCPOS_KTH_USER_106 NUMBER,
KCPOS_KTH_USER_107 NUMBER,
KCPOS_KTH_USER_108 NUMBER,
KCPOS_KTH_USER_109 NUMBER,
KCPOS_KTH_USER_110 NUMBER,
KCPOS_KTH_USER_201 NUMBER(12,2),
KCPOS_KTH_USER_202 NUMBER(12,2),
KCPOS_KTH_USER_203 NUMBER(12,2),
KCPOS_KTH_USER_204 NUMBER(12,2),
KCPOS_KTH_USER_205 NUMBER(12,2),
KCPOS_KTH_USER_206 NUMBER(12,2),
KCPOS_KTH_USER_207 NUMBER(12,2),
KCPOS_KTH_USER_208 NUMBER(12,2),
KCPOS_KTH_USER_209 NUMBER(12,2),
KCPOS_KTH_USER_210 NUMBER(12,2),
KCPOS_KTH_USER_301 VARCHAR2(50 BYTE),
KCPOS_KTH_USER_302 VARCHAR2(50 BYTE),
KCPOS_KTH_USER_303 VARCHAR2(50 BYTE),
KCPOS_KTH_USER_304 VARCHAR2(50 BYTE),
KCPOS_KTH_USER_305 VARCHAR2(50 BYTE),
KCPOS_KTH_USER_306 VARCHAR2(50 BYTE),
KCPOS_KTH_USER_307 VARCHAR2(50 BYTE),
KCPOS_KTH_USER_308 VARCHAR2(50 BYTE),
KCPOS_KTH_USER_309 VARCHAR2(50 BYTE),
KCPOS_KTH_USER_310 VARCHAR2(50 BYTE),
KCPOS_KTH_USER_401 DATE,
KCPOS_KTH_USER_402 DATE,
KCPOS_KTH_USER_403 DATE,
DISC_TOTAL NUMBER(9,2),
RTA_RTN_AUTCOD VARCHAR2(4 BYTE),
RTA_RTN_COMMID NUMBER,
RTA_RTN_EVNTID NUMBER,
RTA_RTN_QTY NUMBER,
RTA_RTN_RCPT_SCAN VARCHAR2(1 BYTE),
RTA_RTN_REFUND_AMT NUMBER(9,2),
RTA_RTN_TYPE_CODE VARCHAR2(4 BYTE),
RTA_RTN_WITH_RCPT VARCHAR2(1 BYTE),
RTA_RTN_COUNT INTEGER,
SDEDVAL1 VARCHAR2(50 BYTE)
)--sample data
REX_SEQ_NBR,REVISION_NUMBER,DAY,RESA_TRAN_SEQ_NO,BUSINESS_DATE,TRAN_SEQ_NBR,ORG_NUMBER,STORE_NUMBER,TRAN_DATE,TERMINAL_NUMBER,
TRAN_NUMBER,TRAN_TIME
478,1,11,12024005,6/11/2012,,1,692,6/11/2012,155,5,6/11/2012 12:57:17 PM,
479,1,11,12024006,6/11/2012,,1,692,6/11/2012,155,6,6/11/2012 2:01:51 PM,
480,1,11,12024007,6/11/2012,,1,692,6/11/2012,155,7,6/11/2012 2:47:10 PMAssuming that SomeJavePgm is a Java stored function (not a Java program running outside the database) and that it takes as a parameter whatever data type CUST_ID is in TABLE_A (hopefully RAW but potentially VARCHAR2) and returns a string, you would call it just as you would a PL/SQL stored function
INSERT INTO table_b( cust_id, <<other columns>> )
SELECT SomeJavaPgm( a.cust_id ), <<other columns>>
FROM table_a aIf SomeJavePgm is not a Java stored procedure, calling it from PL/SQL becomes much more complicated. You would need whatever machine hosts this program to expose an appropriate API (for example, a web service interface) that you could invoke via UTL_HTTP). You'd need to tell us what that API was, however.
Justin -
Using ORDER BY in UNION clause in cursor
Hi Everybody,
I have one situation and i need your help guys. I have to use ORDER BY in UNION of two queries and return value in cursor.
OPEN cursor FOR
SELECT ID, DESC,SID, ITID, SID_DESC
FROM (SELECT A.ID,
A.DESC,
B.SID,
NULL AS ITID,
B.SID_DESC
FROM TABLEA A, TABLEB B
WHERE A.ID = B.ID
order by A.SORTORDER asc,B.SORTORDER)
UNION
SELECT ID, DESC, ,SID,ITID, ITID_DESCRIPTION,
FROM (SELECT A.ID,
A.DESC,
NULL AS SID,
C.ITID,
C.ITID_DESC,
FROM TABLEA A,
TABLEC C
WHERE A.ID = C.ID
order by A.SORTORDER asc,C.SORTORDER)
I SORT ORDER is column in all three tables. TABLEA has unique number for each record as sort order. TABLEB has sortorder as 1 for each id. If id is two times then its 1 and 2 for each id. TABLEC has sort order as TABLEB, 1 for each id and if id is two times then it is 1 and 2 and id id is three times, it is 1, 2, 3.
I am not getting correct sorting as i cant use order by like this in UNION. Please let me know how i can handle this.
Thank you in advance to everybody.
I will really appreciate your comments and responses.Hi,
You can use ORDER BY in a sub-query, but there's usually no point in doing so, because the super-query won't necessarily preserve that order. You need to make the columns that you want to ORDER BY available to the main query, so that they can be used there.
Try this:
SELECT ID, DESC,SID, ITID, SID_DESC
FROM (
SELECT A1.ID,
A1.DESC,
B.SID,
NULL AS ITID,
B.SID_DESC,
A1.SORTORDER AS sortorder_1
B.SORTORDER AS sortorder_2
FROM TABLEA A1,
TABLEB B
WHERE A1.ID = B.ID
UNION
SELECT A2.ID,
A2.DESC,
NULL AS SID,
C.ITID,
C.ITID_DESC,
A2.SORTORDER AS sortorder_1
B.SORTORDER AS sortorder_2
FROM TABLEA A2,
TABLEC C
WHERE A2.ID = C.ID
order by SORTORDER_1 ASC -- ASC is the default, but it doesn't hurt to say it
SORTORDER_2This assumes that tableb.sortorder and tablec.sortorder have the same, or at least similar, data types. If not, explicitly convert sortorder_1 in one branch of the UNION to the type of sortorder_2 in the other branch.
Using the same alias to mean different things in the same query is just asking for trouble. I changed the table alias a (which was used in different places to mean two different things) to A1 and A2, each of which means only one thing.
I hope this answers your question.
If not, post a little sample data (CREATE TABLE and INSERT statements, relevant columns only) for all tables, and also post the results you want from that data.
Explain, using specific examples, how you get those results from that data.
Always say which version of Oracle you're using. -
Passing value from JavaScript window to form
Hi,
Coul'd You help me?
I have a test form. I open new JavaScript window from this form. I generate list of authors in this window by the procedure show_list. I want to pass value from JavaScript window back to test form, but
the command "window.opener.document.forms[idx_form].elements[idx_fld].value = val;"
don't pass value to test form. Where is mistake?
Thanks Vaclav
-------------- test form --------------
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=windows-1250">
<TITLE>Edit</TITLE>
<SCRIPT LANGUAGE="JavaScript">
<!-- Comment out script for old browsers
function get_list(frm, fld)
var idx_form, idx_fld;
idx_form = get_idx_form(frm);
idx_fld = get_idx_field(idx_form, fld);
var w = open ("http://vasekora/pls/portal309/ahs.RD_CISEL.SHOW_LIST" + "?startPg=1" + "&master_fld=" + "ID_AUTHOR" + "&slave_fld=" + "NAME" + "&ownr=" + "REDAKCE" + "&tbl_name=" + "AUTHORS" + "&cmd_qry=" +"" + "&idx_form=" + idx_form + "&idx_fld=" + idx_fld,"wn_Authors","width=500,height=600,resizable=yes,menubar=yes, location=yes");
if (w.opener == null)
w.opener = self;
w.focus();
function get_idx_form(p_form_name)
var v_index, v_full_name, v_return;
for(v_index=0; v_index < document.forms.length; v_index++)
v_return = -1;
v_full_name = document.forms[v_index].name.split(".");
if (v_full_name == p_form_name)
v_return = v_index;
break;
return v_return;
function get_idx_field(idx_form, field_name)
var v_index, v_full_name, v_return;
for(v_index=0; v_index < document.forms[idx_form].length; v_index++)
v_return = -1;
v_full_name = document.forms[idx_form].elements[v_index].name.split(".");
if (v_full_name == field_name)
v_return = v_index;
break;
return v_return;
//-->
</SCRIPT>
</HEAD>
<BODY>
<FORM NAME="f_aut_new" ACTION="javascript:testclose()" METHOD=POST TARGET="_blank">
<INPUT TYPE="text" NAME="id_aut">
<IMG SRC="images/list.gif" alt="Seznam" border="0" align=bottom><BR><BR>
<INPUT TYPE="submit" VALUE="Save">
<INPUT TYPE="reset" VALUE="Cancel">
</FORM>
</BODY>
</HTML>
-------------------- end test form --------------
procedure show_list
startPg integer,
master_fld varchar2,
show_fld varchar2,
ownr varchar2,
tbl_name varchar2,
cmd_qry varchar2,
idx_form integer,
idx_fld integer
is
TYPE cur_typ IS REF CURSOR;
c cur_typ;
c_cnt cur_typ;
i integer;
pg rd_types.pages_t;
odkaz varchar2(4000);
bk_url varchar2(4000);
s1 varchar2(4000);
var_mfld integer;
var_sfld varchar2(8000);
bl boolean;
var_cmd varchar2(2000);
begin
htp.HTMLOPEN;
htp.HEADOPEN;
htp.p('<SCRIPT LANGUAGE="JavaScript">');
htp.p('<!-- Comment out script for old browsers');
htp.p('function Close_List(val, idx_form, idx_fld)');
htp.p('{');
htp.p('window.opener.document.forms[idx_form].elements[idx_fld].value = val;');
htp.p('self.close();');
htp.p('}');
htp.p('//-->');
htp.p('</SCRIPT>');
htp.HEADCLOSE;
htp.BODYOPEN;
if cmd_qry is null then
s1 := 'SELECT a.'||master_fld||', a.'||show_fld||' FROM '||ownr||'.'||tbl_Name||
' a ORDER BY a.'||show_fld;
else
var_cmd := UPPER(cmd_qry);
s1 := 'SELECT a.'||master_fld||', a.'||show_fld||' FROM '||ownr||'.'||tbl_Name||
' a WHERE UPPER(a.'||show_fld||') LIKE ''%'||var_cmd||'%'' ORDER BY a.'||show_fld;
end if;
i := 1;
OPEN c FOR s1;
LOOP
FETCH c INTO var_mfld, var_sfld;
IF c%FOUND THEN
IF i >= pg.StartRec AND i <= pg.EndRec THEN
odkaz :=''||var_sfld||'';
htp.p(i||': '||odkaz||' ('||var_mfld||')<BR>');
ELSE
IF i > pg.EndRec THEN
EXIT;
END IF;
END IF;
ELSE
EXIT;
END IF;
i := i + 1;
END LOOP;
htp.p('<BR><B><INPUT TYPE=BUTTON ONCLICK="javascript:self.close();" VALUE="Close"></B><BR><BR>');
CLOSE c;
htp.BODYCLOSE;
htp.HTMLCLOSE;
end;If this makes any difference: Instead of using "var w = open..." try "var w = window.open..."
-
Connect by Level using count value from record collection
Hello:
PROBLEM:
) y,(select rownum MonthNo from dual connect by level <= Cnt)
Causes ORA-00904 Invalid identifier. Why can’t I use “Cnt” from my main query as using a constant works?
The count value is determined for each date range in How can I return the records I need?
Thanks, Sidney
BACKGROUND:
I need to be able to display a list of tax returns to my users and the status of those returns. Physical returns do not exist so it is necessary to create the data records dynamically using appropriate selects. This is not difficult and I thought I could then just use a connect by level to give me the date information so I could calculate and display the individual returns. However oracle is giving me an ORA-00904 when I try to send the “Cnt” value to connect by level. Everything works fine when I provide a constant instead of “CNT”. The “CNT” value is determined by a complex process that computes the start and stop dates for multiple return types, etc. as well as the number of periods and filing frequency. The data has to be dynamically generated using a master record which then yields the coding history from which my basic record collection is selected. Here is the result of that process:
TaxpayerNo,TaxClass,TaxCode,FilingFequency,StartDate,StopDate,Cnt,Frequency
10 S 1 M 6/1/2007 11/30/2008 18 12
10 S 2 M 11/30/2008 9/30/2009 10 12
10 S 2 Q 11/30/2010 8/18/2011 3 4
10 L 8 A 6/1/2007 9/30/2009 3 1
10 L 8 A 11/30/2010 8/18/2011 1 1
From this data, I need a record for each individual month,quarter,etc. ie:
10 S 1 M 6/1/2007 11/30/2008 18 12 6/1/2007
10 S 1 M 6/1/2007 11/30/2008 18 12 7/1/2007
10 S 1 M 6/1/2007 11/30/2008 18 12 8/1/2007
10 S 1 M 6/1/2007 11/30/2008 18 12 9/1/2007
10 S 2 M 11/30/2008 9/30/2009 10 12 11/30/2008
10 S 2 M 11/30/2008 9/30/2009 10 12 12/30/2008
etc.
DOES NOT WORK
select y.*,MonthNo,Add_Months(StartDate,MonthNo*Frequency) from (
select x.*,
(case when FilingFrequency = 'M' then Ceil(Months_Between(StopDate,StartDate))
when FilingFrequency = 'Q' then Ceil(Months_Between(StopDate,StartDate)/3)
when FilingFrequency = 'A' then Ceil(Months_Between(StopDate,StartDate)/12)
else 0
end) Cnt,
(case when FilingFrequency = 'M' then 1
when FilingFrequency = 'Q' then 3
when FilingFrequency = 'A' then 12
end) Frequency
from (
... complex code to calculate the values of the start and stop dates needed above...
) x
) y,(select rownum MonthNo from dual connect by level <= Cnt)
ERROR MESSAGE
This returns ORA-00904: "CNT": Invalid Identifier. I don't get an error if I use a constant:
WORKS USING A CONSTANT BUT MUST HAVE THE ACTUAL CNT VALUE
... Same code to generate data ...
) y,(select rownum MonthNo from dual connect by level <= 3)
How can I get this to work using the "CNT" value instead of a constant?A technique like this should fix your problem.
TUBBY_TUBBZ?with data (col1, cnt) as
2 (
3 select 1, 3 from dual
4 union all
5 select 2, 2 from dual
6 )
7 select
8 d.col1,
9 t.column_value
10 from
11 data d,
12 table(cast(multiset(select level from dual connect by level <= d.cnt) as sys.OdciNumberList)) t;
COL1 COLUMN_VALUE
1 1
1 2
1 3
2 1
2 2
5 rows selected.
Elapsed: 00:00:00.00
TUBBY_TUBBZ?As opposed to what you have now, which is basically this
TUBBY_TUBBZ?with data (col1, cnt) as
2 (
3 select 1, 3 from dual
4 union all
5 select 2, 2 from dual
6 )
7 select
8 d.col1,
9 level
10 from
11 data d
12 connect by level <= d.cnt;
COL1 LEVEL
1 1
1 2
1 3
2 2
1 3
2 1
1 2
1 3
2 2
1 3
10 rows selected.
Elapsed: 00:00:00.00
TUBBY_TUBBZ?
Maybe you are looking for
-
Dear all, while doing asset trasfer we r getting error that balancing field "profit center" in line item 001 is not filled we r using 6.0 version and we assigend the profit center correctly only. plz respond as soon as possible. Thanks Anitha.
-
I use Outlook as my central location for managing both business and personal email, calendar, contacts, task and memo. I am a consultant and when working with a client they give me a POP3 company email account. I currently use BB desk manager to sy
-
Hi guys, here is the scenario : we have a weblogic server running fine with a domain name "casa1" with 4 JVM's ( two on same machine and two on different machine ). And we created a newdomain "casa2" with 4 JVM's ( 2 on same machine and 2 on differen
-
How do i make a group in messaging
How do i create a group in messaging?
-
My Nokia N95 - can anyone help?
Hi - i have the Nokia N95 im on 02 online my phone keeps restarting itself about 3 - 4 times per day im just sat there sometimes and it just does it! apart from that im very happy with it i got rid of 3 of these handsets because of wobbly clicky slid