Oracle 如何询问用户是否希望使用batch/sql文件提交/回滚更改
我目前正在制作一个SQL脚本,在数据库中进行一些更改,我希望用户确认每个步骤的结果 代码: 这些更改是有效的,但当我尝试获取验证(接受响应部分)时,总是会出现错误: 谁能告诉我我做错了什么Oracle 如何询问用户是否希望使用batch/sql文件提交/回滚更改,oracle,sqlplus,Oracle,Sqlplus,我目前正在制作一个SQL脚本,在数据库中进行一些更改,我希望用户确认每个步骤的结果 代码: 这些更改是有效的,但当我尝试获取验证(接受响应部分)时,总是会出现错误: 谁能告诉我我做错了什么 使用case时出错: Enter value for userreply: old 7: case &userReply when 'y' then exit commit new 7: case y when 'y' then exit commit ACCEPT userReply PR
使用case时出错:
Enter value for userreply: old 7: case &userReply when 'y' then exit commit
new 7: case y when 'y' then exit commit
ACCEPT userReply PROMPT 'Result ok? - y/n: '
*
ERROR at line 6:
ORA-06550: line 6, column 8:
PLS-00103: Encountered the symbol "USERREPLY" when expecting one of the
following:
:= . ( @ % ;
谢谢好的,作为一个有趣的练习,我已经用SQL脚本实现了您的需求。我不推荐这种方法,它太复杂了,坦白说有点傻!最好的方法是在您选择的开发环境中编写应用程序-可以是APEX、Forms、ASP、Pro*C 我必须创建一些脚本: 1) do_update.sql:
-- make changes
update plan_table
set statement_id = '&1.'
where statement_id = '&2.';
-- check if correct
select statement_id from plan_table;
-- ask confirmation
ACCEPT response CHAR DEFAULT 'n' PROMPT 'Result ok? - y/n: ';
-- Based on confirmation set prefix to 'do' or 'dont'
set term off verify off
column prefix new_value prefix
select case upper('&response.')
when 'Y' then 'do'
else 'dont'
end as prefix
from dual;
set term on
-- don't make changes
2) dont_update.sql:
-- make changes
update plan_table
set statement_id = '&1.'
where statement_id = '&2.';
-- check if correct
select statement_id from plan_table;
-- ask confirmation
ACCEPT response CHAR DEFAULT 'n' PROMPT 'Result ok? - y/n: ';
-- Based on confirmation set prefix to 'do' or 'dont'
set term off verify off
column prefix new_value prefix
select case upper('&response.')
when 'Y' then 'do'
else 'dont'
end as prefix
from dual;
set term on
-- don't make changes
3) do_commit.sql:
commit;
rollback;
4) dont_commit.sql:
commit;
rollback;
5) main.sql:
@@do_update 3 2
@@&prefix._update 4 3
@@&prefix._commit
SQL> @main
1 row updated.
STATEMENT_ID
------------------------------
1
3
3
Result ok? - y/n: y
2 rows updated.
STATEMENT_ID
------------------------------
1
4
4
Result ok? - y/n: y
Commit complete.
现在在SQL Plus中,只需运行main.SQL:
@@do_update 3 2
@@&prefix._update 4 3
@@&prefix._commit
SQL> @main
1 row updated.
STATEMENT_ID
------------------------------
1
3
3
Result ok? - y/n: y
2 rows updated.
STATEMENT_ID
------------------------------
1
4
4
Result ok? - y/n: y
Commit complete.
当然,这只是基于您的简单示例。对于更现实的情况,脚本的数量会大得多。我不会这么做 好的,作为一个有趣的练习,我已经用SQL脚本实现了您的需求。我不推荐这种方法,它太复杂了,坦白说有点傻!最好的方法是在您选择的开发环境中编写应用程序-可以是APEX、Forms、ASP、Pro*C 我必须创建一些脚本: 1) do_update.sql:
-- make changes
update plan_table
set statement_id = '&1.'
where statement_id = '&2.';
-- check if correct
select statement_id from plan_table;
-- ask confirmation
ACCEPT response CHAR DEFAULT 'n' PROMPT 'Result ok? - y/n: ';
-- Based on confirmation set prefix to 'do' or 'dont'
set term off verify off
column prefix new_value prefix
select case upper('&response.')
when 'Y' then 'do'
else 'dont'
end as prefix
from dual;
set term on
-- don't make changes
2) dont_update.sql:
-- make changes
update plan_table
set statement_id = '&1.'
where statement_id = '&2.';
-- check if correct
select statement_id from plan_table;
-- ask confirmation
ACCEPT response CHAR DEFAULT 'n' PROMPT 'Result ok? - y/n: ';
-- Based on confirmation set prefix to 'do' or 'dont'
set term off verify off
column prefix new_value prefix
select case upper('&response.')
when 'Y' then 'do'
else 'dont'
end as prefix
from dual;
set term on
-- don't make changes
3) do_commit.sql:
commit;
rollback;
4) dont_commit.sql:
commit;
rollback;
5) main.sql:
@@do_update 3 2
@@&prefix._update 4 3
@@&prefix._commit
SQL> @main
1 row updated.
STATEMENT_ID
------------------------------
1
3
3
Result ok? - y/n: y
2 rows updated.
STATEMENT_ID
------------------------------
1
4
4
Result ok? - y/n: y
Commit complete.
现在在SQL Plus中,只需运行main.SQL:
@@do_update 3 2
@@&prefix._update 4 3
@@&prefix._commit
SQL> @main
1 row updated.
STATEMENT_ID
------------------------------
1
3
3
Result ok? - y/n: y
2 rows updated.
STATEMENT_ID
------------------------------
1
4
4
Result ok? - y/n: y
Commit complete.
当然,这只是基于您的简单示例。对于更现实的情况,脚本的数量会大得多。我不会这么做 首先,您使用的是pl/sql语法。sql中没有条件子句。请尝试更正语法并开始使用pl/sql语法编写。
在我看来,逻辑是完全清楚的。首先,您是用pl/sql语法编写的。sql中没有条件子句。请尝试更正语法并开始使用pl/sql语法编写。
在我看来,逻辑是很清楚的。在SQL-only PL/SQL中没有
IF
语句。这在SQL Plus中很难实现,请参阅一些想法。@a_horse_with_no_name我尝试用case语句替换IF,但仍然出现错误。另外,SQL plus不是使用PL/SQL(它是oracle的产品)吗?如果PL/SQL专门用于存储过程(或函数),您是否可以在使用case语句后发布所得到的错误。常规SQL语句就是这样的:SQLOnly PL/SQL中没有IF
语句。这在SQL Plus中很难实现,请参阅以获取一些想法。@a_horse_with_no_name我尝试用case语句替换IF,但仍然出现错误。另外,SQL plus不是使用PL/SQL(它是oracle的产品)吗?如果PL/SQL专门用于存储过程(或函数),您是否可以在使用case语句后发布所得到的错误。常规SQL语句就是:SQL