Open Cursor in a procedure
Hi to all,
my problem is to open a cursor into a procedure.
The code is the following:
PROCEDURE p_selection_customer
IS
CURSOR cursor_customer IS
SELECT
c_u.id_customer
FROM
customer_unified_a c_u;
BEGIN
FOR record_customer IN cursor_customer LOOP
ROLLBACK;
END LOOP;
END p_selection_customer;
The error is :
Errore(55,3): PL/SQL: SQL Statement ignored
Errore(58,3): PL/SQL: ORA-06552: PL/SQL: Compilation unit analysis terminated ORA-06553: PLS-320: the declaration of the type of this expression is incomplete or malformed
This procedure is defined in the spec. Then I suppose that my problem is that I can't open a cursor into my schema. Do I verify this hypotesys in my schema? Do I have some queries? My schema don't have the dba and sys grants.
Thank'you very match!
Hi Alex,
this is the complete script used to generate the table.
Me too, I knew that the partition was transparent to the Cursor statement.
Thank'you very match!
CREATE TABLE "SSVILCID"."TW_E_CUSTOMER_UNIFIED_A"
( "ID_CUSTOMER_UNIFIED" VARCHAR2(27 BYTE) NOT NULL ENABLE,
"START_VALIDITY_DATE" DATE NOT NULL ENABLE,
"START_ASINC_DATE" DATE NOT NULL ENABLE,
"END_ASINC_DATE" DATE,
"CUSTOMER_STATUS" VARCHAR2(255 BYTE),
"TERMINATION_DATE" DATE,
"CUSTOMER_DOMAIN" VARCHAR2(255 BYTE),
"CUSTOMER_CLUSTER" VARCHAR2(255 BYTE),
"CUSTOMER_SENIORITY" DATE,
"ACTIVATION_DATE" DATE,
"ACQUISITION_DATE" DATE,
"ACQUISITION_CHANNEL" VARCHAR2(255 BYTE),
"SUB_ACQUISITION_CHANNEL" VARCHAR2(255 BYTE),
CONSTRAINT "TW_E_CUSTOMER_UNIFIED_A_PK" PRIMARY KEY ("START_ASINC_DATE", "ID_CUSTOMER_UNIFIED", "START_VALIDITY_DATE")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "SYSTEM" ENABLE
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
STORAGE(
BUFFER_POOL DEFAULT)
TABLESPACE "DATI"
PARTITION BY RANGE ("START_ASINC_DATE")
SUBPARTITION BY LIST ("END_ASINC_DATE")
(PARTITION "M200909" VALUES LESS THAN (TO_DATE(' 2009-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
STORAGE(
BUFFER_POOL DEFAULT)
TABLESPACE "DATI"
( SUBPARTITION "M200909_N" VALUES (NULL)
TABLESPACE "DATI",
SUBPARTITION "M200909_NN" VALUES (DEFAULT)
TABLESPACE "DATI") ,
PARTITION "M200910" VALUES LESS THAN (TO_DATE(' 2009-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
STORAGE(
BUFFER_POOL DEFAULT)
TABLESPACE "DATI"
( SUBPARTITION "M200910_N" VALUES (NULL)
TABLESPACE "DATI",
SUBPARTITION "M200910_NN" VALUES (DEFAULT)
TABLESPACE "DATI") ,
PARTITION "M200911" VALUES LESS THAN (TO_DATE(' 2009-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
STORAGE(
BUFFER_POOL DEFAULT)
TABLESPACE "DATI"
( SUBPARTITION "M200911_N" VALUES (NULL)
TABLESPACE "DATI",
SUBPARTITION "M200911_NN" VALUES (DEFAULT)
TABLESPACE "DATI") ,
PARTITION "M200912" VALUES LESS THAN (TO_DATE(' 2010-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
STORAGE(
BUFFER_POOL DEFAULT)
TABLESPACE "DATI"
( SUBPARTITION "M200912_N" VALUES (NULL)
TABLESPACE "DATI",
SUBPARTITION "M200912_NN" VALUES (DEFAULT)
TABLESPACE "DATI") ,
PARTITION "M201001" VALUES LESS THAN (TO_DATE(' 2010-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
STORAGE(
BUFFER_POOL DEFAULT)
TABLESPACE "DATI"
( SUBPARTITION "M201001_N" VALUES (NULL)
TABLESPACE "DATI",
SUBPARTITION "M201001_NN" VALUES (DEFAULT)
TABLESPACE "DATI") ,
PARTITION "M201002" VALUES LESS THAN (TO_DATE(' 2010-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
STORAGE(
BUFFER_POOL DEFAULT)
TABLESPACE "DATI"
( SUBPARTITION "M201002_N" VALUES (NULL)
TABLESPACE "DATI",
SUBPARTITION "M201002_NN" VALUES (DEFAULT)
TABLESPACE "DATI") ,
PARTITION "FUTURE" VALUES LESS THAN (MAXVALUE)
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
STORAGE(
BUFFER_POOL DEFAULT)
TABLESPACE "DATI"
( SUBPARTITION "M210001_N" VALUES (NULL)
TABLESPACE "DATI",
SUBPARTITION "M210001_NN" VALUES (DEFAULT)
TABLESPACE "DATI") ) ENABLE ROW MOVEMENT ;
Similar Messages
-
Open cursor for existing procedure
Is it possible to open a refcursor for an existing procedure as apposed to opening a refcursor for a standard select statement. For example:
Standard select:
OPEN refcursor FOR
select * from my_table;
RETURN the_cursor;
Based on an existing procedure:
OPEN refcursor FOR
my_package.my_procedure();
RETURN the_cursor;
Note: my_procedure returns a table of record type rows defined by myself in the package spec.
Any help is much appreciated
Regards
TonyHi Sven
Thank you for that information however I am still a little unsure as to how to call the procedure including the necessary parameters. The procedure in question has the following IN parameters with one OUT parameter.
my_procedure (p_context_id in number,
p_username in varchar2,
p_mdata out mtab)
As you stated, if it is a procedure, which it is, then use the following:
my_package.my_procedure(the_cursor);
However if I need to pass parameters in the call that kind of conflicts where 'the_cursor' is?
Any ideas?
Tony -
Open Cursor using other function/procedure
Hi
I have a procedure that return a cursor to Java, but if it send a parameter or other I wanted to call a procedure or function and return cursor to java , Is possible it ?
Example
PROCEDURE XYZ ( P_ORD IN NUMBER,
p_CURSOR OUT SYS_REFCURSOR)
IS
BEGIN
IF P_ORD =1 THEN
-- here I want to open cursor from other procedure/function
OPEN P_CURSOR
ELSIF P_ORD = 2 THEN
END IF;
END XYZ;Message was edited by:
muttleychessLooking at your example code, you say you want to open a cursor from another procedure.
I would suggest taking a step back and looking into the basics of procedural programming, especially in the area of variable scopes.
The scope of the cursor declared in another procedure will be that it exists within that procedure only.
In order to use another procedure's cursor you would have to call that procedure and have it return a SYS_REFCURSOR to your first procedure in the same manner you are trying to return a sys_refcursor to your Java code. -
Open ref cursor in a procedure
Hi
I have a procedure which has 3 input parameters and 1 REF CURSOR type OUT parameter.
In the body of the procedure a select query is dynamically being created, and just before the end of the procedure the REF CURSOR is opened for SELECT(dynamic) query
For Ex: Create or replace procedure proc_name(a in number,b in number,c in number,RETVAL OUT REF CURSOR) as
decalre
strQry varchar2(3000);
begin
-- strQry is select query built dynamically
OPEN RETVAL for strQry;
end proc_name;
This procedure is being called by a java application. My question is what the open cursor statement is doing in the procedure?
Any ideas? Thanks!
greddyHi,
As i know, for example if we want to generate a report for some particular records in our project.consider we are using java as front end and oracle as backend. ok. In that case we need to bring the data from backend to front end ,for that in backend (oracle) we can write procedure to perform this task using ref cursors.
Note: ref cursor will provide the most efficient way in bringing the records from back end to front end.
Create or replace procedure proc_name(a in number,b in number,c in number,RETVAL OUT REF CURSOR) as
decalre
strQry varchar2(3000);
begin
-- strQry is select query built dynamically
--if we are using dynamic query, we can filter out the records using id or name or date
once we did, we need to pass the values to calling enviroment, since we declared the ref cursor as out parameter, we can use the ref cursor to pass the values to calling enviroment. Since we are using ref cursor we need to open the cursor for that dynamic query.
OPEN RETVAL for strQry;
end proc_name;
hope this information is some what helpful. if you got any details regarding this please post it..
thanks. -
Opening two cursors using open cursor with bulk collect on colections ..
Is it possible to have the implementatiion of using bulk collect with collections using two open cursors ..
first c1
second c2
open c1
loop
open c2
loop
end loop
close c2
end loop;
close c1
what i found is for every outer loop of cursor c1 , cursor c2 is open and closed for every record.
is this willl imporove the performace .?
EXAMPLE:-
NOTE: The relatoin between finc and minc is one to many ..finc is parent and minc is child
function chk_notnull_blank ( colname IN number ) return number is
BEGIN
if ( colname is NOT NULL and colname not in ( -8E14, -7E14, -6E14, -5E14, -4E14, -3E14, -2E14, -1E14, -1E9 )) then
RETURN colname ;
else
RETURN 0;
end if;
END chk_notnull_blank;
procedure Proc_AnnualFmlyTotIncSummary is
CURSOR c_cur_finc IS SELECT FAMID FROM FINC ;
CURSOR c_cur_minc IS SELECT FAMID, MEMBNO , ANFEDTX, ANGOVRTX, ANPRVPNX, ANRRDEDX, ANSLTX, SALARYX, SALARYBX, NONFARMX, NONFRMBX , FARMINCX, FRMINCBX, RRRETIRX, RRRETRBX, SOCRRX, INDRETX, JSSDEDX, SSIX, SSIBX from MINC minc WHERE FAMID IN ( SELECT FAMID FROM FINC finc WHERE minc.FAMID = finc.FAMID );
v_tot_fsalaryx number := 0;
v_tot_fnonfrmx number := 0;
v_tot_ffrmincx number := 0;
v_tot_frretirx number := 0;
v_tot_findretx number := 0;
v_tot_fjssdedx number := 0;
v_tot_fssix number := 0;
v_temp_sum_fsalaryx number := 0;
v_temp_sum_fnonfrmx number := 0;
v_temp_sum_ffrmincx number := 0;
v_temp_sum_frretirx number := 0;
v_temp_sum_findretx number := 0;
v_temp_sum_fjssdedx number := 0;
v_temp_sum_fssix number := 0;
TYPE minc_rec IS RECORD (FAMID MINC.FAMID%TYPE, MEMBNO MINC.MEMBNO%TYPE , ANFEDTX MINC.ANFEDTX%TYPE, ANGOVRTX MINC.ANGOVRTX%TYPE , ANPRVPNX MINC.ANPRVPNX%TYPE , ANRRDEDX MINC.ANRRDEDX%TYPE , ANSLTX MINC.ANSLTX%TYPE, SALARYX MINC.SALARYX%TYPE , SALARYBX MINC.SALARYBX%TYPE , NONFARMX MINC.NONFARMX%TYPE , NONFRMBX MINC.NONFRMBX%TYPE, FARMINCX MINC.FARMINCX%TYPE , FRMINCBX MINC.FRMINCBX%TYPE , RRRETIRX MINC.RRRETIRX%TYPE , RRRETRBX MINC.RRRETRBX%TYPE, SOCRRX MINC.SOCRRX%TYPE , INDRETX MINC.INDRETX%TYPE , JSSDEDX MINC.JSSDEDX%TYPE , SSIX MINC.SSIX%TYPE , SSIBX MINC.SSIBX%TYPE );
v_flag_boolean boolean := false;
v_famid number ;
v_stmt varchar2(3200) ;
v_limit number := 50;
v_temp_FAMTFEDX number := 0 ;
v_temp_FGOVRETX number := 0 ;
v_temp_FPRIVPENX number := 0 ;
v_temp_FRRDEDX number := 0 ;
v_temp_FSLTAXX number := 0 ;
v_temp_FSALARYX number := 0 ;
v_temp_FNONFRMX number := 0 ;
v_temp_FFRMINCX number := 0 ;
v_temp_FRRETIRX number := 0 ;
v_temp_FINDRETX number := 0 ;
v_temp_FJSSDEDX number := 0 ;
v_temp_FSSIX number := 0 ;
BEGIN
OPEN c_cur_finc ;
LOOP
FETCH c_cur_finc BULK COLLECT INTO famid_type_tbl LIMIT v_limit;
EXIT WHEN famid_type_tbl.COUNT = 0;
FOR i in famid_type_tbl.FIRST..famid_type_tbl.LAST
LOOP
OPEN c_cur_minc ;
LOOP
FETCH c_cur_minc BULK COLLECT INTO minc_rec_type_tbl LIMIT v_limit;
EXIT WHEN minc_rec_type_tbl.COUNT = 0;
FOR j IN minc_rec_type_tbl.FIRST..minc_rec_type_tbl.LAST
LOOP
if ( famid_type_tbl(i) = minc_rec_type_tbl(j).FAMID ) THEN
v_temp_FAMTFEDX := v_temp_FAMTFEDX + chk_notnull_blank(minc_rec_type_tbl(j).ANFEDTX );
v_temp_FGOVRETX := v_temp_FGOVRETX + chk_notnull_blank(minc_rec_type_tbl(j).ANGOVRTX);
v_temp_FPRIPENX := v_temp_FPRIPENX + chk_notnull_blank(minc_rec_type_tbl(j).ANPRVPNX);
v_temp_FRRDEDX := v_temp_FRRDEDX + chk_notnull_blank(minc_rec_type_tbl(j).ANRRDEDX);
v_temp_FSLTAXX := v_temp_FSLTAXX + chk_notnull_blank(minc_rec_type_tbl(j).ANSLTX );
v_temp_FSALARYX := v_temp_FSALARYX + chk_notnull_blank(minc_rec_type_tbl(j).SALARYX ) + chk_notnull_blank(minc_rec_type_tbl(j).SALARYBX);
v_temp_FNONFRMX := v_temp_FNONFRMX + chk_notnull_blank(minc_rec_type_tbl(j).NONFARMX) + chk_notnull_blank(minc_rec_type_tbl(j).NONFRMBX);
v_temp_FFRMINCX := v_temp_FFRMINCX + chk_notnull_blank(minc_rec_type_tbl(j).FARMINCX) + chk_notnull_blank(minc_rec_type_tbl(j).FRMINCBX );
v_temp_FRRETIRX := v_temp_FRRETIRX + chk_notnull_blank(minc_rec_type_tbl(j).RRRETIRX) + chk_notnull_blank(minc_rec_type_tbl(j).RRRETRBX ) + chk_notnull_blank(minc_rec_type_tbl(j).SOCRRX);
v_temp_FINDREXT := v_temp_FINDRETX + chk_notnull_blank(minc_rec_type_tbl(j).INDRETX);
v_temp_FJSSDEDX := v_temp_FJSSDEDX + chk_notnull_blank(minc_rec_type_tbl(j).JSSDEDX);
v_temp_FSSIX := v_temp_FSSIX + chk_notnull_blank(minc_rec_type_tbl(j).SSIX ) + chk_notnull_blank(minc_rec_type_tbl(j).SSIBX);
END IF;
END LOOP;
END LOOP ;
CLOSE c_cur_minc;
UPDATE FINC SET FAMTFEDX = v_temp_FAMTFEDX WHERE FAMID = famid_type_tbl(i);
END LOOP;
END LOOP;
CLOSE c_cur_finc;
END;
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20001,'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM);
v_err_code := SQLCODE;
v_err_msg := substr(SQLERRM, 1, 200);
INSERT INTO audit_table (error_number, error_message) VALUES (v_err_code, v_err_msg);
error_logging(p_error_code => substr(sqlerrm,1,9), p_error_message => substr(sqlerrm,12), p_package =>'PKG_FCI_APP',p_procedure => 'Proc_Annual_Deductions_FromPay ' , p_location => v_location);
end Proc_AnnualFmlyTotIncSummary ;
Is the proga efficient and free from compilation errors ..?
thanks/kumar
Edited by: kumar73 on Sep 22, 2010 12:48 PMfunction chk_notnull_blank ( colname IN number ) return number is Maybe this function should have its own forum:
how to use case in this program
Re: how to declare a formal parameter in a function of type record and access ?
Re: how to define a function with table type parameter
Re: creation of db trigger with error ..
Re: How to write a trigger for the below scenario
how to improve the code using advanced methods
yours advice in improving the coding ..
How to use bulk in multiple cursors !!
;-) -
Cannot figure out why "ORA-01000 Maximum open cursors" is shown...
Hello there ...
I am programming a PL/SQL Code that is throwing 0RA-01000 Maximum Open Cursors Exceeded.
Having already read quite a lot about ORA-01000 errors, I know I should be closing cursors, and have already tried setting OPEN_CURSORS parameter to a high number (1000).
I declared a lot of procedures in my pl/sql, each of which uses one cursor since i am working with a non-Oracle table linked by ODBC ... and each procedure sometimes does thousands of inserts -- but all WITHIN the explicit cursors. The explicit cursors are not declared within each loop.
I already checked the code many times, and made sure all open cursors are closed. In addition, I also verified the numberopen cursors generated by the PL/SQL by running the following SQL after every procedure i run... and outputting it... and it appears the value just keeps on increasing, even though I had explicitly closed all the cursors in all the earlier procedures.
What is funny is that the most number of cursors reported by the code below only hits 150+ cursors. Nowhere near the 1000 open_cursors limit per session.
select a.value into strtxt --, b.name
from v$mystat a, v$statname b
where a.statistic# = b.statistic#
and a.statistic#= 3;When I run the procedures separately though, all the procedures run smoothly (even when I had not yet updated the open_cursors parameter).
I was thinking of the following, but maybe you have some other ideas?
Does this have anything to do with my procedures not being stored procedures?
Or should i be committing records within my procedures instead of out of it?
I really have run into a wall and would really appreciate any tips or helps on this. Thanks in advance!
My basic pl/sql code looks like below. I did not give the actual details cause it will be too long (up to 5000 lines).
DECLARE
PROCEDURE proc1
IS
CURSOR cur_hca
is
select ...from..where;
TYPE cur_hca_fetch
Is TABLE OF cur_hca%ROWTYPE
INDEX BY PLS_INTEGER;
temp_collect cur_hca_fetch;
BEGIN
open cur_hca; --cur_hca is the cursor name.
--i use exactly the same cursor name in the other procedures
loop
fetch cur_hca bulk collect into temp_collect LIMIT 1000;
exit when temp_collect.count=0
for indx in 1 .. temp_collect.count
loop
...run some sql
end loop;
end loop;
close cur_hca;
END proc1;
PROCEDURE proc2 --almost the same as above the only changes are the query for the
-- cursor and the sql that happens for each record
IS
BEGIN
open cur_hca; --cur_hca is my cursor name
loop
end loop;
close cur_hca;
END proc2;
... up to 40 other very similar procedures
BEGIN
proc1;
commit;
select a.value into strtxt
from v$mystat a, v$statname b
where a.statistic# = b.statistic#
and a.statistic#= 3;
DBMS_OUTPUT.PUT_LINE('Number of Cursors After STATUSproc1: ' || strtxt);
proc2;
commit;
select a.value into strtxt
from v$mystat a, v$statname b
where a.statistic# = b.statistic#
and a.statistic#= 3;
DBMS_OUTPUT.PUT_LINE('Number of Cursors After STATUSproc2: ' || strtxt);
... 40 other procedures
END;Edited by: user4872285 on May 6, 2013 6:49 PM
Edited by: user4872285 on May 6, 2013 7:01 PM
Edited by: user4872285 on May 6, 2013 8:02 PM
Edited by: user4872285 on May 6, 2013 8:03 PMPL/SQL code usually leaks reference cursors and DBMS_SQL cursors - as the ref cursor/DBMS_SQL interface used has a global (session static) scope.
PL/SQL has an intelligent garbage collector that will close local implicit and explicit cursors, when the cursor variable goes out of scope.
If you define an explicit cursor globally (package interface), then it can only be opened once. The 2nd attempt results in a ORA-06511: PL/SQL: cursor already open exception. So code cannot leak explicit cursors as code cannot reopen an existing opened explicit cursor.
I have never seen Oracle leaking cursors internally. So I would be hesitant to call what you are seeing, a bug. If your code is using explicit cursors (even static/global ones), your code cannot leak these cursors, even if your code does not close them. Worse case - the cursor remains open, however new copies cannot be created while it is open.
So I think your are looking at the wrong thing - explicit cursors. These are not the cursors that are leaking in my view (simply because code cannot reuse and open an already opened explicit cursor). Here is an example:
SQL> show parameter cursors
NAME TYPE VALUE
open_cursors integer 300
session_cached_cursors integer 50
// procedure that seems to "leak" an explicit cursor handle
// as it does not explicitly closes the handle
SQL> create or replace procedure CursorUse is
2 cursor c is select e.* from emp e;
3 empRow emp%RowType;
4 begin
5 open c;
6 fetch c into empRow;
7 --// not closing explicit cursor handle
8 --// and going out-of-scope
9 end;
10 /
Procedure created.
// current session stats
SQL> select b.name, a.value from v$mystat a, v$statname b where a.statistic# = b.statistic# and b.name like '%open%cursor%';
NAME VALUE
opened cursors cumulative 91
opened cursors current 2
// execute proc that "leaks" a cursor, 10000 times
SQL> begin
2 for i in 1..10000 loop
3 CursorUse;
4 end loop;
5 end;
6 /
PL/SQL procedure successfully completed.
// no errors due to cursor leakage
// session stats: no cursor leakage occurred as
// PL/SQL's garbage collector cleaned (and closed)
// cursor handles when these became out-of-scope
SQL> select b.name, a.value from v$mystat a, v$statname b where a.statistic# = b.statistic# and b.name like '%open%cursor%';
NAME VALUE
opened cursors cumulative 10,095
opened cursors current 2
SQL> So the cursor leakage you are seeing is caused by something else... so what else is part of the code, or the session, that you have not yet mentioned? -
More on "maximum open cursors exceeded"
It seems a lot of people have been seeing this error message, but reading through the posts on the topic hasn't given me any new insight on the problem. Here's an account of my particular situation:
I am using the XSQL servlet, v.1.0.0.0 with the thin jdbc driver v.1.x. The servlet is running within an Apache server (1.3.12) on a Linux box, and the Oracle database (8.1.5) is located on a Solaris 2.6 machine.
The servlet accepts HTTP connections, performs the corresponding SQL queries and returns the output from the database to the HTTP client. Here's a simple example:
(Sorry about potential bad line breaks.)
client request:
% telnet xsql-host.some.domain 80
Trying xxx.xxx.xxx.xxx
Connected to xsql-host.some.domain.
GET /xsql/test/listall.xsql
<server response here>
listall.xsql:
<?xml version="1.0"?>
<page connection="boss" xmlns:xsql="urn:oracle-xsql">
<accounts>
<xsql:query tag-case="lower" rowset-element="" row-element="accountinfo">
select * from test
</xsql:query>
</accounts>
</page>
Very simple stuff indeed. Now, this has worked perfectly for 3 weeks or so. During this period, the xsql servlet has been stopped and restarted numerous times and the machine hosting the database has been rebooted at least three times. Then, for no apparent reason (as nothing had changed in the setup described above), I started getting "maximum open cursors exceeded" on every request. Since then, I have been unable to get the system working as it had up until now. I haven't restarted the database and I would like to avoid doing so, because that would not be a valid solution for us if the problem reappeared in production. The maximum open cursors setting in Oracle should be correct, since things were running smoothly before.
From what I can see, the problem could be with the servlet not closing its cursors. One post mentioned that it did, but I would appreciate it if this could be double-checked. Considering the database is the only portion of the system which has been kept running for extended periods of time, it seems to me that this might indeed be the problem.
Confirmation, workarounds, suggestions, patches, or a consolation box of chocolates would all be appreciated.
Thanks,
- Fad
([email protected])
nullCheck which process is making all the cursors on which database. If it is your procedure, try explicitly closing the cursors. I think the cursors are only implicitely closed after the transaction is ended. If you loop and open a cursor within the loop, that might be the problem.
I also had this problem with Java working over a JDBC connection some time ago on a 815 database. If I recall correctly, that was caused by the JDBC driver and fixed by replacing it with a JDBC driver of 9i.
The following script is what I used previously in a program that can draw a graph from the results. It is ugly, but does the job.
Hope this helps,
L.
select
'max cursors',
to_number(value)
from
v$parameter
where
name = 'open_cursors'
union
select
substr(lower(username),1,10)||'('||substr(to_char(ses.sid)||','
||to_char(serial#),1,9)||')',
s.value
from
v$sesstat s,
v$statname n,
v$session ses
where
s.statistic#=n.statistic#
and ses.sid=s.sid
and n.name like '%cursor%'
and n.name like '%current%'
and not (ses.sid between 1 and 6) -
TOO many OPEN CURSORS during loop of INSERT's
Running ODP.NET beta2 (can't move up yet but will do that soon)
I don't think it is related with ODP itself but probably on how .Net works with cursors. We have a for/next loop that executes INSERT INTO xxx VALUES (:a,:b,:c)
statements. Apparently, when monitoring v$sysstat (current open cursors) we see these raising with 1 INSERT = 1 cursor. If subsequently we try to perform another action, we get max cursors exceeded. We allready set open_cursor = 1000, but the number of inserts can be very high. Is there a way to release these cursors (already wrote oDataAdaptor.dispose, oCmd.dispose but this does not help.
Is it normal that each INSERT has it's own cursor ? they all have the same hashvalue in v$open_cursor. They seem to be released after a while, especially when moving to another asp.net page, but it's not clear when that happens and if it is possible to force the release of the (implicit?) cursors faster.
Below is a snippet of the code, I unrolled a couple of function-calls into the code so this is just an example, not sure it will run without errors like this, but the idea should be clear (the code looks rather complex for what it does but the unrolled functions make the code more generic and we have a database-independend datalayer):
Try
' Set the Base Delete statement
lBaseSql = _
"INSERT INTO atable(col1,col2,col3) " & _
"VALUES(:col1,:col2,:col3)"
' Initialize a transaction
lTransaction = oConnection.BeginTransaction()
' Create the parameter collection, containing for each
' row in the list the arguments
For Each lDataRow In aList.Rows
lOracleParamters = New OracleParameterCollection()
lOracleParameter = New OracleParameter("luserid", OracleDbType.Varchar2,
_ CType(aCol1, Object))
lOracleParamters.Add(lOracleParameter)
lOracleParameter = New OracleParameter("part_no", OracleDbType.Varchar2, _
CType(lDataRow.Item("col2"), Object))
lOracleParamters.Add(lOracleParameter)
lOracleParameter = New OracleParameter("revision", OracleDbType.Int32, _
CType(lDataRow.Item("col3"), Object))
lOracleParamters.Add(lOracleParameter)
' Execute the Statement;
' If the execution fails because the row already exists,
' then the insert should be considered as succesfull.
Try
Dim aCommand As New OracleCommand()
Dim retval As Integer
'associate the aConnection with the aCommand
aCommand.Connection = oConnection
'set the aCommand text (stored procedure name or SQL statement)
aCommand.CommandText = lBaseSQL
'set the aCommand type
aCommand.CommandType = CommandType.Text
'attach the aCommand parameters if they are provided
If Not (lOracleParameters Is Nothing) Then
Dim lParameter As OracleParameter
For Each lParameter In lOracleParameters
'check for derived output value with no value assigned
If lParameter.Direction = ParameterDirection.InputOutput _
And lParameter.Value Is Nothing Then
lParameter.Value = Nothing
End If
aCommand.Parameters.Add(lParameter)
Next lParameter
End If
Return
' finally, execute the aCommand.
retval = cmd.ExecuteNonQuery()
' detach the OracleParameters from the aCommand object,
' so they can be used again
cmd.Parameters.Clear()
Catch ex As Exception
Dim lErrorMsg As String
lErrorMsg = ex.ToString
If Not lTransaction Is Nothing Then
lTransaction.Rollback()
End If
End Try
Next
lTransaction.Commit()
Catch ex As Exception
lTransaction.Rollback()
Throw New DLDataException(aConnection, ex)
End TryI have run into this problem as well. To my mind
Phillip's solution will work but seems completey unnecessary. This is work the provider itself should be managing.
I've done extensive testing with both ODP and OracleClient. Here is one of the scenarios: In a tight loop of 10,000 records, each of which is either going to be inserted or updated via a stored procedure call, the ODP provider throws the "too many cursor errors at around the 800th iteration. With over 300 cursors being open. The exact same code with OracleClient as the provider never throws an error and opens up 40+ cursors during execution.
The applicaation I have updates a Oracle8i database from a DB2 database. There are over 30 tables being updated in near real time. Reusing the command object is not an option and adding all the code Phillip did for each call seems highly unnecessary. I say Oracle needs to fix this problem. As much as I hate to say it the microsoft provider seems superior at this point. -
Hi ,
In a procedure ,
I have a cursor query which gets me the sum of a sum(to_number(field_value1) grouped on a list of other fields.The datatype of that field_value1 is varchar2
It has been running fine till now.But somehow , some non-numeric characters have been entered into this field.
As a result the query is failing.
I want the value of the other field for which the query is failing.
What happens is the open is successful(The sqlcode after open cursor is 0 , but actually the cursor%found is false)
The program continues into the fetch loop and jumps to the exception handler where I get the correct error which is 1722 Invalid number.
I am not in a position to get exactly for which row the fetch is failing.
Also , we are dealing with a huge volume of data , approximately (10000000) after grouping , so can't think of ungrouping the query and checking the value explicitly.
Please Help.
Thanks.Hi,
I have created a stored function for handling this issue.
Just check this code i have written the value in a file.
=======================================
CREATE OR REPLACE FUNCTION Chk_Number(S VARCHAR2) RETURN NUMBER is
J VARCHAR2(10);
FP UTL_FILE.FILE_TYPE;
BEGIN
J:=to_NUMBER(S);
RETURN J;
exception
WHEN VALUE_ERROR THEN
FP := UTL_FILE.FOPEN('/tmp','tmpt0','w');
UTL_FILE.PUT_LINE(FP,S);
UTL_FILE.FCLOSE(FP);
RETURN 0;
END;
=======================
DECLARE
CURSOR C1 is select sum(Chk_Number(no)) NO
from abc;
BEGIN
FOR R1 in C1
LOOP
DBMS_OUTPUT.PUT_LINE(R1.NO);
END LOOP;
END;
This is one of the way.
vinod -
Maximum open cursors exceeded!!!
Hi All,
While executing a procedure am getting this error:
Error: ORA-00604: error occurred at recursive SQL level 1
ORA-01000: maximum open cursors exceeded
Could you please guide me how to get rid of this kind of error and how to close all open cursors together.
Thanks in Advance
APam running a procedure on sqldeveloper and i think statement which is causing problem is:
RLD is cursor
in the procedure am checking
open rld;
if RLD%found then
begin
end;
end if;
close rld;
if i comment IF CONDITION then procedure works fine.. -
Maximum open cursors exceeded when inserting to a remote db
I receive the error:
ORA-01000: maximum open cursors exceeded
ORA-02063: preceding line
from ONTARIO
(where ONTARIO is my remote db) when I am performing inserts from a pl/sql procedure to the remote db. I am performing two inserts from inside pl/sql and then issuing an explicit commit. I checked the open_cursors init param on both the local db and remote db and it was set to 300. I bumped up the remote db init param to 600. I was able to perform more inserts but still received this error.
I thought implicit cursors close themselves, especially after a commit. Do I need to do something special to close the cursors on the remote machine?
Thanks for your time...Check which process is making all the cursors on which database. If it is your procedure, try explicitly closing the cursors. I think the cursors are only implicitely closed after the transaction is ended. If you loop and open a cursor within the loop, that might be the problem.
I also had this problem with Java working over a JDBC connection some time ago on a 815 database. If I recall correctly, that was caused by the JDBC driver and fixed by replacing it with a JDBC driver of 9i.
The following script is what I used previously in a program that can draw a graph from the results. It is ugly, but does the job.
Hope this helps,
L.
select
'max cursors',
to_number(value)
from
v$parameter
where
name = 'open_cursors'
union
select
substr(lower(username),1,10)||'('||substr(to_char(ses.sid)||','
||to_char(serial#),1,9)||')',
s.value
from
v$sesstat s,
v$statname n,
v$session ses
where
s.statistic#=n.statistic#
and ses.sid=s.sid
and n.name like '%cursor%'
and n.name like '%current%'
and not (ses.sid between 1 and 6) -
Maximum open Cursors Excedded error - for every transaction
Hi All,
I am getting the maximum opn cursors exceeded error suddenly for every single db transaction i am trying to make in my application. this did not happen previously during my developemnt and testing phase.
I have a question here that i tried to google but failed to get satisfactory answer.:-
When we use a cursor in the stored procedure to fetch data, how to make oracle automatically close the cursors once the stored proc finishes executin. Or is there something i have to follow other with my current open cursors limit to ensure this problem does not happen?
Thanks,
ChaitanyaHi Justin,
My oracle stored procs are called by java framework. In each place i was closing the connection object but there were a few places where i was not closing the resultset object which directly pointed to my oracle cursor.
I have closed the objects in such places and tried again but still i am getting the same error. Mit it be an instance where the oracle db is not allowing me to connect to it at all. Something like restarting it would help? Restarting the server where the oracle software is hosted.
Please excuse my blatant ignorance in this issue.
Thanks,
Chaitanya -
In java/jsp got Error,ORA-01000: maximum open cursors exceeded,
Dear ALL,
We are facing a problem of in java/jsp. ORA-01000: maximum open cursors exceeded,We are using referance Cursor for returing the Record in java file.
The Code is given below.
import java.sql.*;
import javax.sql.*;
import com.india.trade.dbConnection.*;
import oracle.jdbc.driver.*;
import java.util.Vector ;
public class IntRmsActivity
private static JDBCConnection instance = null;
private static Connection con = null;
private static CallableStatement stmt_admin_getadmins = null;
private static String str_admin_getadmins = "{ call Admin_conf.RMS_ADMIN_GETALLADMINS(?,?) }";
static
try
instance = new JDBCConnection();
con = instance.getConnection();
stmt_admin_getadmins = con.prepareCall(str_admin_getadmins);
}catch(Exception se){se.printStackTrace();}
public static Vector admin_getAdmins() throws Exception
checkconnection();
String message = null;
Vector v_admins = new Vector();
ResultSet rs_admins = null;
stmt_admin_getadmins.registerOutParameter(1 , OracleTypes.CURSOR);
stmt_admin_getadmins.registerOutParameter(2 , Types.VARCHAR);
stmt_admin_getadmins.execute();
message = stmt_admin_getadmins.getString(2);
System.out.println("message " + message);
rs_admins = ((OracleCallableStatement)stmt_admin_getadmins).getCursor(1);
while (rs_admins.next())
v_admins.addElement(rs_admins.getString("adminid"));
rs_admins.close();
return v_admins;
CREATE OR REPLACE PACKAGE Admin_conf IS
TYPE REF_CRSR IS REF CURSOR; /* OUTPUT CURSOR VARIABLE TYPE */
PROCEDURE RMS_ADMIN_GETALLADMINS(RESULTS OUT REF_CRSR,
OUT_MESSAGE OUT VARCHAR2);
END Admin_conf;
CREATE OR REPLACE PACKAGE BODY Admin_conf
IS
PROCEDURE RMS_ADMIN_GETALLADMINS(RESULTS OUT REF_CRSR,
OUT_MESSAGE OUT VARCHAR2)
IS
l_ref_out_crsr REF_CRSR;
BEGIN
OPEN l_ref_out_crsr FOR
SELECT EXECUTIVE_ID adminid
FROM MASTER_EXECUTIVE_ID
ORDER BY EXECUTIVE_ID;
OUT_MESSAGE := 'ADMIN IDS FETCHED SUCCESSFULLY';
RESULTS := l_ref_out_crsr;
EXCEPTION WHEN OTHERS THEN
OUT_MESSAGE := 'ERROR ' || SUBSTR(SQLERRM, 1, 60);
END RMS_ADMIN_GETALLADMINS;
END Admin_conf;
Regards
Ajay Singh RathodAre you actually closing the connections, resultsets in all cases?
From what you've posted you call
rs_admins.close();but in that method, you propagate any exceptions that occur out to the caller method, which in turn just prints a stack trace.
So if an exception occurs before you call the rs_admin.close() the result set will never be closed as the statement won't be reached.
I'd add a speific exception handling routine to the admin_getAdmins() method and include a finally clause to close the result set in all cases. You can still onthrow the exception if you want.
cheers
-steve- -
Help needed, getting ORA-01000: maximum open cursors exceeded
CJ or anyone that may have come across this problem in the past, I hope that you may be able to help me
I am trying to implement a function from the Salesforce PHP tool kit that runs against a class that returns a object of ID's that have been updated in a given time frame.
This is a lot of code. I am sorry for that:
<?php
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
//Keep the SOAP cache clean
ini_set("soap.wsdl_cache_enabled","0");
$delete_count = 0;
$oracle_deleted = 0;
//Setup array for local ID's'
$opportunity_data = array();
$deleted_data = array();
//start setup for PL SQL statement
$strsql = "begin mapsapp.sforce_opp_insert(";
$strsql .= ":pm_id,";
$strsql .= ":pm_accountid,";
$strsql .= ":pm_name,";
$strsql .= ":pm_description,";
$strsql .= ":pm_stagename,";
$strsql .= ":pm_amount,";
$strsql .= ":pm_probability,";
$strsql .= ":pm_expectedrevenue,";
$strsql .= ":pm_closedate,";
$strsql .= ":pm_type,";
$strsql .= ":pm_nextstep,";
$strsql .= ":pm_leadsource,";
$strsql .= ":pm_isclosed,";
$strsql .= ":pm_iswon,";
$strsql .= ":pm_forecastcategory,";
$strsql .= ":pm_campaignid,";
$strsql .= ":pm_hasopportunitylineitem,";
$strsql .= ":pm_pricebook2id,";
$strsql .= ":pm_ownerid,";
$strsql .= ":pm_createddate,";
$strsql .= ":pm_createdbyid,";
$strsql .= ":pm_lastmodifieddate,";
$strsql .= ":pm_lastmodifiedbyid,";
$strsql .= ":pm_systemmodstamp,";
$strsql .= ":pm_rsm_project_id_score__c,";
$strsql .= ":pm_lead_fae__c,";
$strsql .= ":pm_avg_annual_volume__c,";
$strsql .= ":pm_priority__c,";
$strsql .= ":pm_design_start_date__c,";
$strsql .= ":pm_design_proto_date__c,";
$strsql .= ":pm_production_years__c,";
$strsql .= ":pm_production_life_months__c,";
$strsql .= ":pm_production_months__c,";
$strsql .= ":pm_design_freeze_date__c,";
$strsql .= ":pm_production_proto_date__c,";
$strsql .= ":pm_mass_production_date__c,";
$strsql .= ":pm_fae_status__c,";
$strsql .= ":pm_fae_assigned_date__c,";
$strsql .= ":pm_fae_accepted_date__c,";
$strsql .= ":pm_potential__c,";
$strsql .= ":pm_fae_reject_reason__c,";
$strsql .= ":pm_fae_project_complexity__c,";
$strsql .= ":pm_design_phase__c,";
$strsql .= ":pm_maxim_id__c,";
$strsql .= ":pm_project_number__c,";
$strsql .= ":pm_active__c,";
$strsql .= ":pm_pivotal_created_by__c,";
$strsql .= ":pm_manufactured_by__c,";
$strsql .= ":pm_isdeleted,";
$strsql .= ":pm_lastactivitydate";
$strsql .= "); end;";
//end setup for PL SQL statement
//include common files
require_once ('/users/msimonds/public_html/includes/sfdc.inc');
include_once ('adodb.inc.php');
$db = ADONewConnection("oci8");
//connect to Oracle
$db->Connect('',"database_user","password","dev2");
//$db->BeginTrans();
$db->SetFetchMode(ADODB_FETCH_ASSOC);
if ($db)
try
//Set current time to get records from Salesforce
$currentTime = mktime();
// assume that update occured within the last 24 hrs.
$startTime = $currentTime - (60 * 60 * 36); //(seconds * minutes * hours)
$endTime = $currentTime;
echo "***** Get Updated Opportunities from the last 24 hours *****<br />";
$getUpdateddResponse = $client->getUpdated('Opportunity',$startTime,$endTime);
//$getUpdateddResponse->ids = "";
//echo '<pre>'.print_r($getUpdateddResponse,true).'</pre>';
//exit;
$opportunity_data = $getUpdateddResponse->ids;
if (is_array($opportunity_data) || is_object($opportunity_data))
set_time_limit(0);
ini_set("memory_limit","512M");
//copy data from Object to local array
//count the number of records coming in from Salesforce
$record_count = count($opportunity_data);
echo $record_count;
exit;
//echo '<pre>'.print_r($opportunity_data,true).'</pre>';
//exit;
//loop through the records
for ($i = 0; $i < $record_count; $i++)
$id = $opportunity_data[$i];
//SQL query for Salesforce
$soql = "Select Id, IsDeleted, AccountId, Name, Description, StageName, Amount, Probability, ExpectedRevenue, CloseDate, Type, NextStep, LeadSource, IsClosed, IsWon, ForecastCategory, CampaignId, HasOpportunityLineItem, Pricebook2Id, OwnerId, CreatedDate, CreatedById, LastModifiedDate, LastModifiedById, SystemModstamp, LastActivityDate, RSM_Original_Project_ID_Score__c, Lead_FAE__c, Avg_Annual_Volume__c, Priority__c, Design_Start_Date__c, Design_Proto_Date__c, Production_Years__c, Production_Life_months__c, Production_Months__c, Design_Freeze_Date__c, Production_Proto_Date__c, Mass_Production_Date__c, FAE_Status__c, FAE_Assigned_Date__c, FAE_Accepted_Date__c, Project_Potential__c, FAE_Reject_Reason__c, FAE_Project_Complexity__c, Design_Phase__c, maxim_id__c, Project_Number__c, Active__c, Project_Comments__c, Pivotal_Created_By__c, Manufactured_By__c FROM Opportunity WHERE Id = '{$id}'";
//setup query to local Oracle MAPS database
$get_oracle_record = query_db($id,$db);
if ($get_oracle_record)
$sql = "DELETE FROM sforce_opportunity WHERE ID = '{$id}'";
if ($db->Execute($sql)) ;
$insert_records = get_records($client,$soql);
else
$insert_records = get_records($client,$soql);
foreach ($insert_records as $r)
$pass_this['id'] = $id;
$pass_this['accountid'] = (string )$r->fields->AccountId;
$pass_this['name'] = (string )$r->fields->Name;
$pass_this['description'] = (string )$r->fields->Description;
$pass_this['stagename'] = (string )$r->fields->StageName;
$pass_this['amount'] = (int)$r->fields->Amount;
$pass_this['probability'] = (int)$r->fields->Probability;
$pass_this['expectedrevenue'] = (int)$r->fields->ExpectedRevenue;
$pass_this['closedate'] = (string )$r->fields->CloseDate;
$pass_this['type'] = (string )$r->fields->Type;
$pass_this['nextstep'] = (string )$r->fields->NextStep;
$pass_this['leadsource'] = (string )$r->fields->LeadSource;
$pass_this['isclosed'] = (string )$r->fields->IsClosed;
$pass_this['iswon'] = (string )$r->fields->IsWon;
$pass_this['forecastcategory'] = (string )$r->fields->ForecastCategory;
$pass_this['campaignid'] = (string )$r->fields->CampaignId;
$pass_this['hasopportunitylineitem'] = (string )$r->fields->HasOpportunityLineItem;
$pass_this['pricebook2id'] = $r->fields->Pricebook2Id;
$pass_this['ownerid'] = $r->fields->OwnerId;
$pass_this['createddate'] = (string )$r->fields->CreatedDate;
$pass_this['createdbyid'] = (string )$r->fields->CreatedById;
$pass_this['lastmodifieddate'] = (string )$r->fields->LastModifiedDate;
$pass_this['lastmodifiedbyid'] = (string )$r->fields->LastModifiedById;
$pass_this['systemmodstamp'] = (string )$r->fields->SystemModstamp;
$pass_this['rsm_project_id_score__c'] = (int)$r->fields->RSM_Original_Project_ID_Score__c;
$pass_this['lead_fae__c'] = (string )$r->fields->Lead_FAE__c;
$pass_this['avg_annual_volume__c'] = (int)$r->fields->Avg_Annual_Volume__c;
$pass_this['priority__c'] = (string )$r->fields->Priority__c;
$pass_this['design_start_date__c'] = (string )$r->fields->Design_Start_Date__c;
$pass_this['design_proto_date__c'] = (string )$r->fields->Design_Proto_Date__c;
$pass_this['production_years__c'] = (int)$r->fields->Production_Years__c;
$pass_this['production_life_months__c'] = (int)$r->fields->Production_Life_months__c;
$pass_this['production_months__c'] = (int)$r->fields->Production_Months__c;
$pass_this['design_freeze_date__c'] = (string )$r->fields->Design_Freeze_Date__c;
$pass_this['production_proto_date__c'] = (string )$r->fields->Production_Proto_Date__c;
$pass_this['mass_production_date__c'] = (string )$r->fields->Mass_Production_Date__c;
$pass_this['fae_status__c'] = (string )$r->fields->FAE_Status__c;
$pass_this['fae_assigned_date__c'] = (string )$r->fields->FAE_Assigned_Date__c;
$pass_this['fae_accepted_date__c'] = (string )$r->fields->FAE_Accepted_Date__c;
$pass_this['project_potential__c'] = (int)$r->fields->Project_Potential__c;
$pass_this['fae_reject_reason__c'] = (string )$r->fields->FAE_Reject_Reason__c;
$pass_this['fae_project_complexity__c'] = (string )$r->fields->FAE_Project_Complexity__c;
$pass_this['design_phase__c'] = (string )$r->fields->Design_Phase__c;
$pass_this['maxim_id__c'] = (string )$r->fields->maxim_id__c;
$pass_this['objective_status_next_qtr__c'] = (string )$r->fields->Objective_Status_Next_Qtr__c;
$pass_this['quality_of_relationship__c'] = (string )$r->fields->Quality_of_Relationship__c;
$pass_this['targeted_po_date__c'] = (string )$r->fields->Targeted_PO_Date__c;
$pass_this['part_no_involved__c'] = (string )$r->fields->Part_No_Involved__c;
$pass_this['first_po_number__c'] = (string )$r->fields->First_PO_Number__c;
$pass_this['lost_reason__c'] = (string )$r->fields->Lost_Reason__c;
$pass_this['fae_estimate_of_business__c'] = (string )$r->fields->FAE_Estimate_of_Business__c;
$pass_this['digital_processor__c'] = (string )$r->fields->Digital_Processor__c;
$pass_this['project_number__c'] = (string )$r->fields->Project_Number__c;
$pass_this['active__c'] = (string )$r->fields->Active__c;
$pass_this['pivotal_created_by__c'] = (string )$r->fields->Pivotal_Created_By__c;
$pass_this['manufactured_by__c'] = (string )$r->fields->Manufactured_By__c;
$pass_this['isdeleted'] = (string )$r->fields->IsDeleted;
$pass_this['lastactivitydate'] = (string )$r->fields->LastActivityDate;
$pass_this['optocon_id__c'] = (string )$r->fields->OptoCon_ID__c;
if (strlen($pass_this['description']) == 0)
$pass_this['description'] = "No Description Posted";
else
$pass_this['description'] = $pass_this['description'];
//echo '<pre>'.print_r($pass_this,true).'</pre>';
//exit;
$record_inserted = insert_record($pass_this,$strsql,$db);
if (!$record_inserted)
//mail('[email protected]','insert error','There was a proble trying to insert a record into the database');
else
echo "Nothing here";
//exit;
//add back in once replication is done
//get deleted records from the Opportunity
$getDeletedResponse = $client->getDeleted('Opportunity',$startTime,$endTime);
//echo '<pre>'.print_r($getDeletedResponse,true).'</pre>';
//exit;
$deleted_ids = $getDeletedResponse->deletedRecords;
//echo '<pre>'.print_r($deleted_ids,true).'</pre>';
if (is_object($deleted_ids))
$temp_array[] = $deleted_ids;
unset($deleted_ids);
$deleted_ids = $temp_array;
$delete_count = count($deleted_ids);
//echo $delete_count;
for ($i = 0; $i < $delete_count; $i++)
$d_id = $deleted_ids[$i];
$id = $d_id->id;
if (query_db($id,$db))
$delete_sql = "Delete from sforce_opportunity WHERE ID = '{$id}'";
$oracle_deleted++;
if ($db->Execute($delete_sql))
echo "<font color=\"#0000FF\">".$id." was removed from the Oracle database</font><br />";
else
echo $id." is not in the Oracle database<br />";
echo $oracle_deleted." records were deleted from Oracle";
catch (exception $e)
$error = '<pre>'.print_r($e,true).'</pre>';
mail('[email protected]','insert error',$error);
$db->CommitTrans();
$db->Close();
exit;
function insert_record($pass_this,$strsql,&$db)
//Prepares PL/SQL Statement
$stmt = $db->Prepare($strsql);
$db->InParameter($stmt,$pass_this['id'],'pm_id');
$db->InParameter($stmt,$pass_this['accountid'],'pm_accountid');
$db->InParameter($stmt,$pass_this['name'],'pm_name');
$db->InParameter($stmt,$pass_this['description'],'pm_description',-1,OCI_B_CLOB);
$db->InParameter($stmt,$pass_this['stagename'],'pm_stagename');
$db->InParameter($stmt,$pass_this['amount'],'pm_amount');
$db->InParameter($stmt,$pass_this['probability'],'pm_probability');
$db->InParameter($stmt,$pass_this['expectedrevenue'],'pm_expectedrevenue');
$db->InParameter($stmt,$pass_this['closedate'],'pm_closedate');
$db->InParameter($stmt,$pass_this['type'],'pm_type');
$db->InParameter($stmt,$pass_this['nextstep'],'pm_nextstep');
$db->InParameter($stmt,$pass_this['leadsource'],'pm_leadsource');
$db->InParameter($stmt,$pass_this['isclosed'],'pm_isclosed');
$db->InParameter($stmt,$pass_this['iswon'],'pm_iswon');
$db->InParameter($stmt,$pass_this['forecastcategory'],'pm_forecastcategory');
$db->InParameter($stmt,$pass_this['campaignid'],'pm_campaignid');
$db->InParameter($stmt,$pass_this['hasopportunitylineitem'],'pm_hasopportunitylineitem');
$db->InParameter($stmt,$pass_this['pricebook2id'],'pm_pricebook2id');
$db->InParameter($stmt,$pass_this['ownerid'],'pm_ownerid');
$db->InParameter($stmt,$pass_this['createddate'],'pm_createddate');
$db->InParameter($stmt,$pass_this['createdbyid'],'pm_createdbyid');
$db->InParameter($stmt,$pass_this['lastmodifieddate'],'pm_lastmodifieddate');
$db->InParameter($stmt,$pass_this['lastmodifiedbyid'],'pm_lastmodifiedbyid');
$db->InParameter($stmt,$pass_this['systemmodstamp'],'pm_systemmodstamp');
$db->InParameter($stmt,$pass_this['rsm_project_id_score__c'],'pm_rsm_project_id_score__c');
$db->InParameter($stmt,$pass_this['lead_fae__c'],'pm_lead_fae__c');
$db->InParameter($stmt,$pass_this['avg_annual_volume__c'],'pm_avg_annual_volume__c');
$db->InParameter($stmt,$pass_this['priority__c'],'pm_priority__c');
$db->InParameter($stmt,$pass_this['design_start_date__c'],'pm_design_start_date__c');
$db->InParameter($stmt,$pass_this['design_proto_date__c'],'pm_design_proto_date__c');
$db->InParameter($stmt,$pass_this['production_years__c'],'pm_production_years__c');
$db->InParameter($stmt,$pass_this['production_life_months__c'],'pm_production_life_months__c');
$db->InParameter($stmt,$pass_this['production_months__c'],'pm_production_months__c');
$db->InParameter($stmt,$pass_this['design_freeze_date__c'],'pm_design_freeze_date__c');
$db->InParameter($stmt,$pass_this['production_proto_date__c'],'pm_production_proto_date__c');
$db->InParameter($stmt,$pass_this['mass_production_date__c'],'pm_mass_production_date__c');
$db->InParameter($stmt,$pass_this['fae_status__c'],'pm_fae_status__c');
$db->InParameter($stmt,$pass_this['fae_assigned_date__c'],'pm_fae_assigned_date__c');
$db->InParameter($stmt,$pass_this['fae_accepted_date__c'],'pm_fae_accepted_date__c');
$db->InParameter($stmt,$pass_this['project_potential__c'],'pm_potential__c');
$db->InParameter($stmt,$pass_this['fae_reject_reason__c'],'pm_fae_reject_reason__c');
$db->InParameter($stmt,$pass_this['fae_project_complexity__c'],'pm_fae_project_complexity__c');
$db->InParameter($stmt,$pass_this['design_phase__c'],'pm_design_phase__c');
$db->InParameter($stmt,$pass_this['maxim_id__c'],'pm_maxim_id__c');
$db->InParameter($stmt,$pass_this['project_number__c'],'pm_project_number__c');
$db->InParameter($stmt,$pass_this['active__c'],'pm_active__c');
$db->InParameter($stmt,$pass_this['pivotal_created_by__c'],'pm_pivotal_created_by__c');
$db->InParameter($stmt,$pass_this['manufactured_by__c'],'pm_manufactured_by__c');
$db->InParameter($stmt,$pass_this['isdeleted'],'pm_isdeleted');
$db->InParameter($stmt,$pass_this['lastactivitydate'],'pm_lastactivitydate');
//executes and loads data coming from salesforce into table
if ($db->Execute($stmt))
echo $pass_this['id']." was inserted into the database<br />";
flush();
unset($pass_this);
unset($stmt);
return true;
else
echo $db->ErrorMsg()."<br>";
mail('[email protected]','database error',$db->ErrorMsg());
return false;
//Get the data from Salesforce to populate Oracle
function get_records(&$connection,&$query)
$queryOptions = new QueryOptions(2000);
$response = new QueryResult($connection->query($query));
// if the size is zero, where done
if ($response->size > 0)
$products = $response->records;
// Cycles through additional responses if the number of records
// exceeds the batch size
while (!$response->done)
set_time_limit(100);
$response = $connection->queryMore($response->queryLocator);
$products = array_merge($products,$response->records);
return $products;
function query_db($id,&$db)
global $db;
$sql = "SELECT *
FROM sforce_opportunity
Where id = '{$id}'";
$rs = $db->Execute($sql);
if ($rs && $rs->_numOfRows > 0)
return true;
else
return false;
exit;
?>the code runs fine and I do not commit my inserts until after I am done retrieving all the records, but I am getting the oracle error: ORA-01000: maximum open cursors exceeded
I am not using any cursors in my PL SQL
CREATE OR REPLACE PROCEDURE MAPSAPP.sforce_opp_insert (
pm_id IN VARCHAR2,
pm_accountid IN VARCHAR2,
pm_name IN VARCHAR2,
pm_description IN VARCHAR2,
pm_stagename IN VARCHAR2,
pm_amount IN NUMBER,
pm_probability IN NUMBER,
pm_expectedrevenue IN NUMBER,
pm_closedate IN VARCHAR2,
pm_type IN VARCHAR2,
pm_nextstep IN VARCHAR2,
pm_leadsource IN VARCHAR2,
pm_isclosed IN VARCHAR2,
pm_iswon IN VARCHAR2,
pm_forecastcategory IN VARCHAR2,
pm_campaignid IN VARCHAR2,
pm_hasopportunitylineitem IN VARCHAR2,
pm_pricebook2id IN VARCHAR2,
pm_ownerid IN VARCHAR2,
pm_createddate IN VARCHAR2,
pm_createdbyid IN VARCHAR2,
pm_lastmodifieddate IN VARCHAR2,
pm_lastmodifiedbyid IN VARCHAR2,
pm_systemmodstamp IN VARCHAR2,
pm_rsm_project_id_score__c IN VARCHAR2,
pm_lead_fae__c IN VARCHAR2,
pm_avg_annual_volume__c IN VARCHAR2,
pm_priority__c IN VARCHAR2,
pm_design_start_date__c IN VARCHAR2,
pm_design_proto_date__c IN VARCHAR2,
pm_production_years__c IN NUMBER,
pm_production_life_months__c IN NUMBER,
pm_production_months__c IN NUMBER,
pm_design_freeze_date__c IN VARCHAR2,
pm_production_proto_date__c IN VARCHAR2,
pm_mass_production_date__c IN VARCHAR2,
pm_fae_status__c IN VARCHAR2,
pm_fae_assigned_date__c IN VARCHAR2,
pm_fae_accepted_date__c IN VARCHAR2,
pm_potential__c IN NUMBER,
pm_fae_reject_reason__c IN VARCHAR2,
pm_fae_project_complexity__c IN VARCHAR2,
pm_design_phase__c IN VARCHAR2,
pm_maxim_id__c IN VARCHAR2,
pm_project_number__c IN VARCHAR2,
pm_active__c IN VARCHAR2,
pm_pivotal_created_by__c IN VARCHAR2,
pm_manufactured_by__c IN VARCHAR2,
pm_isdeleted IN VARCHAR2,
pm_lastactivitydate IN VARCHAR2
IS
BEGIN
INSERT INTO SFORCE_OPPORTUNITY
(id,
accountid,
name,
description,
stagename,
amount,
probability,
expectedrevenue,
closedate,
type,
nextstep,
leadsource,
isclosed,
iswon,
forecastcategory,
campaignid,
hasopportunitylineitem,
pricebook2id,
ownerid,
createddate,
createdbyid,
lastmodifieddate,
lastmodifiedbyid,
systemmodstamp,
rsm_project_id_score__c,
lead_fae__c,
avg_annual_volume__c,
priority__c,
design_start_date__c,
design_proto_date__c,
production_years__c,
production_life_months__c,
production_months__c,
design_freeze_date__c,
production_proto_date__c,
mass_production_date__c,
fae_status__c,
fae_assigned_date__c,
fae_accepted_date__c,
project_potential__c,
fae_reject_reason__c,
fae_project_complexity__c,
design_phase__c,
maxim_id__c,
project_number__c,
active__c,
pivotal_created_by__c,
manufactured_by__c,
isdeleted,
lastactivitydate
VALUES (pm_id,
pm_accountid,
pm_name,
pm_description,
pm_stagename,
pm_amount,
pm_probability,
pm_expectedrevenue,
TO_DATE (SUBSTR (REPLACE (pm_closedate, 'T', ' '), 1, 19),'YYYY-MM-DD HH24:MI:SS'),
pm_type,
pm_nextstep,
pm_leadsource,
pm_isclosed,
pm_iswon,
pm_forecastcategory,
pm_campaignid,
pm_hasopportunitylineitem,
pm_pricebook2id,
pm_ownerid,
TO_DATE (SUBSTR (REPLACE (pm_createddate, 'T', ' '), 1, 19),'YYYY-MM-DD HH24:MI:SS'),
pm_createdbyid,
TO_DATE (SUBSTR (REPLACE (pm_lastmodifieddate, 'T', ' '), 1, 19),'YYYY-MM-DD HH24:MI:SS'),
pm_lastmodifiedbyid,
TO_DATE (SUBSTR (REPLACE (pm_systemmodstamp, 'T', ' '), 1, 19),'YYYY-MM-DD HH24:MI:SS'),
pm_rsm_project_id_score__c,
pm_lead_fae__c,
pm_avg_annual_volume__c,
pm_priority__c,
TO_DATE (SUBSTR (REPLACE (pm_design_start_date__c, 'T', ' '), 1, 19),'YYYY-MM-DD HH24:MI:SS'),
TO_DATE (SUBSTR (REPLACE (pm_design_proto_date__c, 'T', ' '), 1, 19),'YYYY-MM-DD HH24:MI:SS'),
pm_production_years__c,
pm_production_life_months__c,
pm_production_months__c,
TO_DATE (SUBSTR (REPLACE (pm_design_freeze_date__c, 'T', ' '), 1, 19),'YYYY-MM-DD HH24:MI:SS'),
TO_DATE (SUBSTR (REPLACE (pm_production_proto_date__c, 'T', ' '), 1, 19),'YYYY-MM-DD HH24:MI:SS'),
TO_DATE (SUBSTR (REPLACE (pm_mass_production_date__c, 'T', ' '), 1, 19),'YYYY-MM-DD HH24:MI:SS'),
pm_fae_status__c,
TO_DATE (SUBSTR (REPLACE (pm_fae_assigned_date__c, 'T', ' '), 1, 19),'YYYY-MM-DD HH24:MI:SS'),
TO_DATE (SUBSTR (REPLACE (pm_fae_accepted_date__c, 'T', ' '), 1, 19),'YYYY-MM-DD HH24:MI:SS'),
pm_potential__c,
pm_fae_reject_reason__c,
pm_fae_project_complexity__c,
pm_design_phase__c,
pm_maxim_id__c,
pm_project_number__c,
pm_active__c,
pm_pivotal_created_by__c,
pm_manufactured_by__c,
pm_isdeleted,
TO_DATE (SUBSTR (REPLACE (pm_lastactivitydate, 'T', ' '), 1, 19),'YYYY-MM-DD HH24:MI:SS')
END sforce_opp_insert;
/I was wondering anyone has seen this before
TIA,
MikeThe code below is deleting fine. Check your $id is valid. I wonder if ADOdb has some quirks with binding and variable creation/destruction, similar to #1 in http://www.oracle.com/technology/tech/php/htdocs/php_troubleshooting_faq.html#bindvars
<?php
See ADOdb Tutorial for Oracle: http://phplens.com/lens/adodb/docs-oracle.htm
drop table mytab;
create table mytab (city varchar2(20), country_id varchar2(20));
insert into mytab values ('SF', 'US');
insert into mytab values ('Sydney', 'AU');
insert into mytab values ('London', 'UK');
commit;
require_once("/home/cjones/public_html/php/adodb5/adodb.inc.php");
$db = ADONewConnection("oci8");
$db->Connect("//localhost/XE", "hr", "hrpwd");
echo "Before:\n";
$rs = $db->Execute("select city from mytab");
while ($arr = $rs->FetchRow()) {
echo $arr['CITY'] . "\n";
$s = $db->Prepare("delete from mytab where country_id = :ci");
$db->Parameter($s, $ci, 'ci');
foreach (array('US', 'AU') as $ci) {
$db->Execute($s);
echo "After:\n";
$rs = $db->Execute("select city from mytab");
while ($arr = $rs->FetchRow()) {
echo $arr['CITY'] . "\n";
?>There's another sample in the ADOdb OCI8 driver:
Usage:
$stmt = $DB->Prepare("insert into table (col0, col1, col2) values (:0, :1, :2)");
$DB->Bind($stmt, $p1);
$DB->Bind($stmt, $p2);
$DB->Bind($stmt, $p3);
for ($i = 0; $i < $max; $i++) {
$p1 = ?; $p2 = ?; $p3 = ?;
$DB->Execute($stmt);
}For queries I know this works. I haven't seen any examples that prepare once.
$rs = $db->Execute("select city from mytab where country_id = :ci", array('ci' => 'UK'));
while ($arr = $rs->FetchRow()) {
echo $arr['CITY'] . "<br>\n";
} -
Hi,
I am using 10g and wanted to check if we can use a dynamic cursor in a procedure.
Following is my code and wanted to see if that can work with every query passed as a parameter.
example ,
exec test1 ('select col1, col2, col3 from table1','Two columns Sql')
exec test1 ('select col1 from table2','one columns Sql')
exec test1 ('select col1, col2, col3, col4, col5 from table3','Five columns Sql')
CREATE OR REPLACE procedure test1 (p_sql IN VARCHAR2, p_subject IN VARCHAR2
is
v_cu_string VARCHAR2(2000);
v_string VARCHAR2(2000);
v_sql VARCHAR2(4000);
v_head VARCHAR2(4000);
v_head_sql VARCHAR2(4000);
v_str_sql VARCHAR2(4000);
TYPE cv_typ IS REF CURSOR;
cv cv_typ;
begin
v_sql := p_sql;
OPEN cv FOR v_sql;
LOOP
FETCH cv INTO v_cu_string;
EXIT WHEN cv%NOTFOUND;
------ Processing steps
END LOOP;
CLOSE cv;
END;Thanksuser527060 wrote:
Following is my code and wanted to see if that can work with every query passed as a parameter.
Just curious as to why this is an improvement of
exec test1 ('select col1, col2, col3 from table1','Two columns Sql')
select col1, col2, col3 from table1And
exec test1 ('select col1 from table2','one columns Sql')
select col1 from table2And
exec test1 ('select col1, col2, col3, col4, col5 from table3','Five columns Sql')
select col1, col2, col3, col4, col5 from table3It needs more code from you to build, more code for anyone to enter to execute, limits selects to only one table I would guess also comes with less documentation than SQL.
http://download.oracle.com/docs/cd/E11882_01/server.112/e17118/toc.htm
Maybe you are looking for
-
Time Machine backup fails on external HD when sleeping
Hello, I have recently purchased a MBPw/RD and also purchased a WD My Passport for MAC to use with Time Machine. The reason that I purchased this drive is for the hardware encryption feature of the drive. Time Machine completes without error when the
-
InDesign CS6 print number of copies issue
Hello! I have a document that I needed 25 copies of, so I set the # of copies to 25 and off it went. No issue. However, now when I go to a different doc and I print, the # of copies stayed at 25 when I only needed 1. I have to remember to change the
-
Yosemite has slowed down my iMac and I would like to go back to factory settings. How can I do this without losing all my documents? I also don't have a copy of my old operating system. My iMac is an early 2009 and was running 10.6.8 (2gb ram)
-
ever since I installed Lion my internet connection comes and goes....have reported this to Apple Care who have helped me reset my connection but it is still happening...cant believe it is a fault of the ISP as my Iphone does not have this problem, no
-
Calculating directions (frozen)
Why is it that my program is frozen. I type in an address and click drive to, and then it calculates directions and doesn't move beyond that.