Skip to Main Content
  • Questions
  • Bind variable does not exist error for an sql after migration from 11.2.0.2 to 11.2.0.4

Breadcrumb

Question and Answer

Connor McDonald

Thanks for the question, prasanna.

Asked: May 22, 2017 - 11:55 am UTC

Last updated: May 24, 2017 - 2:39 am UTC

Version: 11.2.0.4

Viewed 1000+ times

You Asked

Hi Guys,
I ran into some errors after migration to 11.2.0.4 version.
In the older version 11.2.0.2 , i got 'ORA-00604:error occured at recursive SQL level 1 CURSOR expression not allowed' error whenever the application tried to execute many inline cursor expressions for a particular SQL
like
select seq_no,CURSOR(select ....from....), CURSOR(select ....from....)from .........
i was suggested to upgrade to 11.2.0.4 and so i did..
and now...ORA-00604:error occured at recursive SQL level 1 ORA-01006 Bind variable does not exist' for the below SQL.


Does it got something to do with bind varible peeking(just heard this word while googling :-P)

i was able to run the same query in QA successfully.(which was already 11.2.0.4) ..

additional note :

we ran into a smilar error in the past when one of our DBAs tried implementing a SQL profile suggested by optimizer and everythng broke and bind variable error resulted. the response was from DBA was

"when the job executed, it started the main query, which spawned numerous sub-queries because of the cursor. Each of those subqueries where taking a modest about of time. I don’t remember the details but I think it was about a minute each.

I ran the sql tuning on the query inside the cursor thinking if we reduced the query time of that, it would reduce the query time of the entire thing substantially"

and further proceeded to remove the profile and asked us to restructure the SQL without much of inline cursor expressions(which was not doable)

PROCEDURE rtetget
(
    i_n_Sub_SEC_SEQ_NO        IN LSDB202_MDL_SUBSEC.LS202_SUBSEC_SEQ_NO %TYPE
    ,i_n_SEC_SEQ_NO            IN LSDB201_MDL_SEC.LS201_SEC_SEQ_NO%TYPE
    ,i_n_Order_Key            IN LSDB400_ORDR.LS400_ORDR_KEY %TYPE
    ,i_s_Data_Loc            IN LSDB400_ORDR.LS150_DATA_LOC_TYPE_CODE %TYPE
    ,i_n_Rev_Input             IN NUMBER
    ,i_n_Spec                IN LSDB090_FILE_TYPE.LS090_FILE_TYPE_CODE%TYPE
    ,i_s_UserId                  IN LSDB010_EMD_USERS.LS010_USER_ID%TYPE
    ,o_cur_Disp                OUT OUT_CURSOR
    ,o_n_LSDBErrorID         OUT NUMBER
    ,o_s_OracleCode             OUT VARCHAR2
    ,o_s_ErrorMessage          OUT VARCHAR2
)
IS
 l_cla_desc_chng_flag      VARCHAR2(1):=NULL;
 l_s_Sys_Marker_Desc       VARCHAR2(100):=NULL;
 l_s_Dyn_Clause_Flag        VARCHAR2(1) :=NULL;

BEGIN
    /************************************************************
       |  Variable Initialization done here.
     |************************************************************/

    o_n_LSDBErrorID    := Pk_Lsdb_Constants.con_n_Zero;
    o_s_OracleCode        := Pk_Lsdb_Constants.con_n_Zero;
    o_s_ErrorMessage   := Pk_Lsdb_Constants.con_n_Space;

 OPEN o_cur_Disp FOR

    SELECT G.LS300_CLA_SEQ_NO,G.LS301_VERSION_NO,G.LS202_SUBSEC_SEQ_NO
          ,G.LS406_CPY_IND,G.MODEL_INDICATOR
          ,(SELECT NVL(
                (SELECT Distinct Pk_Lsdb_Constants.con_s_flag_YES
                 FROM   LSDB418_ORDR_DEL_CLA_STAGING Z
                 WHERE  Z.LS300_CLA_SEQ_NO = G.LS300_CLA_SEQ_NO
                 AND    Z.LS400_ORDR_NO = (SELECT DISTINCT LS400_ORDR_NO
                                             FROM  LSDB400_ORDR
                                            WHERE  LS400_ORDR_KEY =
i_n_Order_Key)),Pk_Lsdb_Constants.con_s_flag_NO)
                FROM DUAL) CLA_EXISTS_FLAG
            ,CURSOR(
                     SELECT
DECODE(Q.LS080_SPEC_STATUS_CODE,1,'DRFT',2,'PRPSL',3,'BSLNE','REV.'||Q.LS408_SPEC_REV_CODE)
||
                            DECODE(Q.LS408_SPEC_SUBLVL_REV_CODE,NULL,
                            ' ','.'||Q.LS408_SPEC_SUBLVL_REV_CODE)
                             REVISION_NUM
                     FROM LSDB408_ORDR_CLA_REV Q
                     WHERE Q.LS406_CLA_NUM = G.LS414_CLA_NO
                       AND Q.LS300_CLA_SEQ_NO=G.LS300_CLA_SEQ_NO
                       AND Q.LS400_ORDR_KEY=i_n_Order_Key
                       AND Q.LS150_DATA_LOC_TYPE_CODE=i_s_Data_Loc
                       AND Q.LS408_CLA_DESC_CHNG_FLAG=NVL(l_cla_desc_chng_flag,Q.LS408_CLA_DESC_CHNG_FLAG)
                       AND DECODE(Q.LS080_SPEC_STATUS_CODE,
                                        1,'DRFT',
                                        2,'PRPSL',
                                        3,'BSLNE',

Q.LS408_SPEC_REV_CODE)||'.'||Q.LS408_SPEC_SUBLVL_REV_CODE=
                           CASE i_n_Rev_Input
                             WHEN 1 THEN NULL
                             WHEN 2 THEN (SELECT DECODE(V.LS080_SPEC_STATUS_CODE,
                                                         1,'DRFT',
                                                         2,'PRPSL',
                                                         3,'BSLNE',

V.LS408_SPEC_REV_CODE)||'.'||V.LS408_SPEC_SUBLVL_REV_CODE
                                            FROM LSDB408_ORDR_CLA_REV v, LSDB400_ORDR w
                                           WHERE V.LS406_CLA_NUM = G.LS414_CLA_NO
                                             AND V.LS300_CLA_SEQ_NO=G.LS300_CLA_SEQ_NO
                                             AND V.LS400_ORDR_KEY=i_n_Order_Key
                                             AND V.LS150_DATA_LOC_TYPE_CODE='S'
                                             AND V.LS080_SPEC_STATUS_CODE =W.LS080_SPEC_STATUS_CODE
                                             AND
NVL(V.LS408_SPEC_REV_CODE,0)=NVL(W.LS400_SPEC_REV_CODE,0)
                                             AND NVL(V.LS408_SPEC_SUBLVL_REV_CODE,0)=
                                                 NVL(W.LS400_SPEC_SUBLVL_REV_CODE,0)
                                             AND
V.LS150_DATA_LOC_TYPE_CODE=W.LS150_DATA_LOC_TYPE_CODE
                                             AND V.LS400_ORDR_KEY=W.LS400_ORDR_KEY)
                             WHEN 3 THEN
                                 DECODE(Q.LS080_SPEC_STATUS_CODE,
                                                1,'DRFT',
                                                2,'PRPSL',
                                                3,'BSLNE',

Q.LS408_SPEC_REV_CODE)||'.'||Q.LS408_SPEC_SUBLVL_REV_CODE
                            --Added For CR_92
                            WHEN 4 THEN
                                 Q.LS408_SPEC_REV_CODE||'.'||Q.LS408_SPEC_SUBLVL_REV_CODE
                            --Ends here
                           END
                        ORDER BY  Q.LS080_SPEC_STATUS_CODE,REVISION_NUM
                   )REVISION_NUMBER,
                  
            CURSOR(
                    SELECT DECODE(Q.LS080_SPEC_STATUS_CODE,1,'DRFT',2,'PRPSL',3,'BSLNE','REV.'||Q.LS408_SPEC_REV_CODE)
                              ||DECODE(Q.LS408_SPEC_SUBLVL_REV_CODE,NULL,' ','.'||Q.LS408_SPEC_SUBLVL_REV_CODE)
                           REVISION_NUM
                    FROM LSDB408_ORDR_CLA_REV Q
                    WHERE Q.LS406_CLA_NUM = G.LS414_CLA_NO
                    AND Q.LS300_CLA_SEQ_NO=G.LS300_CLA_SEQ_NO
                    AND Q.LS400_ORDR_KEY=i_n_Order_Key
                    AND Q.LS150_DATA_LOC_TYPE_CODE=i_s_Data_Loc
                    AND Q.LS408_CLA_DESC_CHNG_FLAG=NVL(l_cla_desc_chng_flag,Q.LS408_CLA_DESC_CHNG_FLAG)
                    AND DECODE(Q.LS080_SPEC_STATUS_CODE,
                               1,'DRFT',
                               2,'PRPSL',
                               3,'BSLNE',Q.LS408_SPEC_REV_CODE)||'.'||Q.LS408_SPEC_SUBLVL_REV_CODE
                                =(SELECT DECODE(V.LS080_SPEC_STATUS_CODE,1,'DRFT',2,'PRPSL',3,'BSLNE',
                                                V.LS408_SPEC_REV_CODE)||'.'||V.LS408_SPEC_SUBLVL_REV_CODE
                                           FROM LSDB408_ORDR_CLA_REV v, LSDB400_ORDR w
                                            WHERE V.LS406_CLA_NUM =G.LS414_CLA_NO
                                            AND V.LS300_CLA_SEQ_NO=G.LS300_CLA_SEQ_NO
                                            AND V.LS400_ORDR_KEY=i_n_Order_Key
                                            AND V.LS150_DATA_LOC_TYPE_CODE='S'
                                            AND V.LS080_SPEC_STATUS_CODE =W.LS080_SPEC_STATUS_CODE
                                            AND NVL(V.LS408_SPEC_REV_CODE,0)=NVL(W.LS400_SPEC_REV_CODE,0)
                                            AND NVL(V.LS408_SPEC_SUBLVL_REV_CODE,0)
                                                =NVL(W.LS400_SPEC_SUBLVL_REV_CODE,0)
                                            AND V.LS150_DATA_LOC_TYPE_CODE=W.LS150_DATA_LOC_TYPE_CODE
                                            AND V.LS400_ORDR_KEY=W.LS400_ORDR_KEY)
                    ORDER BY  Q.LS080_SPEC_STATUS_CODE,REVISION_NUM
                   ) LATEST_REVISION_MARKER
           
        
    FROM LSDB307_CLA_HRCHY H,
                  (
                   SELECT
A.LS300_CLA_SEQ_NO,A.LS301_VERSION_NO,A.LS406_ORDR_BY_CODE,X.LS202_SUBSEC_CODE
                         ,X.LS202_SUBSEC_SEQ_NO,A.LS193_CLA_HRCHY_SEQ_NO

,DECODE(A.LS301_VERSION_NO,A.LS406_CPY_FROM_VERSION_NO,PK_LSDB_CONSTANTS.con_s_flag_NO
                         ,PK_LSDB_CONSTANTS.con_s_flag_YES) LS406_CPY_IND
                         ,NVL(
                            (SELECT DISTINCT Pk_Lsdb_Constants.con_s_flag_YES MODELINDICATOR
                                 FROM LSDB406_ORDR_CLA W,LSDB301_CLA_VER Y
                                 ,LSDB300_CLA X
                             WHERE W.LS300_CLA_SEQ_NO=Y.LS300_CLA_SEQ_NO
                                   AND W.LS301_VERSION_NO<>Y.LS301_VERSION_NO
                                   AND Y.LS301_DEFAULT_FLAG=Pk_Lsdb_Constants.con_s_flag_YES
                                   AND W.LS300_CLA_SEQ_NO=A.LS300_CLA_SEQ_NO
                                   AND W.LS406_VERSION_UPDT_DATE<Y.LS301_UPDT_DATE --Updated for CR_121
                                   AND W.LS400_ORDR_KEY=i_n_Order_Key
                                   AND W.LS150_DATA_LOC_TYPE_CODE=i_s_Data_Loc
                                   AND Y.LS300_CLA_SEQ_NO=X.LS300_CLA_SEQ_NO
                                   AND
X.LS190_CLA_SOURCE_CODE<>Pk_Lsdb_Constants.con_s_Cla_Source_Delete
                          ),Pk_Lsdb_Constants.con_s_flag_NO) MODEL_INDICATOR
                         ,A.LS406_CLA_NUM LS414_CLA_NO
                         ,B.LS301_PRICE_BOOK_NUMBER
                        ,B.LS301_CLA_DESC
                         ,B.LS301_DWO_NUMBER,B.LS301_PART_NUMBER,B.LS301_ENGG_DATA_COMMENTS
                       ,Y.LS170_IMG_SEQ_NO,
                        W.LS415_IMG_NAME,
                        W.LS415_IMG_DESC
                         ,DECODE(P.LS300_CLA_SEQ_NO,NULL,PK_LSDB_CONSTANTS.con_s_flag_NO
                         ,DECODE(
                                (SELECT  PK_LSDB_CONSTANTS.con_s_flag_YES
                                   FROM LSDB417_ORDR_DEL_CLA B
                                  WHERE b.LS300_CLA_SEQ_NO=(
                                    SELECT  A.LS300_PARENT_CLA_SEQ_NO
                                      FROM LSDB307_CLA_HRCHY A
                                     WHERE A.LS300_CHILD_CLA_SEQ_NO=P.LS300_CLA_SEQ_NO)
                                   AND b.LS400_ORDR_KEY=i_n_Order_Key)

,NULL,PK_LSDB_CONSTANTS.con_s_flag_YES,PK_LSDB_CONSTANTS.con_s_flag_NO)
                         )  DEL_IND
                       ,C.LS190_CLA_SOURCE_CODE
                       ,B.LS301_DELETE_FLAG
                       ,A.LS406_USR_MARKER
                       ,A.LS406_SYS_MARKER
                       ,A.LS406_CLA_DEL_FLAG
                       --Modified For CR_92 System Marker has three Values Y, N, H
                       ,DECODE(A.LS406_SYS_MARKER,PK_LSDB_CONSTANTS.con_s_flag_NO
                                   ,NULL,l_s_Sys_Marker_Desc) SYS_MARKER_DESC
                       ,C.LS300_LEAD_COMP_GRP_SEQ_NO
                   
                       ,A.LS406_SALES_SYS_MARKER
                    
                       ,C.LS300_CHAR_GRP_FLAG
                        ,NVL(
                            (SELECT PK_LSDB_CONSTANTS.con_s_flag_YES
                             FROM    LSDB429_ORDR_CLA_EDL_STAGING A
                             WHERE    A.LS300_CLA_SEQ_NO = C.LS300_CLA_SEQ_NO
                             AND    A.LS400_ORDR_KEY = i_n_Order_Key
                             ),PK_LSDB_CONSTANTS.con_s_flag_NO) EDLINDICATOR
               
                        ,A.LS406_CLA_RENUMBRD_FLAG
                
                        ,A.LS406_USR_MARKED_REASON
              

                  FROM  LSDB406_ORDR_CLA A
                       ,LSDB301_CLA_VER B
                       ,LSDB300_CLA C
                       ,LSDB202_MDL_SUBSEC X
                       ,LSDB416_ORDR_CLA_APNDX_IMG Y
                       ,LSDB415_ORDR_APNDX_IMG W
                       ,LSDB417_ORDR_DEL_CLA P
             
                 WHERE A.LS400_ORDR_KEY=i_n_Order_Key
                   AND A.LS150_DATA_LOC_TYPE_CODE=i_s_Data_Loc
                   AND A.LS300_CLA_SEQ_NO=B.LS300_CLA_SEQ_NO
                   AND A.LS301_VERSION_NO=B.LS301_VERSION_NO
                   AND X.LS202_SUBSEC_SEQ_NO=C.LS202_SUBSEC_SEQ_NO
                   AND X.LS201_SEC_SEQ_NO =i_n_SEC_SEQ_NO
                   AND C.LS202_SUBSEC_SEQ_NO=NVL(i_n_Sub_SEC_SEQ_NO,C.LS202_SUBSEC_SEQ_NO)
                   AND B.LS300_CLA_SEQ_NO=C.LS300_CLA_SEQ_NO
                   AND A.LS300_CLA_SEQ_NO=Y.LS300_CLA_SEQ_NO(+)
                   AND A.LS301_VERSION_NO=Y.LS301_VERSION_NO(+)
                   AND A.LS400_ORDR_KEY=Y.LS400_ORDR_KEY(+)
                   AND A.LS150_DATA_LOC_TYPE_CODE=Y.LS150_DATA_LOC_TYPE_CODE(+)
                   AND Y.LS400_ORDR_KEY=W.LS400_ORDR_KEY(+)
                   AND Y.LS150_DATA_LOC_TYPE_CODE=W.LS150_DATA_LOC_TYPE_CODE(+)
                   AND DECODE(Y.LS170_IMG_SEQ_NO,NULL,1,W.LS170_IMG_SEQ_NO)
                      =DECODE(Y.LS170_IMG_SEQ_NO,NULL,1,Y.LS170_IMG_SEQ_NO)
                   AND A.LS300_CLA_SEQ_NO=P.LS300_CLA_SEQ_NO(+)
                   AND A.LS301_VERSION_NO=P.LS301_VERSION_NO(+)
                   AND A.LS400_ORDR_KEY=P.LS400_ORDR_KEY(+)
                
                   AND DECODE(l_s_Dyn_Clause_Flag,PK_LSDB_CONSTANTS.con_s_flag_NO,
                        'A',A.LS406_CLA_DEL_FLAG) = DECODE(l_s_Dyn_Clause_Flag,PK_LSDB_CONSTANTS.con_s_flag_NO,
                                                       'A', PK_LSDB_CONSTANTS.con_s_flag_NO)
                 

            )G
    WHERE H.LS300_CHILD_CLA_SEQ_NO=G.LS300_CLA_SEQ_NO
    START WITH H.LS300_PARENT_CLA_SEQ_NO IS NULL
    CONNECT BY H.LS300_PARENT_CLA_SEQ_NO=PRIOR H.LS300_CHILD_CLA_SEQ_NO
    ORDER SIBLINGS BY G.LS202_SUBSEC_CODE,G.LS193_CLA_HRCHY_SEQ_NO,G.LS406_ORDR_BY_CODE;


sorry for the book guys...tried to give as much info as i can... :-)

and Connor said...

Well...that's a mighty big sql :-)

I would suggest trying to tackle this in chunks

1) remove *every* cursor expression, see if the sql works in a simple test harness, ie

variable rc refcursor
variable out1 number
etc
exec rtetget([parms],:rc, :out1,:out2,:out3 )

2) If that works, then selectively add back in each cursor expression, one at a time, and repeat the test harness.

Narrow it down so the precise cause of error can be located.

And work from there.

Is this answer out of date? If it is, please let us know via a Comment

More to Explore

PL/SQL demos

Check out more PL/SQL tutorials on our LiveSQL tool.

PL/SQL docs

PL/SQL reference manual from the Oracle documentation library