Comment puis-je déclarer une variable dans un corps de package Oracle?
Quelqu'un peut-il m'aider à comprendre pourquoi je peux déclarer une date codée en dur de la valeur dans un paquet, mais pas assigner une valeur à partir d'une requête?
J'ai vu un certain nombre d'exemples (y compris le livre de référence) qui montrent des déclarations de valeurs codées en dur, mais je ne suis pas capable de localiser des exemples d'attribuer une valeur à la variable par l'intermédiaire de requêtes.
Oracle 11g.
Il est permis de le
create or replace package body PACKAGE_NAME AS
tDate DATE := '2012-05-30';
...procedues follow
Il est permis de le
create or replace package body PACKAGE_NAME AS
tDate DATE := sysdate;
ce n'est pas autorisé
create or replace package body PACKAGE_NAME AS
tDate DATE := select MAX(date_) from Table_Name;
J'ai essayé un certain nombre de façons et à la fin, je suis ok avec ça ne fonctionne pas ( je peux l'utiliser comme nécessaire dans les procédures elles-mêmes), mais je ne vois pas pourquoi je ne peut pas affecter une valeur à tDate de cette façon?
L'erreur spécifique est la "Rencontrée le symbole "SÉLECTIONNEZ" lorsque attend ....".
Merci d'avance pour tout le monde insight
ajoutant que je peux obtenir les valeurs de la variable assignée par le biais de requêtes dans une procédure stockée, mais le même processus ne semble pas fonctionner pour le corps de package.
PROCEDURE Proc_Name IS
tDate Date;
BEGIN
SELECT MAX(date_) into tDate from Table_Name;
OriginalL'auteur dee | 2012-06-01
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin pour créer un paquet d'initialisation de bloc dans votre corps de package. Ce qui est relativement arcanes peu de PL/SQL package lore, mais il est là et peut être utilisé. Voici un exemple:
Ici, nous avons créé un package spec qui ne contient qu'une seule variable de DATE. Nous allons maintenant créer un corps simple qui initialise cette variable à l'aide d'une instruction SELECT:
Maintenant, si vous exécutez les opérations suivantes:
il devrait afficher la date actuelle.
De partager et de profiter.
Le package spec et le corps doivent être créés séparément. Donc, vous devriez avoir
CREATE OR REPLACE PACKAGE MY_PACKAGE...END MY_PACKAGE;
suivie parCREATE OR REPLACE PACKAGE BODY MY_PACKAGE...END MY_PACKAGE;
. "Pourquoi dois-je..." - la réponse longue est que vous ne pouvez pas utiliser un exécutable déclaration, comme SELECT, dans l'initialisation d'une variable, et c'est précisément pourquoi le paquet d'initialiseur bloc existe - de sorte que vous pouvez exécuter du code au moment de votre session accède à un package qui initialise les variables de package pour votre session. La réponse courte est "parce que tu dois". 🙂 De partager et de profiter.Merci pour expliquer le pourquoi-même si il semble que le long et à court réponses sont: "Pourquoi? Parce que c'est de la science, voilà pourquoi!" Le dr F. je reçois toujours un problème avec ça, mais je vais demander autour de et de re-lire les specs sur le package oracle de construction et je vais probablement figure sur le week-end.
Je ne vois pas pourquoi vous avez déplacé la déclaration de la variable à partir du corps de package à la spécification. Il peut être soit le lieu, en fonction de si vous voulez qu'elle visible de l'extérieur.l'initialisation.
vraiment juste pour les fins de l'exemple - j'ai voulu montrer un exemple de création à la fois la spécification et le corps, et ainsi créé la variable dans la spec. Vous avez raison, bien sûr, que l'initialisation du bloc peut traiter avec les variables déclarées soit en place.
OriginalL'auteur Bob Jarvis
Vous devez utiliser
INTO
lors de la sélection directement dans une variable.Un corps de package doit contenir la procédure et des définitions de fonction, il n'est pas lui-même un PL/SQL bloc. Le tDate déclaration est valable mondial pour le paquet, mais la SÉLECTIONNEZ doit apparaître à l'intérieur d'une Procédure ou une Fonction.
OriginalL'auteur Datajam