SQL * Plus с использованием переменной для подвыбора (поддержание работы катушки) - PullRequest
0 голосов
/ 03 июня 2018

Я получил следующий скрипт, который фактически выполняет следующее: он использует адрес электронной почты для

  • поиска этого пользователя
  • поиска сообщений от этого пользователя
  • поиск записей этого пользователя
  • помещает результаты в файл

, который в данный момент работает, но теперь я хотел бы сделать следующее: Заменить вспомогательный выбор "SELECT ID FROM DBSCHEMA.USERS WHERE EMAIL ='&SEARCH' "с некоторой переменной, чтобы не помещать (и не выполнять) этот оператор несколько раз в сценарии.

Но то, что я пробовал, не работало.(Начал использовать блок DECLARE - чем спул не работал, конец все остальное просто сломал скрипт)
Я использую базу данных оракула - но я хотел бы придерживаться общих команд, если это возможно.

DEFINE SEARCH='search@example.org';

spool OUTPUTFILE.out
prompt Start Searching by mail '&SEARCH'

SELECT
    'ID;NAME;LAST_LOGIN;EMAIL_ADDRESS;FIRST_NAME;LAST_NAME;BLABLA;LANGUAGE_ID;'
FROM
    DUAL;

SELECT
    ID||';'||NAME||';'||LAST_LOGIN||';'||EMAIL||';'||FIRST_NAME||';'||LAST_NAME||';'||BLABLA||';'||LANGUAGE_ID||';'
FROM
    DBSCHEMA.USERS
WHERE
    EMAIL ='&SEARCH';

prompt Feedback messages
prompt ID;SUBJECT;MESSAGE;TIMESTAMP;

SELECT
    ID||';'||SUBJECT||';'||MESSAGE||';'||TIMESTAMP||';'
FROM
    DBSCHEMA.SITE_FEEDBACK
WHERE
    USER_ID = (SELECT ID FROM DBSCHEMA.USERS WHERE EMAIL ='&SEARCH');

prompt Other Entries
prompt ID;TITLE;BLABLA;TIMESTAMP;

SELECT
    ID||';'||TITLE||';'||BLABLA||';'||TIMESTAMP||';'
FROM
    DBSCHEMA.SITE_ENTRY
WHERE
    USER_ID = (SELECT ID FROM DBSCHEMA.USERS WHERE EMAIL ='&SEARCH');

spool off;

1 Ответ

0 голосов
/ 03 июня 2018

Как заселяется search?Кроме того, какая у вас версия SQL * Plus?

В SQL * Plus вы можете объявить переменную и заполнить ее в PL / SQL, например так (я использовал демонстрационную схему HR):

define search='VJONES';

var user_id number

begin
    select employee_id into :user_id from employees where email = '&search';
exception
    when no_data_found then
        raise_application_error(-20001, 'No user found with email ''&search''.');
    when too_many_rows then
        raise_application_error(-20002, 'Multiple users found with email ''&search''.');
end;
/

select phone_number from employees where employee_id = :user_id;

PHONE_NUMBER
--------------------
650.501.4876

(Вам не нужен строго обработчик исключений, но это улучшит обработку недействительных или дублированных данных.)

Вы также можете придерживаться define переменных:

column user_id new_value user_id
select employee_id as user_id from employees where email = '&search';

   USER_ID
----------
       195

1 row selected.

Теперь вы определили и заполнили &user_id и можете использовать его в запросах:

select phone_number from employees where employee_id = &user_id;

PHONE_NUMBER
--------------------
650.501.4876

Я не понимаю части вашего вопроса о вещах, которые не работают или используют общие команды.Если бы вы могли уточнить их, я мог бы добавить к своему ответу.

...