J'essaie d'écrire une requête simple où je déclare certaines variables, puis les utilise dans une instruction select dans Oracle. J'ai pu le faire auparavant dans SQL Server avec les éléments suivants:
DECLARE @date1 DATETIME
SET @date1 = '03-AUG-2010'
SELECT U.VisualID
FROM Usage u WITH(NOLOCK)
WHERE U.UseTime > @Date1
D'après la recherche que j'ai effectuée, il semble que vous ne pouvez pas déclarer et définir des variables comme celle-ci dans les instructions Select. Est-ce vrai ou est-ce que je mss quelque chose?
D'après la recherche que j'ai effectuée, il semble que vous ne pouvez pas déclarer et définir des variables comme celle-ci dans les instructions Select. Est-ce vrai ou ai-je raté quelque chose?
Dans Oracle PL/SQL et SQL sont deux langues distinctes avec deux moteurs distincts. Vous pouvez intégrer SQL DML dans PL/SQL, et cela vous donnera des variables. Tels que le bloc PL/SQL anonyme suivant. Noter la /
à la fin ne fait pas partie de PL/SQL, mais indique à SQL * Plus d'envoyer le bloc précédent.
declare
v_Date1 date := to_date('03-AUG-2010', 'DD-Mon-YYYY');
v_Count number;
begin
select count(*) into v_Count
from Usage
where UseTime > v_Date1;
dbms_output.put_line(v_Count);
end;
/
Le problème est qu'un bloc équivalent à votre code T-SQL ne fonctionnera pas:
SQL> declare
2 v_Date1 date := to_date('03-AUG-2010', 'DD-Mon-YYYY');
3 begin
4 select VisualId
5 from Usage
6 where UseTime > v_Date1;
7 end;
8 /
select VisualId
*
ERROR at line 4:
ORA-06550: line 4, column 5:
PLS-00428: an INTO clause is expected in this SELECT statement
Pour transmettre les résultats d'une requête à partir d'un PL/SQL, soit un bloc anonyme, une procédure stockée ou une fonction stockée, un curseur doit être déclaré, ouvert puis renvoyé au programme appelant. (Au-delà de la portée de la réponse à cette question. EDIT: voir Obtenir le jeu de résultats à partir de la procédure stockée Oracle )
L'outil client qui se connecte à la base de données peut avoir ses propres variables de liaison. Dans SQL * Plus:
SQL> -- SQL*Plus does not all date type in this context
SQL> -- So using varchar2 to hold text
SQL> variable v_Date1 varchar2(20)
SQL>
SQL> -- use PL/SQL to set the value of the bind variable
SQL> exec :v_Date1 := '02-Aug-2010';
PL/SQL procedure successfully completed.
SQL> -- Converting to a date, since the variable is not yet a date.
SQL> -- Note the use of colon, this tells SQL*Plus that v_Date1
SQL> -- is a bind variable.
SQL> select VisualId
2 from Usage
3 where UseTime > to_char(:v_Date1, 'DD-Mon-YYYY');
no rows selected
Notez que ce qui précède est en SQL Plus, peut ne pas fonctionner (probablement pas) dans le développeur Toad PL/SQL, etc. Les lignes commençant par variable et exec sont SQL Plus de commandes. Ce ne sont pas des commandes SQL ou PL/SQL. Aucune ligne sélectionnée car la table est vide.
J'ai essayé cela et cela a fonctionné:
define PROPp_START_DT = TO_DATE('01-SEP-1999')
select * from proposal where prop_start_dt = &PROPp_START_DT
La commande SET
est spécifique à TSQL - voici l'équivalent PLSQL de ce que vous avez publié:
v_date1 DATE := TO_DATE('03-AUG-2010', 'DD-MON-YYYY');
SELECT u.visualid
FROM USAGE u
WHERE u.usetime > v_date1;
Il n'est pas non plus nécessaire de préfixer les variables avec "@"; J'ai tendance à préfixer les variables avec "v_" pour distinguer les variables et les colonnes/etc.
Essayez la fonction to_date .