sql >> Database >  >> RDS >> Oracle

Is er een manier om toegang te krijgen tot privé plsql-procedures voor testdoeleinden?

Er is een manier om dit te doen, op voorwaarde dat u 10g of hoger gebruikt. Het wordt voorwaardelijke compilatie genoemd. Dit is een zeer handige functie die een speciale syntaxis biedt, zodat we onze PL/SQL-code tijdens het compileren kunnen wijzigen.

Toevallig heb ik deze functie juist gebruikt om privépakketten in een specificatie bloot te leggen, zodat ik UTPLSQL-tests ertegen kan uitvoeren.

Hier is de speciale syntaxis:

create or replace package my_pkg
as

    $IF $$dev_env_test $THEN

    PROCEDURE private_proc;

    $END

    FUNCTION public_function return date;

end my_pkg;
/

Die variabele met het dubbele dollarteken is een voorwaardelijke compilatievlag.

Als ik het pakket beschrijf, kunnen we alleen het openbare pakket zien:

SQL> desc my_pkg
FUNCTION PUBLIC_FUNCTION RETURNS DATE

SQL>

Nu stel ik de voorwaardelijke vlag in en compileer het pakket opnieuw, en als bij toverslag ...

SQL> alter session set plsql_ccflags='dev_env_test:true'
  2  /

Session altered.

SQL> alter package my_pkg compile
  2  /

Package altered.

SQL> desc my_pkg
PROCEDURE PRIVATE_PROC
FUNCTION PUBLIC_FUNCTION RETURNS DATE

SQL>

Het privatiseren van de functies is zo eenvoudig als u denkt:

SQL> alter session set plsql_ccflags='dev_env_test:false'
  2  /

Session altered.

SQL> alter package my_pkg compile
  2  /

Package altered.

SQL> desc my_pkg
FUNCTION PUBLIC_FUNCTION RETURNS DATE

SQL>

We kunnen veel meer doen met voorwaardelijke compilatie. Het staat in de documenten. Meer informatie.



  1. MySQL:u kunt de doeltabel voor update niet specificeren in de FROM-clausule

  2. Rails (postgres)-query met jsonb-array

  3. MyISAM-sleutel invoegen in een INNODB-tabel

  4. Is er in mysql of postgres een limiet voor de grootte van een IN (1,2,n)-instructie?