我可以直接从用户接受 PL/SQL 中 VARRAY 中的值吗?

Posted

技术标签:

【中文标题】我可以直接从用户接受 PL/SQL 中 VARRAY 中的值吗?【英文标题】:Can I accept values in a VARRAY in PL/SQL directly from the user? 【发布时间】:2013-08-15 19:57:46 【问题描述】:

为了从用户本身接受数组变量,我正在寻找类似下面的东西,我知道下面的代码是错误的,但这只是为了给出我的要求的想法。

DECLARE 
  type names_array IS VARRAY(5) OF VARCHAR2(10); 
  names names_array;
BEGIN 
  FOR i in 1..5 LOOP
     accept names(i);
  END LOOP;

  FOR j in 1 .. 5 LOOP 
     dbms_output.put_line(names(j)); 
  END LOOP; 
END; 
/

【问题讨论】:

你想在 PL/SQL 函数/过程中传递一个数组吗? PL/SQL 是一种服务器端语言,因此无法接受用户输入。 【参考方案1】:

使用 PL/SQL 实现会很困难。但是我们可以在 SQL Plus 中使用替换变量。

我创建了两个 sql 脚本: 第一个是 main.sql,另一个是 script_insert.sql:

[oracle@db input]$ cat main.sql
accept colu prompt "Please enter value, enter 'done' when no more values: "
set term off verify off
column script new_value v_script
select case '&colu'
        when 'done' then ''
        else '@script_insert &colu'
        end as script
from dual;
set term on
@&v_script.
[oracle@db input]$ 

[oracle@db input]$ cat script_insert.sql
insert into array_table values ('&1');
@main
[oracle@db input]$ 

接下来我们应该创建一个不使用数组的表:

SQL> create table array_table(colu varchar2(30));

Table created.

SQL>

现在,我们可以执行它了:

SQL> @main
Please enter value, enter 'done' when no more values: A

1 row created.

Please enter value, enter 'done' when no more values: B

1 row created.

Please enter value, enter 'done' when no more values: Hello

1 row created.

Please enter value, enter 'done' when no more values: "Hello World"

1 row created.

Please enter value, enter 'done' when no more values: done
SQL> select * from array_table;

COLU
------------------------------
A
B
Hello
Hello World

SQL>

我们知道了,你应该使用数组以外的表,因为只有 PL/SQL 支持它。你不应该在循环中使用替换变量! 最后,你为什么不在你的程序中通过C/Python/Java来实现呢?如果是这样,你会更轻松。

参考:How to create a menu in SQLPlus or PL/SQL

【讨论】:

以上是关于我可以直接从用户接受 PL/SQL 中 VARRAY 中的值吗?的主要内容,如果未能解决你的问题,请参考以下文章

接受用户输入并设置分配给变量 PL/SQL

尝试创建一个在 pl/sql 中接受用户输入的过程 [重复]

PL/SQL自定义函数

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

我想在 PL SQL 中接受用户输入并将其传递给程序,给我看一个简单的程序吗?

PL/SQL:如何从表中选择数据并输入到包接受数组类型?