Как объявить переменную и использовать ее в том же SQL-скрипт? (Oracle SQL)
Я хочу написать многоразовый код и нужно объявить некоторые переменные в начале и повторно использовать их в скрипте, например:
DEFINE stupidvar = 'stupidvarcontent';
SELECT stupiddata
FROM stupidtable
WHERE stupidcolumn = &stupidvar;
как я могу объявить переменную и использовать ее в следующих инструкциях, например, при использовании ее SQLDeveloper.
попытки
- используйте раздел Объявления и вставьте следующий оператор SELECT в
BEGIN
иEND;
. Доступ к переменной с помощью&stupidvar
. - использовать ключевое слово
DEFINE
и получить доступ к переменной. - С помощью ключевого слова
VARIABLE
и получить доступ к переменной.
но я получаю все виды ошибок во время моих попыток (несвязанная переменная, синтаксическая ошибка, ожидаемая SELECT INTO
...).
7 ответов:
существует несколько способов объявления переменных в скриптах SQL * Plus.
первый-использовать VAR. Механизм присвоения значений VAR заключается в вызове EXEC:
SQL> var name varchar2(20) SQL> exec :name := 'SALES' PL/SQL procedure successfully completed. SQL> select * from dept 2 where dname = :name 3 / DEPTNO DNAME LOC ---------- -------------- ------------- 30 SALES CHICAGO SQL>
VAR особенно полезен, когда мы хотим вызвать хранимую процедуру, которая имеет параметры OUT или функцию.
альтернативно мы можем использовать переменные подстановки. Они хороши для интерактивного режима:
SQL> accept p_dno prompt "Please enter Department number: " default 10 Please enter Department number: 20 SQL> select ename, sal 2 from emp 3 where deptno = &p_dno 4 / old 3: where deptno = &p_dno new 3: where deptno = 20 ENAME SAL ---------- ---------- CLARKE 800 ROBERTSON 2975 RIGBY 3000 KULASH 1100 GASPAROTTO 3000 SQL>
когда мы пишем сценарий, который вызывает другие скрипты может быть полезно определить переменные заранее:
SQL> def p_dno = 40 SQL> select ename, sal 2 from emp 3 where deptno = &p_dno 4 / old 3: where deptno = &p_dno new 3: where deptno = 40 no rows selected SQL>
наконец, есть анонимный блок PL/SQL. Как вы видите, мы все еще можем присвоить значения переменных в интерактивном режиме:
SQL> set serveroutput on size unlimited SQL> declare 2 n pls_integer; 3 l_sal number := 3500; 4 l_dno number := &dno; 5 begin 6 select count(*) 7 into n 8 from emp 9 where sal > l_sal 10 and deptno = l_dno; 11 dbms_output.put_line('top earners = '||to_char(n)); 12 end; 13 / Enter value for dno: 10 old 4: l_dno number := &dno; new 4: l_dno number := 10; top earners = 1 PL/SQL procedure successfully completed. SQL>
попробуйте использовать двойные кавычки, если это переменная типа char:
DEFINE stupidvar = "'stupidvarcontent'";
или
DEFINE stupidvar = 'stupidvarcontent'; SELECT stupiddata FROM stupidtable WHERE stupidcolumn = '&stupidvar'
upd:
SQL*Plus: Release 10.2.0.1.0 - Production on Wed Aug 25 17:13:26 2010 Copyright (c) 1982, 2005, Oracle. All rights reserved. SQL> conn od/od@etalon Connected. SQL> define var = "'FL-208'"; SQL> select code from product where code = &var; old 1: select code from product where code = &var new 1: select code from product where code = 'FL-208' CODE --------------- FL-208 SQL> define var = 'FL-208'; SQL> select code from product where code = &var; old 1: select code from product where code = &var new 1: select code from product where code = FL-208 select code from product where code = FL-208 * ERROR at line 1: ORA-06553: PLS-221: 'FL' is not a procedure or is undefined
в PL / SQL V. 10
ключевое слово declare используется для объявления переменной
DECLARE stupidvar varchar(20);
чтобы присвоить значение, вы можете установить его при объявлении
DECLARE stupidvar varchar(20) := '12345678';
или выбрать что-то в этой переменной вы используете
INTO
заявление, однако вам нужно обернуть заявление вBEGIN
иEND
, также вам нужно убедиться, что возвращается только одно значение, и не забывайте точки с запятой.таким образом, полное заявление выйдет следующее:
DECLARE stupidvar varchar(20); BEGIN SELECT stupid into stupidvar FROM stupiddata CC WHERE stupidid = 2; END;
ваша переменная может использоваться только в пределах
BEGIN
иEND
так что если вы хотите использовать более одного вам придется сделать несколькоBEGIN END
обертыванияDECLARE stupidvar varchar(20); BEGIN SELECT stupid into stupidvar FROM stupiddata CC WHERE stupidid = 2; DECLARE evenmorestupidvar varchar(20); BEGIN SELECT evenmorestupid into evenmorestupidvar FROM evenmorestupiddata CCC WHERE evenmorestupidid = 42; INSERT INTO newstupiddata (newstupidcolumn, newevenmorestupidstupidcolumn) SELECT stupidvar, evenmorestupidvar FROM dual END; END;
надеюсь, что это сэкономит вам некоторое время
Если вы хотите объявить дату, а затем использовать ее в SQL Developer.
DEFINE PROPp_START_DT = TO_DATE('01-SEP-1999') SELECT * FROM proposal WHERE prop_start_dt = &PROPp_START_DT
просто хочу добавить Матас' ответ. Может быть, это очевидно, но я долго искал, чтобы выяснить, что переменная доступна только внутри BEGIN-END строительство, так что если вам нужно использовать его в каком-то коде позже, вам нужно поместите этот код внутри блока BEGIN-END.
обратите внимание, что эти блоки могут быть вложенными:
DECLARE x NUMBER; BEGIN SELECT PK INTO x FROM table1 WHERE col1 = 'test'; DECLARE y NUMBER; BEGIN SELECT PK INTO y FROM table2 WHERE col2 = x; INSERT INTO table2 (col1, col2) SELECT y,'text' FROM dual WHERE exists(SELECT * FROM table2); COMMIT; END; END;
вопрос о том, чтобы использовать переменную в скрипте, означает, что она будет использоваться в SQL*Plus.
проблема в том, что вы пропустили кавычки и Oracle не может разобрать значение на число.
SQL> DEFINE num = 2018 SQL> SELECT &num AS your_num FROM dual; old 1: SELECT &num AS your_num FROM dual new 1: SELECT 2018 AS your_num FROM dual YOUR_NUM ---------- 2018 Elapsed: 00:00:00.01
этот образец нормально работает из-за автоматического преобразования типа (или как там это называется).
если вы проверите, введя DEFINE в SQL * Plus, он покажет, что переменная num является CHAR.
SQL>define DEFINE NUM = "2018" (CHAR)
это не проблема в данном случае, потому что Oracle может иметь дело с разбором строки на число, если это будет допустимое число.
когда строка не может разобрать на число, чем Oracle не может с ней справиться.
SQL> DEFINE num = 'Doh' SQL> SELECT &num AS your_num FROM dual; old 1: SELECT &num AS your_num FROM dual new 1: SELECT Doh AS your_num FROM dual SELECT Doh AS your_num FROM dual * ERROR at line 1: ORA-00904: "DOH": invalid identifier
С цитатой, так что не заставляйте Oracle разбирать на числа, будет нормально:
17:31:00 SQL> SELECT '&num' AS your_num FROM dual; old 1: SELECT '&num' AS your_num FROM dual new 1: SELECT 'Doh' AS your_num FROM dual YOU --- Doh
Итак, чтобы ответить на исходный вопрос, он должен быть похож на этот образец:
SQL> DEFINE stupidvar = 'X' SQL> SQL> SELECT 'print stupidvar:' || '&stupidvar' 2 FROM dual 3 WHERE dummy = '&stupidvar'; old 1: SELECT 'print stupidvar:' || '&stupidvar' new 1: SELECT 'print stupidvar:' || 'X' old 3: WHERE dummy = '&stupidvar' new 3: WHERE dummy = 'X' 'PRINTSTUPIDVAR:' ----------------- print stupidvar:X Elapsed: 00:00:00.00
существует другой способ хранения переменной в SQL * Plus с помощью Значение Столбца Запроса.
The COL[UMN] имеет новое_значение возможность хранить значение из запроса по имени Поля.
SQL> COLUMN stupid_column_name new_value stupid_var noprint SQL> SELECT dummy || '.log' AS stupid_column_name 2 FROM dual; Elapsed: 00:00:00.00 SQL> SPOOL &stupid_var. SQL> SELECT '&stupid_var' FROM DUAL; old 1: SELECT '&stupid_var' FROM DUAL new 1: SELECT 'X.log' FROM DUAL X.LOG ----- X.log Elapsed: 00:00:00.00 SQL>SPOOL OFF;
как вы можете видеть, значение X. log было установлено в stupid_var переменная, поэтому мы можем найти файл X. log в текущем каталоге имеет некоторый журнал в нем.