SQL * Plus使用变量进行子选择(保持假脱机工作)

时间:2018-06-03 12:48:26

标签: sql oracle variables sqlplus spool

我得到了以下实际执行以下操作的脚本,它使用了一个电子邮件地址

  • 搜索该用户
  • 搜索该用户的邮件
  • 搜索该用户的条目
  • 将调查结果放入档案

目前正在运作,但现在我想做以下事情: 用一种变量替换子选择“SELECT ID FROM DBSCHEMA.USERS WHERE EMAIL ='&SEARCH'”,以便在脚本中多次放置(并执行)该语句。

但是我尝试过的东西都没用。 (开始使用DECLARE块 - 比线轴不工作,结束其他一切只是打破了脚本)
我正在使用oracle数据库 - 但如果可能,我想坚持使用通用命令。

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 :(得分:1)

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

我不了解您的问题中有关无效或使用通用命令的部分。如果你能澄清那些我可以添加到我的答案。