Search code examples
oracle-databasestored-proceduresinner-join

Oracle query not working in stored procedure


I have a query which I am using for displaying data in front end. The issue is the query is working fine if I run with simple parameters and it fetches the data, but when the same is run through the stored procedure it does not bring any data.

Below is the simple query:

SELECT DISTINCT NVL(STM.SERVICE_TYPE,'-')SERVICETYPE, NVL(SM.SERVICE_NAME,'-')SERVICENAME, NVL(SM.URL,'-')URL, NVL(SM.MXD,'-')MXD, NVL(SD.SERVER_TYPE,'-')SERVERTYPE, NVL(SD.LAYER,'-')LAYER
    FROM SERVICES_MASTER SM
          INNER JOIN SERVICE_DETAILS SD
              ON SM.SERVICE_ID = SD.SERVICE_ID
          INNER JOIN SERVICE_TYPES_MASTER STM
              ON SM.SERVICE_TYPE_ID = STM.SERVICE_TYPE_ID
    WHERE SM.SERVICE_NAME LIKE '%SNOCAlarmBoundary%';

The below is the stored procedure one

STREX:='SELECT DISTINCT NVL(STM.SERVICE_TYPE,''-'')SERVICETYPE, NVL(SM.SERVICE_NAME,''-'')SERVICENAME, NVL(SM.URL,''-'')URL, NVL(SM.MXD,''-'')MXD, NVL(SD.SERVER_TYPE,''-'')SERVERTYPE, NVL(SD.LAYER,''-'')LAYER
    FROM SERVICES_MASTER SM
          INNER JOIN SERVICE_DETAILS SD
              ON SM.SERVICE_ID = SD.SERVICE_ID
          INNER JOIN SERVICE_TYPES_MASTER STM
              ON SM.SERVICE_TYPE_ID = STM.SERVICE_TYPE_ID                 
         WHERE SM.'|| UPPER(P_PARAM_TYPE) ||' '|| P_OPERATOR  || ' :PARAM';

 DBMS_OUTPUT.PUT_LINE('STREX '|| STREX);
 OPEN P_RETURN FOR STREX USING VAL;  

why it's not working in second case and what should I do to work it

update

PROCEDURE FILTER_SEARCH_DATA
  (
P_SEARCH_TYPE IN NVARCHAR2,
P_PARAM_TYPE IN NVARCHAR2,
P_OPERATOR IN NVARCHAR2,
P_TEXTVAL IN NVARCHAR2,
P_RETURN OUT SYS_REFCURSOR 
 ) 
 AS

 STR NVARCHAR2(400):='';
 STROP NVARCHAR2(400):='';
  STREX VARCHAR2(4000):='';
 VAL NVARCHAR2(4000);

 BEGIN
 IF (P_OPERATOR = 'LIKE') THEN
     val := '%' || UPPER(P_TEXTVAL) ||'%';
 ELSE
   val := UPPER(P_TEXTVAL) ;
END IF;

 DBMS_OUTPUT.PUT_LINE('STR'|| STR);
  IF P_SEARCH_TYPE = 'Application' THEN   
   STREX:='SELECT DISTINCT NVL(AM.APPLICATIONNAME,''-'')APPLICATIONNAME, NVL(AD.URLPATH,''-'')URL, NVL(AM.PROJECTNO,''-'')PROJECTNO, NVL(AM.VSS_FOLDER_LOC,''-'')VSSFOLDERLOC,
         NVL(AU.NAME, ''-'')SPOCUSER, NVL(AUR.NAME,''-'')REQUESTEDBY, NVL(AUD.NAME,''-'')DELIVERYMANAGER             
           FROM APPLICATION_MASTER AM 
                INNER JOIN APPLICATION_DETAILS AD
                   ON AM.APP_MST_ID = AD.APP_MST_ID 
                INNER JOIN APPUSER_UMS AU
                   ON AM.APP_MST_ID = AU.APP_USERID    
                   INNER JOIN APPUSER_UMS AUR
                 ON AUR.APP_USERID = AM.REQUESTED_BY_APPUSRID  
                 INNER JOIN  APPUSER_UMS AUD
                      ON AUD.APP_USERID = AM.DELIVERY_MANAGER_APPUSRID  
          WHERE AM.'|| UPPER(P_PARAM_TYPE) ||' '|| P_OPERATOR  || ' :PARAM';

 DBMS_OUTPUT.PUT_LINE('STREX '|| STREX);
 OPEN P_RETURN FOR STREX USING VAL;

 END IF;

  IF P_SEARCH_TYPE = 'Services' THEN   
 STREX:='SELECT DISTINCT NVL(STM.SERVICE_TYPE,''-'')SERVICETYPE, NVL(SM.SERVICE_NAME,''-'')SERVICENAME, NVL(SM.URL,''-'')URL, NVL(SM.MXD,''-'')MXD, NVL(SD.SERVER_TYPE,''-'')SERVERTYPE, NVL(SD.LAYER,''-'')LAYER
    FROM SERVICES_MASTER SM
          INNER JOIN SERVICE_DETAILS SD
              ON SM.SERVICE_ID = SD.SERVICE_ID
          INNER JOIN SERVICE_TYPES_MASTER STM
              ON SM.SERVICE_TYPE_ID = STM.SERVICE_TYPE_ID                             
          WHERE SM.'|| UPPER(P_PARAM_TYPE) ||' '|| P_OPERATOR  || ' :PARAM';

 DBMS_OUTPUT.PUT_LINE('STREX '|| STREX);
 OPEN P_RETURN FOR STREX USING VAL;     

END IF;

 IF P_SEARCH_TYPE = 'Layers' THEN   
 STREX:='SELECT NVL(SERVER_TYPE,''-'')SERVERTYPE, NVL(LAYER,''-'')LAYER, 
NVL(FEATURECLASS,''-'')FEATURECLASS 
          FROM SERVICE_DETAILS
          WHERE '|| UPPER(P_PARAM_TYPE) ||' '|| P_OPERATOR  || ' :PARAM';

 DBMS_OUTPUT.PUT_LINE('STREX '|| STREX);
 OPEN P_RETURN FOR STREX USING VAL;     

END IF;

IF P_SEARCH_TYPE = 'Dbitem' THEN   
STREX:='SELECT NVL(DM.DB_ITEMNAME,''-'')DBITEMNAME, NVL(DM.SCHEMAOWNER,''-'')SCHEMAOWNER, NVL(DT.DBITEMTYPE,''-'')DBITEMTYPE
             FROM DATABASE_ITEMMASTER DM
           INNER JOIN DBITEMTYPE DT
   ON DM.DB_ITM_ID = DT.DB_ITEMTYPE_ID
          WHERE DM.'|| UPPER(P_PARAM_TYPE) ||' '|| P_OPERATOR  || ' :PARAM';

 DBMS_OUTPUT.PUT_LINE('STREX '|| STREX);
 OPEN P_RETURN FOR STREX USING VAL;     

END IF;

END FILTER_SEARCH_DATA;

Solution

  • OK so here comes just a wild guess

    (As I mentioned before - we do not have enough information to safely pinpoint the source of your problem).

    Try the following:

     IF P_SEARCH_TYPE = 'Services' THEN   
     STREX:='SELECT DISTINCT NVL(STM.SERVICE_TYPE,''-'')SERVICETYPE, NVL(SM.SERVICE_NAME,''-'')SERVICENAME, NVL(SM.URL,''-'')URL, NVL(SM.MXD,''-'')MXD, NVL(SD.SERVER_TYPE,''-'')SERVERTYPE, NVL(SD.LAYER,''-'')LAYER
        FROM SERVICES_MASTER SM
              INNER JOIN SERVICE_DETAILS SD
                  ON SM.SERVICE_ID = SD.SERVICE_ID
              INNER JOIN SERVICE_TYPES_MASTER STM
                  ON SM.SERVICE_TYPE_ID = STM.SERVICE_TYPE_ID                             
              WHERE UPPER(SM.'|| P_PARAM_TYPE || ') ' || P_OPERATOR  || ' :PARAM';
    

    So what I changed is that now the upper is part of the query string. I'm guessing that, that was your initial intention (as val is always upper case).