2

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

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 有数组吗?

谢谢

4

5 回答 5

9

正如其他人所说,单独的 PL/SQL 不适合这项任务,您需要一个 UI 来与最终用户进行交互。但是,如果您确实需要在 SQL Plus 中执行此操作,则可以使用我在此 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!

于 2009-12-09T10:36:38.653 回答
3

我想你是在用螺丝刀敲钉子。

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

于 2009-12-09T00:33:34.517 回答
1

Maybe you can have your user enter a comma seperated list of values?

Please enter values: 1,2,3,4,5

Then process the string in your plsql block.

于 2009-12-09T06:34:42.337 回答
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

当然,丑得可怕,但它对于“作品”的某些定义“有效”

于 2009-12-09T00:36:27.817 回答
1

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

当然,对于您在这里极其简单的要求来说,这可能有点过头了,但很可能有人会回来说“我喜欢你的小 SQL*Plus 脚本——你能不能再给它添加一些功能”,然后在你知道它之前,你用棚屋地基重建一座摩天大楼。

于 2009-12-11T07:06:25.627 回答