SQL*加上为子选择使用变量(保持假脱机工作)

SQL*Plus using a variable for a subselect (keeping spool working)

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

目前正在运行,但现在我想执行以下操作: 将 sub select "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;

search 是如何填充的?另外,你有什么版本的 SQL*Plus?

在 SQL*此外,您可以声明一个变量并在 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

我不明白你问题中有关无法正常工作或使用通用命令的部分。如果你能澄清这些,我也许可以添加到我的答案中。