我希望能够根据用户输入在表中插入可变数量的行吗?例如
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是否有数组?
由于
答案 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脚本 - 你能不能再添加一些功能”而且在你知道之前你正在建造一座带有棚屋基础的摩天大楼。