Okay I'm at a loss here and any suggestions / help is greatly appreciated.

If I run the SP code through SQL+ it will return records almost instantly (we're talking only 350 records returned here), but via the CF code the server (web) will either hang FOREVER or return the statement that the server is busy.

SERVER:  
- Compaq Proliant (not sure of the model I don't have access to the server)
- WIN 2000
- Over 1gig memory
- dual processor
- CF5 Ent

Database:
- Unix
- Oracle 9i
- not sure about the rest but I can find out if necessary (again I don't have access to the room containing the servers)

Here's the CF Code:

<cfstoredproc procedure="pkg_analysis.getGridAnswers" datasource="#mysession.dcname#" blockfactor=20>
<cfprocparam type="In" maxlength="10" cfsqltype="CF_SQL_INTEGER" value="#session.currentbase#">
<cfprocparam type="In" maxlength="10" cfsqltype="CF_SQL_INTEGER" value="#bq2.questionid#">
<cfprocparam type="In" maxlength="10" cfsqltype="CF_SQL_INTEGER" value="#URL.afid#">
<!--- CF5 adds an ascii value of 0 (not the digit 0, but the ascii value of 0) to string parameters.  It needs to be stripped off inside Oracle. --->
<cfprocparam type="In" cfsqltype="CF_SQL_LONGVARCHAR" value="#URL.searchvalue#" maxlength="4000">
<!--- this CF_SQL_REFCURSOR only works for cf5 and causes errors in MX --->
<cfif left(mysession.cfProductVersion,1) LT "6">
<!--- had to pull this out of because it doesn't compile on CF/MX --->
<cfprocparam type="Out" cfsqltype="CF_SQL_REFCURSOR" variable="Yo2" maxrows="-1">
</cfif>
<cfprocresult name="analysisgridanswers">
</cfstoredproc>

And here's the SP code:

CREATE OR REPLACE
PACKAGE BODY pkg_analysis
AS

  PROCEDURE getGridAnswers
   (pi_OrgId         IN     safiebsec.org.orgid%TYPE
   ,pi_Questionid    IN     question.questionid%TYPE
   ,pi_AnswerfieldId IN     answerfield.answerfieldid%TYPE
   ,pi_Answer        IN     baseanswerfield.answer%TYPE
   ,pio_arg_Cursor   IN OUT analysis_ref_cursor
   )
  IS
    v_answer baseanswerfield.answer%TYPE := RTRIM(pi_answer,CHR(0));
  BEGIN
    OPEN pio_arg_Cursor FOR
      SELECT bq.orgid
            ,ba.baseanswerid
            ,af.answerfieldorder
            ,baf.gridrowid
            ,baf.gridrow
            ,SUBSTR(baf.answer,1,128) answer
            ,baf.baseanswerfieldid
            ,DECODE(LENGTH(SUBSTR(baf.ANSWER,1,129)),129, 1, NULL) overflow
            ,sc.statuscolor
            ,sc_cmdlevel.statusname  cmdlevel_statusname
            ,sc_cmdlevel.statuscolor cmdlevel_statuscolor
--            ,PKG_ANALYSIS.ROW_HAS_THIS_VALUE(baf.baseanswerid,pi_answerfieldid,baf.gridrowid,pi_answer) hasvalue
--            ,length(pi_answer) lenans
--            ,ascii(substr(pi_answer,5,1)) asciians
--            ,LPAD(LTRIM(TO_CHAR(bq.orgid)),10,'0') || '.' || baf.gridrow  sortvalue
        FROM basequestion    bq
            ,baseanswer      ba
            ,baseanswerfield baf
            ,answerfield     af
            ,statuscode      sc
            ,statuscode      sc_cmdlevel
            ,basestatus      bs
       WHERE bq.orgid         IN (SELECT orgid FROM orgvw START WITH orgid = pi_orgid CONNECT BY PRIOR orgid = parentorgid)
         AND bq.questionid     = pi_questionid
         AND bq.basequestionid = ba.basequestionid
         AND ba.baseanswerid   = PKG_VALGRID.GET_LATEST_BA(bq.basequestionid)
         AND PKG_ANALYSIS.ROW_HAS_THIS_VALUE(baf.baseanswerid,pi_answerfieldid,baf.gridrowid,v_answer) = 'Y'
         AND ba.baseanswerid   = baf.baseanswerid
         AND baf.answerfieldid = af.answerfieldid
         AND bq.statuscodeid   = sc.statuscodeid
         AND bq.orgid          = bs.orgid
         AND bq.datacall       = bs.datacall
         AND 'CMDLEVEL'        = sc_cmdlevel.usedby
         AND bs.cmdlevel       = sc_cmdlevel.statusname
       UNION ALL
      SELECT bq.orgid
            ,TO_NUMBER(NULL)
            ,af.answerfieldorder
            ,TO_NUMBER(NULL)
            ,TO_CHAR(NULL)
            ,' '
            ,TO_NUMBER(NULL)
            ,NULL
            ,sc.statuscolor
            ,sc_cmdlevel.statusname  cmdlevel_statusname
            ,sc_cmdlevel.statuscolor cmdlevel_statuscolor
        FROM basequestion    bq
            ,answerfield     af
            ,statuscode      sc
            ,org             o
            ,statuscode      sc_cmdlevel
            ,basestatus      bs
       WHERE bq.orgid         IN (SELECT orgid FROM orgvw START WITH orgid = pi_orgid CONNECT BY PRIOR orgid = parentorgid)
         AND bq.questionid     = pi_questionid
         AND bq.orgid          = o.orgid
         AND bq.orglevelname   = 'Base'
         AND PKG_VALGRID.GET_LATEST_BA(bq.basequestionid) IS NULL
         AND bq.questionid     = af.questionid
         AND bq.statuscodeid   = sc.statuscodeid
         AND bq.orgid          = bs.orgid
         AND bq.datacall       = bs.datacall
         AND 'CMDLEVEL'        = sc_cmdlevel.usedby
         AND bs.cmdlevel       = sc_cmdlevel.statusname
       ORDER BY 1,5,4,3
       ;
  END;

  FUNCTION row_has_this_value
   (pi_baseanswerid  IN     baseanswer.baseanswerid%TYPE
   ,pi_answerfieldid IN     answerfield.answerfieldid%TYPE
   ,pi_gridrowid     IN     baseanswerfield.gridrowid%TYPE
   ,pi_answer        IN     baseanswerfield.answer%TYPE
   ) RETURN VARCHAR2 -- Y or N
  IS
    return_value VARCHAR2(1) := 'N';

    CURSOR chk_value IS
    SELECT 'Y'
      FROM baseanswerfield baf
     WHERE baf.baseanswerid  = pi_baseanswerid
       AND baf.answerfieldid = pi_answerfieldid
       AND (baf.gridrowid    = pi_gridrowid OR (baf.gridrowid IS NULL AND pi_gridrowid IS NULL))
       AND (baf.answer LIKE pi_answer OR (baf.answer IS NULL AND pi_answer IS NULL))
       ;

  BEGIN
    IF pi_answerfieldid IS NULL
    OR pi_answerfieldid = 0
    THEN
      return_value := 'Y';
    ELSE
      OPEN  chk_value;
      FETCH chk_value INTO return_value;
      CLOSE chk_value;
    END IF;
    RETURN return_value;
  END;
END;
/

Thanks in advance,

Steve
[Todays Threads] [This Message] [Subscription] [Fast Unsubscribe] [User Settings]

Reply via email to