如何循环接受与PL / SQL用户输入?如何循环接受与PL / SQL用户输入?(how to lo

2019-05-12 07:08发布

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

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

谢谢

Answer 1:

正如其他人所说,PL / SQL本身并不是适合这个任务,你需要在顶部的用户界面与最终用户交互。 但是,如果你有一个真正的需要在SQL Plus来做到这一点,就可以用我所描述的技术, 这太问题 。

您需要创建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另外,您可以像这样运行它:

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!



Answer 2:

我想你捶用螺丝刀钉子。

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



Answer 3:

最有可能的,你不能,至少在没有写某种客户端应用程序(而非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

可怕的丑,当然,但它“作品”的“作品”的定义一些



Answer 4:

也许你可以有你的用户输入一个逗号分隔值列表?

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

然后处理您PLSQL块中的字符串。



Answer 5:

我建议的Oracle Application Express。 它是免费的,而且死容易很快速地构建简单的应用程序。

当然,这可能是矫枉过正为您的网站非常简单的要求,但很可能其他人会回来,并说“我喜欢你的小SQL * Plus脚本 - 可能你只需要添加一些更多的功能,以它”,你知道它在你面前”重新建立一个摩天大楼窝棚的基础。



文章来源: how to loop accepting user input with pl/sql?