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

SQL*Plus为子选择使用变量(保持假脱机工作),sql,oracle,variables,sqlplus,spool,Sql,Oracle,Variables,Sqlplus,Spool,我得到了下面的脚本,它使用一个电子邮件地址 搜索该用户 搜索来自该用户的消息 搜索该用户的条目 将调查结果归档 目前,这是工作,但现在我想做以下工作: 将子select“selectid FROM DBSCHEMA.USERS WHERE EMAIL=”&SEARCH“”替换为一种变量,以避免在脚本中多次放置(并执行)此语句 但我所做的一切都不起作用。(开始使用DECLARE block-假脱机不起作用,结束其他所有操作只是破坏了脚本) 我使用的是oracle数据库,但如果可能的话,我希望使

我得到了下面的脚本,它使用一个电子邮件地址

  • 搜索该用户
  • 搜索来自该用户的消息
  • 搜索该用户的条目
  • 将调查结果归档
目前,这是工作,但现在我想做以下工作: 将子select“
selectid FROM DBSCHEMA.USERS WHERE EMAIL=”&SEARCH“
”替换为一种变量,以避免在脚本中多次放置(并执行)此语句

但我所做的一切都不起作用。(开始使用DECLARE block-假脱机不起作用,结束其他所有操作只是破坏了脚本)
我使用的是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*Plus中,您可以声明一个变量并在PL/SQL中填充它,如下所示(我使用了HR演示模式):

(您不需要严格使用异常处理程序,但它将改进对无效或重复数据的处理。)

您还可以坚持使用
定义
变量:

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\u id
,您可以在查询中使用它:

select phone_number from employees where employee_id = &user_id;

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

我不理解你问题中关于不工作或使用通用命令的部分。如果你能澄清这些,我可能可以添加到我的答案中。

首先,使用声明的变量来保存电子邮件地址,比如
DECLARE Searched\u Email NVARCHAR2(256)
…其中EMAIL=Searched\u EMAIL。如果这样做有效,那么脚本就可以了,问题是您的提示管理,无论如何,这不是标准(和实际系统使用)的一部分SQL语言。@FDavidov:使用简单的define,即使没有promts,它也可以使用declare not。请发布两个版本:一个有效,一个无效。第二个版本终于可以使用了。第一个不起作用(不是在SQLDeveloper中,不是作为使用sqlplus运行的文件,不是输入到sqlplus中)-SP2-0552:Bind变量“user_id”未声明。第二个从文件运行(不在SQLDeveloper中)。但是,也许你可以解释一下“列用户id新值用户id”符号,或者给我一个更多关于这方面的文档(我发现很多其他文档对我不起作用)对不起,在复制和粘贴中遗漏了一行。我已经在我的答案中添加了
var user\u id number
new\u value
的内容记录在下面,但不清楚它的用途(他们希望您将其用于报告中的页面标题,因此所有关于
TTITLE
跳过页面的内容都在下面)。设置
列x新值y
后,替换变量
&y
将被名为
x
的任何列的查询返回的最后一个值填充。
select phone_number from employees where employee_id = &user_id;

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