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数据库,但如果可能的话,我希望使
- 搜索该用户
- 搜索来自该用户的消息
- 搜索该用户的条目
- 将调查结果归档
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