如何用pl / sql循环接受用户输入?

时间:2009-12-08 23:40:44

标签: oracle plsql oracle10g sqlplus

我希望能够根据用户输入在表中插入可变数量的行吗?例如

Please enter value, enter "done" when no more values: value 1
Please enter value, enter "done" when no more values: value 2
Please enter value, enter "done" when no more values: done

2 Rows inserted successfully.

我不确定如何临时存储行,我不知道如何多次询问用户插入数据。 pl / sql是否有数组?

由于

5 个答案:

答案 0 :(得分:8)

正如其他人所说,仅PL / SQL不适用于此任务,您需要在顶部与最终用户进行交互。但是,如果您真的需要在SQL Plus中执行此操作,则可以使用我在this SO question中描述的技术。

您需要创建2个SQL Plus脚本:

1)执行单个插入的脚本,此处称为script_insert.sql:

insert into t1 values ('&1.');
@main

2)控制进程的脚本,这里称为main.sql:

accept selection prompt "Please enter value, enter 'done' when no more values: "

set term off verify off

column script new_value v_script

select case '&selection.'
       when 'done' then ''
       else '@script_insert &selection.'
       end as script
from dual;

set term on

@&v_script.

现在在SQL Plus中你可以像这样运行它:

SQL> select * from t1;

no rows selected

SQL> @main
Please enter value, enter 'done' when no more values: 1
Please enter value, enter 'done' when no more values: 2
Please enter value, enter 'done' when no more values: 3
Please enter value, enter 'done' when no more values: done
SQL> select * from t1;

        N1
----------
         1
         2
         3

让我重申,这表明它可以完成,我不会声称它是实现要求的好方法 - 除非它只是DBA或开发人员使用的临时工具。我永远不会将最终用户 SQL Plus作为UI!

答案 1 :(得分:3)

我觉得你用螺丝刀敲钉子。

使用Python脚本,PHP页面,Perl脚本,Java程序或任何其他可以访问Oracle的环境,您将获得更大的灵活性。

答案 2 :(得分:1)

最有可能的是,你不能,至少在没有编写某种客户端应用程序(不是SQL*Plus脚本)的情况下。 PL/SQL在服务器上运行,没有任何东西可以接受用户输入。 SQL*Plus在客户端上运行,但它没有循环结构。你不能混淆这两者,所以你不能有一个重复发生的PL / SQL循环提示用户输入,并根据传入的值进行INSERT。

最常见的是,人们通过使用您喜欢的脚本语言编写一个小的前端脚本来收集输入,然后发出适当的INSERT语句来解决这个问题。

如果你真的,真的想在SQL*Plus完成任务,那可能是可能的,但非常痛苦。你基本上必须构造一个无限循环,你抛出一个错误来逃避。例如

定义一个脚本a.sql(我碰巧将它存储在c:\ temp中)

whenever sqlerror exit;
accept x_val number prompt "Enter a value for x or -1 to stop  ";
INSERT INTO x( col1 ) values( :x_val );
BEGIN
    IF( &x_val = -1 )
    THEN
      commit;
      RAISE_APPLICATION_ERROR( -20001, 'Done' );
    END IF;
END;
/

@c:\temp\a.sql

然后在SQL*Plus

SQL> variable x_val number;
SQL> crate table x( col1 number );
SQL> truncate table x;

Table truncated.

SQL> @c:\temp\a.sql
Enter a value for x or -1 to stop  3

1 row created.

old   2:        IF( &x_val = -1 )
new   2:        IF(          3 = -1 )

PL/SQL procedure successfully completed.

Enter a value for x or -1 to stop  4

1 row created.

old   2:        IF( &x_val = -1 )
new   2:        IF(          4 = -1 )

PL/SQL procedure successfully completed.

Enter a value for x or -1 to stop  5

1 row created.

old   2:        IF( &x_val = -1 )
new   2:        IF(          5 = -1 )

PL/SQL procedure successfully completed.

Enter a value for x or -1 to stop  -1

1 row created.

old   2:        IF( &x_val = -1 )
new   2:        IF(         -1 = -1 )
BEGIN
*
ERROR at line 1:
ORA-20001: Done
ORA-06512: at line 4

当然可怕的丑陋,但它“适用于”某些“作品”的定义

答案 3 :(得分:0)

也许您可以让您的用户输入以逗号分隔的值列表?

请输入值:1,2,3,4,5

然后处理plsql块中的字符串。

答案 4 :(得分:0)

我推荐Oracle Application Express。它是免费的,很容易很快构建简单的应用程序。

当然,在这里你的极其简单的要求可能有些过分,但有可能会有人回来说“我喜欢你的小SQL * Plus脚本 - 你能不能再添加一些功能”而且在你知道之前你正在建造一座带有棚屋基础的摩天大楼。