Могу ли я принимать значения в VARRAY в PL/SQL напрямую от пользователя?

Я ищу что-то вроде ниже, чтобы принимать переменные массива от самого пользователя, я знаю, что приведенный ниже код неверен, но это просто для того, чтобы дать представление о моем требовании.

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; 
/

person user2555148    schedule 15.08.2013    source источник
comment
вы хотите передать массив в функции/процедуре PL/SQL?   -  person berkay    schedule 16.08.2013
comment
PL/SQL является серверным языком и поэтому не имеет средств для приема пользовательского ввода.   -  person Bob Jarvis - Reinstate Monica    schedule 16.08.2013


Ответы (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 в вашей программе? Если это так, вы будете более расслаблены.

См.:Как создать меню в SQLPlus или PL/SQL

person luolee.me    schedule 16.08.2013