Как сделать INSERT с переменной подстановки и использовать значение этой переменной в SUBSTR? - PullRequest
0 голосов
/ 29 сентября 2019

У меня есть этот запрос. Он запрашивает у меня значение для & last_name и & first_name и использует эти значения для SUBSTR, но сохраняет значение, если я не использую переменную UNDEFINE впоследствии.

INSERT INTO my_employee (id, last_name, first_name, userid, salary)
VALUES(3, '&&last_name', '&&first_name', 
LOWER(SUBSTR('&first_name', 1, 1)||SUBSTR('&last_name', 1, 7)), 1100);

UNDEFINE last_name
UNDEFINE first_name;

Я хочу сделать это так, чтобы он запрашивал у меня значение last_name и first_name каждый раз, когда явыполнить запрос и использовать это значение для конкатенации SUBSTR, поэтому мне не нужно использовать UNDEFINE, и я могу свободно использовать запрос снова и снова, если захочу.

Спасибо за вашу помощь. :)

1 Ответ

0 голосов
/ 29 сентября 2019

удаление двойных амперсандов;они используются в тех случаях, когда у вас одинаковый разброс переменных по всему запросу, чтобы вам не приходилось вводить одно и то же значение снова и снова.

Если вы используете его один раз, тогда будет только один амперсандused.

Сравните!

SQL> select &deptno                                --> 1st
  2  from dept
  3  where deptno = &deptno or &deptno is null;    --> 2nd and 3rd
Enter value for deptno: 10                         --> asked 1st time
old   1: select &deptno
new   1: select 10
Enter value for deptno: 10                         --> asked 2nd time
Enter value for deptno: 10                         --> asked 3rd time
old   3: where deptno = &deptno or &deptno is null
new   3: where deptno = 10 or 10 is null

        10
----------
        10

против

SQL> select &deptno                                --> 1st
  2  from dept
  3  where deptno = &&deptno or &&deptno is null;  --> 2nd and 3rd
Enter value for deptno: 10
old   1: select &&deptno                           --> asked only once
new   1: select 10
old   3: where deptno = &&deptno or &&deptno is null    --> reused here, without asking
new   3: where deptno = 10 or 10 is null

        10
----------
        10

SQL>

Как только вы закончите, вам нужно undefine переменную (и), иначето же самое значение будет использоваться при повторном выполнении запроса.

Я не думаю, что вы можете делать то, что вы хотите - вас спросят только один раз (что и делает &&) без необходимости undefine эти переменные. Обходной путь? Переключитесь на хранимую процедуру, которая будет принимать два параметра.


[EDIT]

Hm, как насчет объявления переменной ? Это поможет? Смотрите пример:

SQL> var par_deptno number

SQL> exec :par_deptno := 10;

PL/SQL procedure successfully completed.

SQL> select :par_deptno, substr(:par_deptno, 1, 1) sub
  2  from dept
  3  where deptno = :par_deptno or :par_deptno is null;

:PAR_DEPTNO S
----------- -
         10 1

SQL>

Если вам понадобится другое значение, вам нужно будет снова

SQL> exec :par_deptno := 30;
...