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

Oracle 我可以直接从用户接受PL/SQL中VARRAY中的值吗?,oracle,plsql,sqlplus,varray,Oracle,Plsql,Sqlplus,Varray,我正在寻找下面这样的东西,目的是从用户本身接受数组变量,我知道下面的代码是错误的,但它只是为了给出我的要求的想法 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(

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

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很难实现,但我们可以在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实现呢?如果是这样,你会更轻松


请参阅:

是否要在PL/SQL函数/过程中传递数组?PL/SQL是一种服务器端语言,因此没有接受用户输入的工具。