À l'aide de Pragma dans le Corps de Package Oracle

J'aimerais créer un Package Oracle et deux fonctions: Une fonction publique ( function_public ) et un privé ( function_private ). La fonction publique utilise le secteur privé dans une instruction sql.

Sans pragma le code ne compile pas (PLS-00231: function 'FUNCTION_PRIVATE' may not be used in SQL)

CREATE OR REPLACE PACKAGE PRAGMA_TEST AS
  FUNCTION function_public(x IN VARCHAR2) RETURN VARCHAR2;
END PRAGMA_TEST;

CREATE OR REPLACE PACKAGE BODY PRAGMA_TEST AS
  FUNCTION function_private(y IN VARCHAR2) RETURN VARCHAR2 IS
  BEGIN
     return 'z';
  END;

  FUNCTION function_public(x IN VARCHAR2) RETURN VARCHAR2 IS
  ret VARCHAR2(100);
  BEGIN
     SELECT 'x' || function_private(x) INTO ret FROM dual;
     return ret;
  END;
END PRAGMA_TEST;

Le code se compile si j'ajoute WNDS, WNPS pragma pour function_private. Il me semble pragma peut être utilisée que dans la déclaration du package, et pas dans le corps de package, donc je dois déclarer function_private dans le paquetage:

CREATE OR REPLACE PACKAGE PRAGMA_TEST AS
  FUNCTION function_private(y IN VARCHAR2) RETURN VARCHAR2;
  PRAGMA RESTRICT_REFERENCES( function_private, WNDS, WNPS);
  FUNCTION function_public(x IN VARCHAR2) RETURN VARCHAR2;
END PRAGMA_TEST;

CREATE OR REPLACE PACKAGE BODY PRAGMA_TEST AS
  FUNCTION function_private(y IN VARCHAR2) RETURN VARCHAR2 IS
  BEGIN
     return 'z';
  END;

  FUNCTION function_public(x IN VARCHAR2) RETURN VARCHAR2 IS
  ret VARCHAR2(100);
  BEGIN
     SELECT 'x' || function_private(x) INTO ret FROM dual;
     return ret;
  END;
END PRAGMA_TEST;

Cette solution rend mon function_private public. Est-il une solution pour ajouter pragma d'une fonction qui peut être trouvée que dans le corps de package?

Mise à JOUR: Remplacé le pseudo-code d'un exemple (simplifié).

UPDATE2: Corrections de bugs dans le code, tel que suggéré par Rob van Wijk.

Votre exemple n'est pas de travail. Variable ret n'est pas déclaré et la fonction que vous manque une instruction de retour. Et: ce n'est pas une question à propos de pragma, il me semble. Votre fonction ne peut pas compiler parce que vous essayez d'appeler function_private en SQL. Les fonctions privées ne peut jamais être appelé à partir de SQL, donc il doit être publique, de toute façon.

OriginalL'auteur asalamon74 | 2010-05-10