web-dev-qa-db-fra.com

Comment passer le paramètre de date dans la procédure Oracle?

Voici l'exemple de code de procédure,

create or replace procedure pro_test(start_date date, end_date date)
is 
begin

insert into test1 select col1, col2, col3 from main where range_date between start_date and end_date;

exception

< what are the exception I need to capture >

end;
/

Q1: Est-ce la bonne façon de passer la date directement dans la procédure? Q2: Sinon, puis-je passer varchar dans la procédure pour convertir la date dans la partie déclaration? Q3: Au début, j'utilise entre les opérateurs, puis-je passer directement le paramètre de procédure?

Lors de l'exécution de cette procédure, exec pro_test('10102015','30102015'); Que dois-je mentionner entre les phrases? entre start_date et end_date est-ce suffisant ou dois-je masquer le format de la date?

quelqu'un peut-il m'aider à clarifier cela?

8
Bala S

Q1: Est-ce la bonne façon de passer la date directement dans la procédure?

Oui.

Q3: Au début, j'utilise entre les opérateurs, puis-je passer directement le paramètre de procédure?

Je ne sais pas ce que vous entendez par cela, mais votre déclaration d'insertion est très bien. Vous passez un DATE comme paramètre et vous l'insérez dans le tableau.

À mon avis, tout cela pourrait être fait en une seule instruction INSERT..SELECT en pur SQL .

insert into test1 
select col1, col2, col3 
from main 
where range_date 
between TO_DATE(<date_literal>,<format mask>)
and TO_DATE(<date_literal>,<format mask>);

UPDATE Selon le commentaire de l'OP:

Lors de l'exécution de cette procédure, exec pro_test ('10102015', '30102015'); Que dois-je mentionner entre les phrases? entre start_date et end_date est-ce suffisant ou dois-je masquer le format de la date?

'10102015' n'est pas une DATE, c'est un littéral de chaîne. Vous devez le passer en tant que DATE, vous devez donc utiliser TO_DATE avec le masque de format approprié ou ANSI Date literal car vous n'avez pas de partie de temps. Le littéral de date ANSI utilise un format fixe 'YYYY-MM-DD'.

Par exemple,

En utilisant TO_DATE:

EXEC pro_test(TO_DATE('10102015','DDMMYYYY'),TO_DATE('30102015','DDMMYYYY'));

Utilisation de littéral de date ANSI:

EXEC pro_test(DATE '2015-10-10', DATE '2015-10-30');
9
Lalit Kumar B

Q1. Vous devez dire la procédure de quel type de paramètres entrée ou sortie (en ajoutant in ou out), pour votre procédure, il est saisi:

create or replace procedure pro_test(start_date in date, end_date in date)

Tout le reste dans votre procédure très bien.

2
HAYMbl4

Si vous voulez être extrêmement prudent, vous devez nommer vos variables pl/sql lorsqu'elles sont utilisées dans une instruction SQL:

create or replace procedure pro_test(start_date date, end_date date)
is 
begin

  insert into test1
  select col1, col2, col3
  from main where range_date
  between pro_test.start_date and pro_test.end_date;
...

Cela empêche le moteur SQL de "capturer" les variables si leur nom est le même qu'une colonne dans une table référencée.

Généralement, vous voyez que les gens essaient d'éviter cela avec:

create procedure my_procedure (p_customer_id number)
...
where customer_id = p_customer_id

L'espace de noms des variables vous permet de garder une interface plus propre sans le préfixe.

2
David Aldridge