PL / SQL 코드에서 사용할 수있는 메모리 내 배열 변수를 만들고 싶습니다. 순수 메모리를 사용하는 Oracle PL / SQL에서 콜렉션을 찾을 수 없습니다. 모두 콜렉션과 연관된 것으로 보입니다. PL / SQL (C # 구문)에서 이와 같은 작업을 수행하려고합니다.
string[] arrayvalues = new string[3] {"Matt", "Joanne", "Robert"};
편집 : Oracle : 9i
PL / SQL 코드에서 사용할 수있는 메모리 내 배열 변수를 만들고 싶습니다. 순수 메모리를 사용하는 Oracle PL / SQL에서 콜렉션을 찾을 수 없습니다. 모두 콜렉션과 연관된 것으로 보입니다. PL / SQL (C # 구문)에서 이와 같은 작업을 수행하려고합니다.
string[] arrayvalues = new string[3] {"Matt", "Joanne", "Robert"};
편집 : Oracle : 9i
답변:
고정 크기 배열에 VARRAY를 사용할 수 있습니다.
declare
type array_t is varray(3) of varchar2(10);
array array_t := array_t('Matt', 'Joanne', 'Robert');
begin
for i in 1..array.count loop
dbms_output.put_line(array(i));
end loop;
end;
무한 배열의 경우 TABLE :
...
type array_t is table of varchar2(10);
...
여기서 "테이블"이라는 단어는 데이터베이스 테이블과는 관련이 없습니다. 두 방법 모두 메모리 내 배열을 만듭니다.
이 중 하나를 사용하면 요소를 추가하기 전에 컬렉션을 초기화하고 확장해야합니다.
declare
type array_t is varray(3) of varchar2(10);
array array_t := array_t(); -- Initialise it
begin
for i in 1..3 loop
array.extend(); -- Extend it
array(i) := 'x';
end loop;
end;
첫 번째 인덱스는 0이 아닌 1입니다.
my_array(0) := 'some string';
array.extend();
EXTEND는 슬롯을 일반 경계 배열에 추가합니까? 이 경우 크기가 이미 동적이므로 테이블 (바운드되지 않은 배열)이 필요하지 않습니다.
varray(3)
4 번 연장하려고하면 어떻게되는지 확인 했습니다. "첨자 한계를 벗어났습니다"오류가 발생합니다.
array.extend()
. 내가 본 모든 것은 이것을 보여주지 않았으며 하나 이상의 항목을 추가 할 수있는 가장 중요한 부분이었습니다 (내 이해에서 여전히 SQL의 배열에 익숙 함).
BINARY_INTEGER에 의해 색인화 된 메모리 내 변수 길이 배열을 보유하도록 DBMS_SQL.VARCHAR2_TABLE을 선언 할 수 있습니다.
DECLARE
name_array dbms_sql.varchar2_table;
BEGIN
name_array(1) := 'Tim';
name_array(2) := 'Daisy';
name_array(3) := 'Mike';
name_array(4) := 'Marsha';
--
FOR i IN name_array.FIRST .. name_array.LAST
LOOP
-- Do something
END LOOP;
END;
메모리 내 배열이므로 연관 배열 (PL / SQL 테이블이라고 함)을 사용할 수 있습니다.
DECLARE
TYPE employee_arraytype IS TABLE OF employee%ROWTYPE
INDEX BY PLS_INTEGER;
employee_array employee_arraytype;
BEGIN
SELECT *
BULK COLLECT INTO employee_array
FROM employee
WHERE department = 10;
--
FOR i IN employee_array.FIRST .. employee_array.LAST
LOOP
-- Do something
END LOOP;
END;
연관 배열은 모든 레코드 유형 구성을 보유 할 수 있습니다.
도움이 되길 바랍니다, 올리
VALUE_ERROR
컬렉션이 비어 있으면 반복 조건이 발생합니다. 차라리 사용하는 제안 FOR i IN 1 .. employee_array.COUNT
이 경우
sys.odcivarchar2list
: 아래 당신은 또한 기능 PARAM 기본 초기화를위한 예를 들면 손에 생성자가 있다는 장점이 있습니다sys.odcivarchar2list('val1','val2')
또 다른 해결책은 Oracle Collection을 해시 맵으로 사용하는 것입니다.
declare
-- create a type for your "Array" - it can be of any kind, record might be useful
type hash_map is table of varchar2(1000) index by varchar2(30);
my_hmap hash_map ;
-- i will be your iterator: it must be of the index's type
i varchar2(30);
begin
my_hmap('a') := 'apple';
my_hmap('b') := 'box';
my_hmap('c') := 'crow';
-- then how you use it:
dbms_output.put_line (my_hmap('c')) ;
-- or to loop on every element - it's a "collection"
i := my_hmap.FIRST;
while (i is not null) loop
dbms_output.put_line(my_hmap(i));
i := my_hmap.NEXT(i);
end loop;
end;
당신은 또한 사용할 수 있습니다 oracle defined collection
DECLARE
arrayvalues sys.odcivarchar2list;
BEGIN
arrayvalues := sys.odcivarchar2list('Matt','Joanne','Robert');
FOR x IN ( SELECT m.column_value m_value
FROM table(arrayvalues) m )
LOOP
dbms_output.put_line (x.m_value||' is a good pal');
END LOOP;
END;
메모리 내 배열을 사용합니다. 그러나 .COUNT
uziberia가 제안한 개선 사항으로 :
DECLARE
TYPE t_people IS TABLE OF varchar2(10) INDEX BY PLS_INTEGER;
arrayvalues t_people;
BEGIN
SELECT *
BULK COLLECT INTO arrayvalues
FROM (select 'Matt' m_value from dual union all
select 'Joanne' from dual union all
select 'Robert' from dual
)
;
--
FOR i IN 1 .. arrayvalues.COUNT
LOOP
dbms_output.put_line(arrayvalues(i)||' is my friend');
END LOOP;
END;
또 다른 해결책은 @Jchomel과 같은 Hashmap을 사용하는 것 입니다.
NB :
Oracle 12c를 사용하면 지금 바로 배열을 쿼리 할 수도 있습니다 !
다음과 같은 샘플 프로그램 및 링크 https://oracle-concepts-learning.blogspot.com/
plsql 테이블 또는 관련 배열.
DECLARE
TYPE salary IS TABLE OF NUMBER INDEX BY VARCHAR2(20);
salary_list salary;
name VARCHAR2(20);
BEGIN
-- adding elements to the table
salary_list('Rajnish') := 62000; salary_list('Minakshi') := 75000;
salary_list('Martin') := 100000; salary_list('James') := 78000;
-- printing the table name := salary_list.FIRST; WHILE name IS NOT null
LOOP
dbms_output.put_line ('Salary of ' || name || ' is ' ||
TO_CHAR(salary_list(name)));
name := salary_list.NEXT(name);
END LOOP;
END;
/