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
我不明白你问题中有关无法正常工作或使用通用命令的部分。如果你能澄清这些,我也许可以添加到我的答案中。
我得到了以下脚本,它实际上执行以下操作,它使用电子邮件地址
- 搜索该用户
- 搜索来自该用户的消息
- 搜索该用户的条目
- 将调查结果放入文件
目前正在运行,但现在我想执行以下操作:
将 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
我不明白你问题中有关无法正常工作或使用通用命令的部分。如果你能澄清这些,我也许可以添加到我的答案中。