我希望能够插入变量的行数到根据用户输入的表? 例如。
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有数组?
谢谢
正如其他人所说,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!
我想你捶用螺丝刀钉子。
你会使用Python脚本,PHP页面,Perl脚本,Java程序,或者可以访问Oracle任何其他环境中获得更大的灵活性。
最有可能的,你不能,至少在没有写某种客户端应用程序(而非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
可怕的丑,当然,但它“作品”的“作品”的定义一些
我建议的Oracle Application Express。 它是免费的,而且死容易很快速地构建简单的应用程序。
当然,这可能是矫枉过正为您的网站非常简单的要求,但很可能其他人会回来,并说“我喜欢你的小SQL * Plus脚本 - 可能你只需要添加一些更多的功能,以它”,你知道它在你面前”重新建立一个摩天大楼窝棚的基础。