Skip to Main Content

SQL & PL/SQL

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Interested in getting your voice heard by members of the Developer Marketing team at Oracle? Check out this post for AppDev or this post for AI focus group information.

How can I do a conditional SQL?

Hello,
How can I make my SQL work conditionally in the WHERE Clause? 
This is the sense that I have:

:is_admin := case when (select ROL_ID from F_ASR_USERS WHERE Trim(USER_IDENTITY) = Trim(coalesce(sys_context('APEX$SESSION','APP_USER'),user))) = 1 then 1 else 0 end;
--IMPORTANT
--IF :is_admin = 1 MUST GET ALL RECORDS (admin)
--IF :is_admin = 0 MUST BRING ONLY CUSTOMER DATA (client)


select 
  FQ7076E3.FEQ70NN as "Numero_Comprobante",
  FQ7076E3.FEQ70NAU2 as "Numero_Autorizacion",
  F0101.ABTAX as "RUC_Emisor",
  to_date(to_date(1900000 + FQ7076E3.FEIVD, 'yyyyddd'),'DD/MM/YYYY') as "Fecha_Emision",
  to_date(to_date(1900000 + FQ7076E3.FEUPMJ, 'yyyyddd'),'DD/MM/YYYY') as "Fecha_Autorizacion",
  FQ7076E3.FETAX as "ID_Fiscal",
  FQ7076E3.FEALPH as "Razon_Social",
  DOCUMENT_TYPE_1,
  sys.dbms_lob.getlength("DOCUMENT_TYPE_1")"Archivo_PDF",
  DOCU.DOCUMENT_FILENAME_1,
  DOCU.DOCUMENT_MIMETYPE_1,
  DOCUMENT_TYPE_2,
  sys.dbms_lob.getlength("DOCUMENT_TYPE_2")"Archivo_XML",
  DOCU.DOCUMENT_FILENAME_2,
  DOCU.DOCUMENT_MIMETYPE_2
 from F0101 F0101,
  F0010 F0010,
  FQ7076E3 FQ7076E3,
  F_ASR_DOCUMENTS DOCU
 where FEDL02='03' 
  and FEQ70DTP='2'
  and FQ7076E3.FECO=F0010.CCCO
  and F0010.CCAN8=F0101.ABAN8
  -- If user is admin it shows all records
  and FQ7076E3.FEQ70NN = DOCU.DOCUMENT_ID(+)
and ( :is_admin = 1 or ( :is_admin = 0 and trim(FQ7076E3.FETAX) = Trim(coalesce(sys_context('APEX$SESSION','APP_USER'),user)) ))

Runs, but does not show data and only works if I remove the variable and the line ( ( :is_admin = 1 or ( :is_admin = 0 and trim(FQ7076E3.FETAX) = Trim(coalesce(sys_context('APEX$SESSION','APP_USER'),user))) ))

This post has been answered by L. Fernigrini on Dec 22 2021
Jump to Answer

Comments

L. Fernigrini

Consider using PL/Scope

PL/Scope Enhancements in Oracle Database 12c Release 2 (12.2) (0 Bytes)It is simpler than parsing code.

User_RI4C6

How its work I admit that I am a beginner in the world of plsql and I told myself that it is possible to do it with regexp

User_H3J7U

it can be for example standard package, ULT_HTTP
UTL_HTTP Constants

L. Fernigrini

undefined (0 Bytes)You need to set some session settings like this:

ALTER SESSION SET PLSCOPE_SETTINGS='IDENTIFIERS:ALL, STATEMENTS:ALL';

Then compile the package, and then query the dictionary tables being populated when you compile PL/SQL and have set PLSCOPE settings.
In the article I mentioned there is an example :
image.pnghere you would see that variable L_NUM and L_STR are declared on lunes 6 and 7, and that they reference the NUMBER and CHARACTER datatypes. You can modify the query in the example to filter only "VARIABLE" as TYPE; "DECLARATION" as USAGE and then get the associated REFERENCE row to get the datatype.

L. Fernigrini

Poster mentioned ANY package, documentation exists only for Oracle provided packages.

User_RI4C6

Wow very cool, Thank you very much for the help.!

1 - 6

Post Details

Added on Dec 20 2021
14 comments
865 views