Есть ли более простая версия этого скрипта SQL? - PullRequest
1 голос
/ 04 февраля 2020

Я пытаюсь запустить скрипт на Oracle базе данных через SQL Developer. Существует пять столбцов: ID, LAST_NAME, FIRST_NAME, USERID и SALARY. Это код, который я написал, чтобы принимать значения и редактировать поле USERID, используя строчную букву 1-й буквы FIRST_NAME и целое LAST_NAME.

INSERT INTO ACT_MY_EMPLOYEE
    VALUES (&P_ID, '&P_LAST_NAME', '&P_FIRST_NAME',
    LOWER(SUBSTR('&P_FIRST_NAME', 1, 1) ||
    SUBSTR('&P_LAST_NAME', 1, 7)), &P_SALARY);

Есть ли проще версия к этому? Спасибо!

Ответы [ 2 ]

1 голос
/ 04 февраля 2020

Вам определенно следует использовать && вместо &, так как одиночный & будет запрашивать значение каждый раз, когда он используется в вашем sql, в то время как double & будет хранить значение замещения (запрашивается только значение один раз) и используйте его, если эта же переменная используется второй раз в том же сеансе.

INSERT INTO ACT_MY_EMPLOYEE
    VALUES (&P_ID, '&&P_LAST_NAME', '&&P_FIRST_NAME',
    LOWER(SUBSTR('&&P_FIRST_NAME', 1, 1) ||
    SUBSTR('&&P_LAST_NAME', 1, 7)), &P_SALARY);

Cheers !!

0 голосов
/ 04 февраля 2020

Может быть, хранимая процедура будет хорошей идеей, особенно если вы часто добавляете новые строки. Вместо того чтобы хранить оператор INSERT INTO в каком-либо сценарии (и нужно помнить, где вы его поместили), процедура постоянно хранится в базе данных.

Может выглядеть так:

create or replace procedure p_ins_ame (
   par_id          in act_my_employee.id%type,
   par_first_name  in act_my_employee.first_name%type,
   par_last_name   in act_my_employee.last_name%type,
   par_salary      in act_my_employee.salary%type)
is
begin
   insert into act_my_employee (id,
                                last_name,
                                first_name,
                                some_column,
                                salary)
           values (
                     par_id,
                     par_last_name,
                     par_first_name,
                     lower (
                           substr (par_first_name, 1, 1)
                        || substr (par_last_name, 1, 7)),
                     par_salary);
END;

Вы бы назвали его как

begin
  p_ins_ame (par_id         => 100,
             par_first_name => 'Little',
             par_last_name  => 'Foot',
             par_salary     => 1000);
end;

Конечно, его можно доработать, чтобы он вставлял порядковый номер вместо «фиксированного» значения ID (или, если ваша версия базы данных поддерживает это, используйте столбец identity). Любые сделанные вами изменения будут использоваться во всех последующих вызовах процедур.


Начиная с одного оператора INSERT INTO: как вам уже говорили, некоторые инструменты (например, SQL* Plus) позволяют использовать два амперсанда (&&) вместе с именем переменной. Это означает, что вам не будет предложено ввести значение одной и той же переменной дважды (или столько раз, сколько указано в этом скрипте), но только один раз.

Это нормально, просто будьте осторожны! Если вы введете sla sh (/) в командной строке и нажмете клавишу ENTER, вы вставите эту же строку еще раз (если она не сработает из-за уникальности). Не забудьте UNDEFINE эти переменные!

...