Oracle 如何询问用户是否希望使用batch/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

我目前正在制作一个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 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